pytensor 2.35.1__tar.gz → 2.36.1__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.35.1/pytensor.egg-info → pytensor-2.36.1}/PKG-INFO +4 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/creating_a_numba_jax_op.rst +1 -1
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/gallery/autodiff/vector_jacobian_product.ipynb +2 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/pyproject.toml +10 -5
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/_version.py +3 -3
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/bin/pytensor_cache.py +7 -1
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/compile/__init__.py +2 -1
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/compile/builders.py +7 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/compile/debugmode.py +4 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/compile/function/pfunc.py +21 -22
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/compile/io.py +1 -1
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/compile/mode.py +51 -80
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/compile/profiling.py +0 -1
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/configdefaults.py +21 -5
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/configparser.py +3 -1
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/gradient.py +5 -7
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/rewriting/basic.py +1 -1
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/basic.py +43 -14
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/c/basic.py +0 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/c/cmodule.py +3 -3
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/scalar.py +1 -1
- pytensor-2.36.1/pytensor/link/jax/dispatch/scan.py +251 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/sparse.py +1 -1
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/linker.py +16 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/ops.py +4 -3
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/mlx/dispatch/__init__.py +4 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/mlx/dispatch/blockwise.py +11 -4
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/mlx/dispatch/core.py +7 -4
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/mlx/dispatch/elemwise.py +20 -9
- pytensor-2.36.1/pytensor/link/mlx/dispatch/extra_ops.py +35 -0
- pytensor-2.36.1/pytensor/link/mlx/dispatch/nlinalg.py +69 -0
- pytensor-2.36.1/pytensor/link/mlx/dispatch/slinalg.py +84 -0
- pytensor-2.36.1/pytensor/link/mlx/dispatch/sort.py +38 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/mlx/linker.py +8 -0
- pytensor-2.36.1/pytensor/link/numba/cache.py +129 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/__init__.py +2 -0
- pytensor-2.36.1/pytensor/link/numba/dispatch/basic.py +571 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/blockwise.py +53 -30
- pytensor-2.36.1/pytensor/link/numba/dispatch/compile_ops.py +148 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/elemwise.py +294 -215
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/extra_ops.py +128 -119
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +14 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +22 -12
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +14 -13
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +5 -8
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +147 -64
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +8 -7
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/solve/general.py +11 -10
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +13 -9
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/solve/norm.py +4 -7
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/solve/posdef.py +16 -15
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +20 -19
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +8 -7
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +100 -39
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/utils.py +25 -15
- pytensor-2.36.1/pytensor/link/numba/dispatch/nlinalg.py +179 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/random.py +68 -34
- pytensor-2.36.1/pytensor/link/numba/dispatch/scalar.py +414 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/scan.py +107 -85
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/shape.py +12 -12
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/signal/conv.py +8 -6
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/slinalg.py +143 -56
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/sort.py +8 -6
- pytensor-2.36.1/pytensor/link/numba/dispatch/subtensor.py +655 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/tensor_basic.py +59 -58
- pytensor-2.36.1/pytensor/link/numba/dispatch/typed_list.py +236 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/vectorize_codegen.py +26 -23
- pytensor-2.36.1/pytensor/link/numba/linker.py +32 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/pytorch/dispatch/basic.py +0 -1
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/pytorch/dispatch/scalar.py +9 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/pytorch/linker.py +10 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/utils.py +26 -13
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/vm.py +7 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scalar/basic.py +23 -107
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scalar/loop.py +1 -4
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scalar/math.py +10 -8
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scan/basic.py +157 -155
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scan/checkpoints.py +12 -8
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scan/op.py +242 -179
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scan/rewriting.py +25 -17
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scan/utils.py +22 -16
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scan/views.py +93 -5
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/sparse/__init__.py +1 -0
- pytensor-2.36.1/pytensor/sparse/basic.py +1946 -0
- pytensor-2.36.1/pytensor/sparse/linalg.py +93 -0
- pytensor-2.36.1/pytensor/sparse/math.py +2038 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/sparse/rewriting.py +32 -38
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/sparse/sharedvar.py +2 -2
- pytensor-2.36.1/pytensor/sparse/variable.py +479 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/__init__.py +7 -1
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/_linalg/solve/tridiagonal.py +1 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/basic.py +10 -7
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/blas.py +2 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/blas_c.py +24 -15
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/blockwise.py +5 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/elemwise.py +11 -13
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/elemwise_cgen.py +2 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/extra_ops.py +7 -9
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/fourier.py +2 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/math.py +8 -5
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/nlinalg.py +32 -14
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/optimize.py +158 -107
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/pad.py +2 -1
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/random/op.py +12 -3
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/random/rewriting/basic.py +17 -14
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/random/rewriting/numba.py +4 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/random/utils.py +26 -11
- pytensor-2.36.1/pytensor/tensor/reshape.py +524 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/__init__.py +1 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/basic.py +48 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/elemwise.py +10 -16
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/math.py +10 -3
- pytensor-2.36.1/pytensor/tensor/rewriting/reshape.py +49 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/shape.py +4 -4
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/subtensor.py +19 -179
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/uncanonicalize.py +1 -1
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/shape.py +26 -9
- pytensor-2.36.1/pytensor/tensor/signal/__init__.py +4 -0
- pytensor-2.36.1/pytensor/tensor/signal/conv.py +348 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/slinalg.py +21 -9
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/sort.py +10 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/subtensor.py +7 -3
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/variable.py +0 -16
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/xlogx.py +2 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/typed_list/basic.py +15 -11
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/utils.py +2 -3
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/math.py +2 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/reduction.py +2 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/rewriting/reduction.py +2 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/type.py +0 -6
- {pytensor-2.35.1 → pytensor-2.36.1/pytensor.egg-info}/PKG-INFO +4 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor.egg-info/SOURCES.txt +12 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor.egg-info/requires.txt +1 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/scripts/mypy-failing.txt +1 -1
- {pytensor-2.35.1 → pytensor-2.36.1}/tests/test_config.py +5 -2
- {pytensor-2.35.1 → pytensor-2.36.1}/tests/test_printing.py +3 -4
- {pytensor-2.35.1 → pytensor-2.36.1}/tests/test_raise_op.py +6 -1
- pytensor-2.35.1/pytensor/link/jax/dispatch/scan.py +0 -202
- pytensor-2.35.1/pytensor/link/numba/dispatch/basic.py +0 -383
- pytensor-2.35.1/pytensor/link/numba/dispatch/nlinalg.py +0 -144
- pytensor-2.35.1/pytensor/link/numba/dispatch/scalar.py +0 -317
- pytensor-2.35.1/pytensor/link/numba/dispatch/subtensor.py +0 -448
- pytensor-2.35.1/pytensor/link/numba/linker.py +0 -19
- pytensor-2.35.1/pytensor/sparse/basic.py +0 -4343
- pytensor-2.35.1/pytensor/tensor/inplace.py +0 -427
- pytensor-2.35.1/pytensor/tensor/io.py +0 -94
- pytensor-2.35.1/pytensor/tensor/signal/__init__.py +0 -4
- pytensor-2.35.1/pytensor/tensor/signal/conv.py +0 -213
- {pytensor-2.35.1 → pytensor-2.36.1}/LICENSE.txt +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/MANIFEST.in +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/README.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/.templates/layout.html +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/.templates/nb-badges.html +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/LICENSE.txt +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/README.md +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/acknowledgement.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/bcast.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/bcast.svg +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/blog.md +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/conf.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/core_development_guide.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/css.inc +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/dev_start_guide.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/environment.yml +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/apply.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/apply.svg +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/apply2.svg +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/ctype.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/extending_faq.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/graphstructures.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/index.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/inplace.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/op.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/other_ops.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/pipeline.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/scan.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/tips.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/type.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/unittest.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/extending/using_params.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/faq.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/gallery/optimize/root.ipynb +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/gallery/page_footer.md +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/glossary.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/images/Elman_srnn.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/images/PyTensor.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/images/binder.svg +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/images/blocksparse.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/images/colab.svg +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/images/github.svg +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/images/lstm.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/images/talk2010.gif +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/images/talk2010.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/index.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/install.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/internal/how_to_release.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/internal/index.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/introduction.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/compile/function.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/compile/index.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/compile/io.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/compile/mode.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/compile/ops.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/compile/shared.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/config.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/index.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/graph/features.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/graph/graph.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/graph/index.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/graph/op.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/graph/replace.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/graph/type.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/graph/utils.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/index.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/printing.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/scalar/index.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/scan.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/sparse/index.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/basic.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/bcast.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/conv.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/fft.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/functional.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/index.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/io.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/optimize.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/random/distributions.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/random/index.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/tensor/utils.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/typed_list.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/xtensor/index.md +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/xtensor/linalg.md +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/xtensor/math.md +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/xtensor/module_functions.md +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/xtensor/random.md +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/library/xtensor/type.md +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/links.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/optimizations.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/pylintrc +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/robots.txt +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/troubleshooting.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/adding.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/apply.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/apply.svg +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/bcast.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/conditions.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/examples.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/gradients.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/index.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/logistic.gp +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/logistic.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/loop.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/modes.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/prng.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/profiling.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/sparse.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/doc/user_guide.rst +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/bin/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/breakpoint.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/compile/compiledir.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/compile/compilelock.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/compile/function/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/compile/function/types.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/compile/monitormode.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/compile/nanguardmode.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/compile/ops.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/d3viz/html/template.html +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/basic.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/features.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/fg.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/null_type.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/op.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/replace.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/traversal.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/type.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/graph/utils.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/ifelse.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/ipython.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/c/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/c/cutils.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/c/cvm.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/c/interface.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/c/op.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/c/params_type.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/c/type.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/slinalg.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/mlx/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/mlx/dispatch/basic.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/mlx/dispatch/math.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/mlx/dispatch/shape.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/numba/dispatch/sparse.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/pytorch/dispatch/shape.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/pytorch/dispatch/slinalg.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/misc/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/misc/check_blas.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/misc/frozendict.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/npy_2_compat.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/printing.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/py.typed +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/raise_op.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scalar/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scan/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/sparse/type.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/sparse/utils.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/_linalg/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/_linalg/solve/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/_linalg/solve/rewriting.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/blas_headers.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/c_code/dimshuffle.c +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/conv/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/conv/abstract_conv.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/einsum.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/fft.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/functional.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/linalg.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/random/type.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/random/var.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/blas.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/linalg.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/special.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/type.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/type_other.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/utils.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/tensor/var.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/typed_list/type.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/updates.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/basic.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/indexing.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/linalg.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/random.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/rewriting/__init__.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/rewriting/basic.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/rewriting/indexing.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/rewriting/math.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/rewriting/shape.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/rewriting/utils.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/rewriting/vectorization.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/shape.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor/xtensor/vectorization.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/setup.cfg +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/setup.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/tests/test_breakpoint.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/tests/test_gradient.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/tests/test_ifelse.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/tests/test_rop.py +0 -0
- {pytensor-2.35.1 → pytensor-2.36.1}/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.36.1
|
|
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
|
|
@@ -24,12 +24,14 @@ Classifier: Programming Language :: Python :: 3
|
|
|
24
24
|
Classifier: Programming Language :: Python :: 3.11
|
|
25
25
|
Classifier: Programming Language :: Python :: 3.12
|
|
26
26
|
Classifier: Programming Language :: Python :: 3.13
|
|
27
|
-
|
|
27
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
28
|
+
Requires-Python: <3.15,>=3.11
|
|
28
29
|
Description-Content-Type: text/x-rst
|
|
29
30
|
License-File: LICENSE.txt
|
|
30
31
|
Requires-Dist: setuptools>=59.0.0
|
|
31
32
|
Requires-Dist: scipy<2,>=1
|
|
32
33
|
Requires-Dist: numpy>=2.0
|
|
34
|
+
Requires-Dist: numba<1,>0.57
|
|
33
35
|
Requires-Dist: filelock>=3.15
|
|
34
36
|
Requires-Dist: etuples
|
|
35
37
|
Requires-Dist: logical-unification
|
|
@@ -228,7 +228,7 @@ Here's an example for :class:`DimShuffle`:
|
|
|
228
228
|
# E No match.
|
|
229
229
|
# ...(on this line)...
|
|
230
230
|
# E shuffle_shape = res.shape[: len(shuffle)]
|
|
231
|
-
@numba_basic.numba_njit
|
|
231
|
+
@numba_basic.numba_njit
|
|
232
232
|
def dimshuffle(x):
|
|
233
233
|
return dimshuffle_inner(np.asarray(x), shuffle)
|
|
234
234
|
|
|
@@ -389,7 +389,7 @@
|
|
|
389
389
|
"1 & 1 & 0 \\\\\n",
|
|
390
390
|
"1 & 1 & 1 \\\\\n",
|
|
391
391
|
"\\end{pmatrix} = \\begin{pmatrix}\n",
|
|
392
|
-
"v_1 +
|
|
392
|
+
"v_1 + v_2 + v_3 \\\\ v_2 + v_3 \\\\ v_3\n",
|
|
393
393
|
"\\end{pmatrix}\n",
|
|
394
394
|
"$$"
|
|
395
395
|
]
|
|
@@ -661,7 +661,7 @@
|
|
|
661
661
|
"source": [
|
|
662
662
|
"$$\n",
|
|
663
663
|
"v^T \\cdot J = \\begin{pmatrix}\n",
|
|
664
|
-
"v_1 \\\\ v_2 \\\\ v_3 \\\\
|
|
664
|
+
"v_1 \\\\ v_2 \\\\ v_3 \\\\ v_4\n",
|
|
665
665
|
"\\end{pmatrix}^T \\cdot \\begin{pmatrix}\n",
|
|
666
666
|
"x_1 & 0 \\\\\n",
|
|
667
667
|
"x_2 & x_1 \\\\\n",
|
|
@@ -10,7 +10,7 @@ build-backend = "setuptools.build_meta"
|
|
|
10
10
|
[project]
|
|
11
11
|
name = "pytensor"
|
|
12
12
|
dynamic = ['version']
|
|
13
|
-
requires-python = ">=3.11,<3.
|
|
13
|
+
requires-python = ">=3.11,<3.15"
|
|
14
14
|
authors = [{ name = "pymc-devs", email = "pymc.devs@gmail.com" }]
|
|
15
15
|
description = "Optimizing compiler for evaluating mathematical expressions on CPUs and GPUs."
|
|
16
16
|
readme = "README.rst"
|
|
@@ -33,6 +33,7 @@ classifiers = [
|
|
|
33
33
|
"Programming Language :: Python :: 3.11",
|
|
34
34
|
"Programming Language :: Python :: 3.12",
|
|
35
35
|
"Programming Language :: Python :: 3.13",
|
|
36
|
+
"Programming Language :: Python :: 3.14",
|
|
36
37
|
]
|
|
37
38
|
|
|
38
39
|
keywords = [
|
|
@@ -49,6 +50,7 @@ dependencies = [
|
|
|
49
50
|
"setuptools>=59.0.0",
|
|
50
51
|
"scipy>=1,<2",
|
|
51
52
|
"numpy>=2.0",
|
|
53
|
+
"numba>0.57,<1",
|
|
52
54
|
"filelock>=3.15",
|
|
53
55
|
"etuples",
|
|
54
56
|
"logical-unification",
|
|
@@ -120,6 +122,9 @@ tag_prefix = "rel-"
|
|
|
120
122
|
addopts = "--durations=50 --doctest-modules --ignore=pytensor/link --ignore=pytensor/misc/check_duplicate_key.py --ignore=pytensor/ipython.py"
|
|
121
123
|
testpaths = ["pytensor/", "tests/"]
|
|
122
124
|
xfail_strict = true
|
|
125
|
+
filterwarnings =[
|
|
126
|
+
'ignore:^Numba will use object mode to run.*perform method\.:UserWarning',
|
|
127
|
+
]
|
|
123
128
|
|
|
124
129
|
[tool.ruff]
|
|
125
130
|
line-length = 88
|
|
@@ -150,7 +155,7 @@ lines-after-imports = 2
|
|
|
150
155
|
"pytensor/misc/check_duplicate_key.py" = ["T201"]
|
|
151
156
|
"pytensor/misc/check_blas.py" = ["T201"]
|
|
152
157
|
"pytensor/bin/pytensor_cache.py" = ["T201"]
|
|
153
|
-
# For the tests we skip because `pytest.importorskip` is used:
|
|
158
|
+
# For the tests we skip `E402` because `pytest.importorskip` is used:
|
|
154
159
|
"tests/link/jax/test_scalar.py" = ["E402"]
|
|
155
160
|
"tests/link/jax/test_tensor_basic.py" = ["E402"]
|
|
156
161
|
"tests/link/numba/test_basic.py" = ["E402"]
|
|
@@ -182,12 +187,12 @@ files = ["pytensor", "tests"]
|
|
|
182
187
|
build = "*"
|
|
183
188
|
# Uncomment to skip builds that compile but fail when trying to test (maybe due to incompatibility with runner)
|
|
184
189
|
# archs = ["auto64"]
|
|
185
|
-
# Disable any-platform (pp*),
|
|
190
|
+
# Disable any-platform (pp*), 32-bit builds, and free-threaded builds (cp*t-*)
|
|
186
191
|
# Additional options to consider: "*musllinux*"
|
|
187
|
-
skip = ["pp*", "*-win32", "*-manylinux_i686"]
|
|
192
|
+
skip = ["pp*", "*-win32", "*-manylinux_i686", "cp*t-*"]
|
|
188
193
|
build-frontend = "build"
|
|
189
194
|
test-command = 'python -c "import pytensor; print(pytensor.__version__); from pytensor.scan import scan_perform; print(scan_perform.get_version())"'
|
|
190
|
-
test-skip = ["
|
|
195
|
+
test-skip = ["*musllinux*", "*i686*"]
|
|
191
196
|
|
|
192
197
|
# Testing seems to be running into issues locating libs where expected
|
|
193
198
|
# test-requires = ["pytest", "numba", "jax", "jaxlib"]
|
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-
|
|
11
|
+
"date": "2025-12-21T14:56:52+0000",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.
|
|
14
|
+
"full-revisionid": "409a4b2a02e64acc0ca12cd0e046e99fd6f535b9",
|
|
15
|
+
"version": "2.36.1"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import os
|
|
3
|
+
import shutil
|
|
3
4
|
import sys
|
|
4
5
|
from pathlib import Path
|
|
5
6
|
|
|
@@ -74,7 +75,10 @@ def main():
|
|
|
74
75
|
'You can also call "pytensor-cache purge" to '
|
|
75
76
|
"remove everything from that directory."
|
|
76
77
|
)
|
|
77
|
-
_logger.debug(f"Remaining elements ({len(items)}): {
|
|
78
|
+
_logger.debug(f"Remaining elements ({len(items)}): {items}")
|
|
79
|
+
numba_cache_dir: Path = config.base_compiledir / "numba"
|
|
80
|
+
shutil.rmtree(numba_cache_dir, ignore_errors=True)
|
|
81
|
+
|
|
78
82
|
elif sys.argv[1] == "list":
|
|
79
83
|
pytensor.compile.compiledir.print_compiledir_content()
|
|
80
84
|
elif sys.argv[1] == "cleanup":
|
|
@@ -86,6 +90,8 @@ def main():
|
|
|
86
90
|
print("Lock successfully removed!")
|
|
87
91
|
elif sys.argv[1] == "purge":
|
|
88
92
|
pytensor.compile.compiledir.compiledir_purge()
|
|
93
|
+
numba_cache_dir: Path = config.base_compiledir / "numba"
|
|
94
|
+
shutil.rmtree(numba_cache_dir, ignore_errors=True)
|
|
89
95
|
elif sys.argv[1] == "basecompiledir":
|
|
90
96
|
# Simply print the base_compiledir
|
|
91
97
|
print(pytensor.config.base_compiledir)
|
|
@@ -17,8 +17,8 @@ from pytensor.compile.function.types import (
|
|
|
17
17
|
)
|
|
18
18
|
from pytensor.compile.io import In, Out, SymbolicInput, SymbolicOutput
|
|
19
19
|
from pytensor.compile.mode import (
|
|
20
|
+
CVM,
|
|
20
21
|
FAST_COMPILE,
|
|
21
|
-
FAST_RUN,
|
|
22
22
|
JAX,
|
|
23
23
|
NUMBA,
|
|
24
24
|
OPT_FAST_COMPILE,
|
|
@@ -33,6 +33,7 @@ from pytensor.compile.mode import (
|
|
|
33
33
|
PYTORCH,
|
|
34
34
|
AddDestroyHandler,
|
|
35
35
|
AddFeatureOptimizer,
|
|
36
|
+
C,
|
|
36
37
|
Mode,
|
|
37
38
|
PrintCurrentFunctionGraph,
|
|
38
39
|
get_default_mode,
|
|
@@ -4,6 +4,7 @@ import warnings
|
|
|
4
4
|
from collections.abc import Callable, Sequence
|
|
5
5
|
from copy import copy
|
|
6
6
|
from functools import partial
|
|
7
|
+
from itertools import chain
|
|
7
8
|
from typing import Union, cast
|
|
8
9
|
|
|
9
10
|
from pytensor.compile.function import function
|
|
@@ -47,11 +48,15 @@ def infer_shape(outs, inputs, input_shapes):
|
|
|
47
48
|
assert len(inp_shp) == inp.type.ndim
|
|
48
49
|
|
|
49
50
|
shape_feature = ShapeFeature()
|
|
50
|
-
|
|
51
|
+
fgraph = FunctionGraph([], [], features=[shape_feature])
|
|
52
|
+
for v in chain.from_iterable(s for s in input_shapes if s is not None):
|
|
53
|
+
# Import input_shape nodes, as for some graphs ShapeFeature assumes these were seen before
|
|
54
|
+
if (node := v.owner) is not None:
|
|
55
|
+
fgraph.import_node(node, import_missing=True)
|
|
51
56
|
|
|
52
57
|
# Initialize shape_of with the input shapes
|
|
53
58
|
for inp, inp_shp in zip(inputs, input_shapes, strict=True):
|
|
54
|
-
shape_feature.set_shape(inp, inp_shp)
|
|
59
|
+
shape_feature.set_shape(inp, inp_shp, override=True)
|
|
55
60
|
|
|
56
61
|
def local_traverse(out):
|
|
57
62
|
"""
|
|
@@ -1331,7 +1331,11 @@ default_make_thunk = [get_unbound_function(COp.make_thunk)]
|
|
|
1331
1331
|
# the external requirements of the .linker attribute of a mode
|
|
1332
1332
|
# 1) it's a class instance
|
|
1333
1333
|
# 2) it a has a .clone() method
|
|
1334
|
+
# 3) it has required_rewrites and incompatible_rewrites class attributes
|
|
1334
1335
|
class _DummyLinker:
|
|
1336
|
+
required_rewrites = ()
|
|
1337
|
+
incompatible_rewrites = ()
|
|
1338
|
+
|
|
1335
1339
|
# This is not a real linker anyway
|
|
1336
1340
|
def clone(self, allow_gc=None):
|
|
1337
1341
|
return self
|
|
@@ -453,7 +453,6 @@ def pfunc(
|
|
|
453
453
|
inputs, cloned_outputs = construct_pfunc_ins_and_outs(
|
|
454
454
|
params,
|
|
455
455
|
outputs,
|
|
456
|
-
mode,
|
|
457
456
|
updates,
|
|
458
457
|
givens,
|
|
459
458
|
no_default_updates,
|
|
@@ -479,7 +478,6 @@ def pfunc(
|
|
|
479
478
|
def construct_pfunc_ins_and_outs(
|
|
480
479
|
params,
|
|
481
480
|
outputs=None,
|
|
482
|
-
mode=None,
|
|
483
481
|
updates=None,
|
|
484
482
|
givens=None,
|
|
485
483
|
no_default_updates=False,
|
|
@@ -546,26 +544,27 @@ def construct_pfunc_ins_and_outs(
|
|
|
546
544
|
"variables in the inputs list."
|
|
547
545
|
)
|
|
548
546
|
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
547
|
+
if givens:
|
|
548
|
+
# Check that we are not using `givens` to replace input variables, because
|
|
549
|
+
# this typically does nothing, contrary to what one may expect.
|
|
550
|
+
in_var_set = set(in_variables)
|
|
551
|
+
try:
|
|
552
|
+
givens_pairs = list(givens.items())
|
|
553
|
+
except AttributeError:
|
|
554
|
+
givens_pairs = givens
|
|
555
|
+
for x, y in givens_pairs:
|
|
556
|
+
if x in in_var_set:
|
|
557
|
+
raise RuntimeError(
|
|
558
|
+
f"You are trying to replace variable '{x}' through the "
|
|
559
|
+
"`givens` parameter, but this variable is an input to your "
|
|
560
|
+
"function. Replacing inputs is currently forbidden because it "
|
|
561
|
+
"has no effect. One way to modify an input `x` to a function "
|
|
562
|
+
"evaluating f(x) is to define a new input `y` and use "
|
|
563
|
+
"`pytensor.function([y], f(x), givens={x: g(y)})`. Another "
|
|
564
|
+
"solution consists in using `pytensor.clone_replace`, e.g. like this: "
|
|
565
|
+
"`pytensor.function([x], "
|
|
566
|
+
"pytensor.clone_replace(f(x), replace={x: g(x)}))`."
|
|
567
|
+
)
|
|
569
568
|
|
|
570
569
|
if not fgraph:
|
|
571
570
|
# Extend the outputs with the updates on input variables so they are
|
|
@@ -5,7 +5,7 @@ WRITEME
|
|
|
5
5
|
|
|
6
6
|
import logging
|
|
7
7
|
import warnings
|
|
8
|
-
from typing import Literal
|
|
8
|
+
from typing import Any, Literal
|
|
9
9
|
|
|
10
10
|
from pytensor.compile.function.types import Supervisor
|
|
11
11
|
from pytensor.configdefaults import config
|
|
@@ -62,23 +62,17 @@ def register_linker(name, linker):
|
|
|
62
62
|
predefined_linkers[name] = linker
|
|
63
63
|
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
# for Mode, it will be used as the key to retrieve the real optimizer
|
|
67
|
-
# in this dictionary
|
|
68
|
-
exclude = []
|
|
69
|
-
if not config.cxx:
|
|
70
|
-
exclude = ["cxx_only"]
|
|
71
|
-
OPT_NONE = RewriteDatabaseQuery(include=[], exclude=exclude)
|
|
65
|
+
OPT_NONE = RewriteDatabaseQuery(include=[])
|
|
72
66
|
# Minimum set of rewrites needed to evaluate a function. This is needed for graphs with "dummy" Operations
|
|
73
|
-
OPT_MINIMUM = RewriteDatabaseQuery(include=["minimum_compile"]
|
|
67
|
+
OPT_MINIMUM = RewriteDatabaseQuery(include=["minimum_compile"])
|
|
74
68
|
# Even if multiple merge optimizer call will be there, this shouldn't
|
|
75
69
|
# impact performance.
|
|
76
|
-
OPT_MERGE = RewriteDatabaseQuery(include=["merge"]
|
|
77
|
-
OPT_FAST_RUN = RewriteDatabaseQuery(include=["fast_run"]
|
|
70
|
+
OPT_MERGE = RewriteDatabaseQuery(include=["merge"])
|
|
71
|
+
OPT_FAST_RUN = RewriteDatabaseQuery(include=["fast_run"])
|
|
78
72
|
OPT_FAST_RUN_STABLE = OPT_FAST_RUN.requiring("stable")
|
|
79
73
|
|
|
80
|
-
OPT_FAST_COMPILE = RewriteDatabaseQuery(include=["fast_compile"]
|
|
81
|
-
OPT_STABILIZE = RewriteDatabaseQuery(include=["fast_run"]
|
|
74
|
+
OPT_FAST_COMPILE = RewriteDatabaseQuery(include=["fast_compile"])
|
|
75
|
+
OPT_STABILIZE = RewriteDatabaseQuery(include=["fast_run"])
|
|
82
76
|
OPT_STABILIZE.position_cutoff = 1.5000001
|
|
83
77
|
OPT_NONE.name = "OPT_NONE"
|
|
84
78
|
OPT_MINIMUM.name = "OPT_MINIMUM"
|
|
@@ -316,6 +310,8 @@ class Mode:
|
|
|
316
310
|
):
|
|
317
311
|
if linker is None:
|
|
318
312
|
linker = config.linker
|
|
313
|
+
if isinstance(linker, str) and linker == "auto":
|
|
314
|
+
linker = "cvm" if config.cxx else "vm"
|
|
319
315
|
if isinstance(optimizer, str) and optimizer == "default":
|
|
320
316
|
optimizer = config.optimizer
|
|
321
317
|
|
|
@@ -352,7 +348,14 @@ class Mode:
|
|
|
352
348
|
if isinstance(optimizer, str) or optimizer is None:
|
|
353
349
|
optimizer = predefined_optimizers[optimizer]
|
|
354
350
|
if isinstance(optimizer, RewriteDatabaseQuery):
|
|
351
|
+
# TODO: From the __init__ signature this should always be the case
|
|
352
|
+
# But some tests and internal logic allow passing a GraphRewriter directly as optimizer
|
|
353
|
+
# Cleanup!
|
|
355
354
|
self.provided_optimizer = optimizer
|
|
355
|
+
if r := linker.required_rewrites:
|
|
356
|
+
optimizer = optimizer.including(*r)
|
|
357
|
+
if r := linker.incompatible_rewrites:
|
|
358
|
+
optimizer = optimizer.excluding(*r)
|
|
356
359
|
self._optimizer = optimizer
|
|
357
360
|
self.call_time = 0
|
|
358
361
|
self.fn_time = 0
|
|
@@ -365,14 +368,13 @@ class Mode:
|
|
|
365
368
|
f"optdb={self.optdb})"
|
|
366
369
|
)
|
|
367
370
|
|
|
368
|
-
|
|
371
|
+
@property
|
|
372
|
+
def optimizer(self):
|
|
369
373
|
if isinstance(self._optimizer, RewriteDatabaseQuery):
|
|
370
374
|
return self.optdb.query(self._optimizer)
|
|
371
375
|
else:
|
|
372
376
|
return self._optimizer
|
|
373
377
|
|
|
374
|
-
optimizer = property(__get_optimizer)
|
|
375
|
-
|
|
376
378
|
def get_linker_optimizer(self, linker, optimizer):
|
|
377
379
|
if isinstance(linker, str) or linker is None:
|
|
378
380
|
linker = predefined_linkers[linker]
|
|
@@ -445,92 +447,51 @@ class Mode:
|
|
|
445
447
|
return new_mode
|
|
446
448
|
|
|
447
449
|
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
# Use VM_linker to allow lazy evaluation by default.
|
|
452
|
-
FAST_COMPILE = Mode(
|
|
453
|
-
VMLinker(use_cloop=False, c_thunks=False),
|
|
454
|
-
RewriteDatabaseQuery(include=["fast_compile", "py_only"]),
|
|
455
|
-
)
|
|
456
|
-
if config.cxx:
|
|
457
|
-
FAST_RUN = Mode("cvm", "fast_run")
|
|
458
|
-
else:
|
|
459
|
-
FAST_RUN = Mode(
|
|
460
|
-
"vm",
|
|
461
|
-
RewriteDatabaseQuery(include=["fast_run", "py_only"]),
|
|
462
|
-
)
|
|
450
|
+
C = Mode("c", "fast_run")
|
|
451
|
+
CVM = Mode("cvm", "fast_run")
|
|
452
|
+
VM = (Mode("vm", "fast_run"),)
|
|
463
453
|
|
|
464
454
|
NUMBA = Mode(
|
|
465
455
|
NumbaLinker(),
|
|
466
|
-
RewriteDatabaseQuery(
|
|
467
|
-
include=["fast_run", "numba"],
|
|
468
|
-
exclude=[
|
|
469
|
-
"cxx_only",
|
|
470
|
-
"BlasOpt",
|
|
471
|
-
"local_careduce_fusion",
|
|
472
|
-
"scan_save_mem_prealloc",
|
|
473
|
-
],
|
|
474
|
-
),
|
|
456
|
+
RewriteDatabaseQuery(include=["fast_run", "numba"]),
|
|
475
457
|
)
|
|
476
458
|
|
|
477
459
|
JAX = Mode(
|
|
478
460
|
JAXLinker(),
|
|
479
|
-
RewriteDatabaseQuery(
|
|
480
|
-
include=["fast_run", "jax"],
|
|
481
|
-
exclude=[
|
|
482
|
-
"cxx_only",
|
|
483
|
-
"BlasOpt",
|
|
484
|
-
"fusion",
|
|
485
|
-
"inplace",
|
|
486
|
-
"scan_save_mem_prealloc",
|
|
487
|
-
# There are specific variants for the LU decompositions supported by JAX
|
|
488
|
-
"reuse_lu_decomposition_multiple_solves",
|
|
489
|
-
"scan_split_non_sequence_lu_decomposition_solve",
|
|
490
|
-
],
|
|
491
|
-
),
|
|
461
|
+
RewriteDatabaseQuery(include=["fast_run", "jax"]),
|
|
492
462
|
)
|
|
493
463
|
PYTORCH = Mode(
|
|
494
464
|
PytorchLinker(),
|
|
495
|
-
RewriteDatabaseQuery(
|
|
496
|
-
include=["fast_run"],
|
|
497
|
-
exclude=[
|
|
498
|
-
"cxx_only",
|
|
499
|
-
"BlasOpt",
|
|
500
|
-
"fusion",
|
|
501
|
-
"inplace",
|
|
502
|
-
"scan_save_mem_prealloc",
|
|
503
|
-
"reuse_lu_decomposition_multiple_solves",
|
|
504
|
-
"scan_split_non_sequence_lu_decomposition_solve",
|
|
505
|
-
],
|
|
506
|
-
),
|
|
465
|
+
RewriteDatabaseQuery(include=["fast_run"]),
|
|
507
466
|
)
|
|
508
467
|
|
|
509
468
|
MLX = Mode(
|
|
510
469
|
MLXLinker(),
|
|
511
|
-
RewriteDatabaseQuery(
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
"inplace",
|
|
518
|
-
"scan_save_mem_prealloc",
|
|
519
|
-
],
|
|
520
|
-
),
|
|
470
|
+
RewriteDatabaseQuery(include=["fast_run"]),
|
|
471
|
+
)
|
|
472
|
+
|
|
473
|
+
FAST_COMPILE = Mode(
|
|
474
|
+
VMLinker(use_cloop=False, c_thunks=False),
|
|
475
|
+
RewriteDatabaseQuery(include=["fast_compile", "py_only"]),
|
|
521
476
|
)
|
|
522
477
|
|
|
478
|
+
fast_run_linkers_to_mode = {
|
|
479
|
+
"cvm": CVM,
|
|
480
|
+
"vm": VM,
|
|
481
|
+
"numba": NUMBA,
|
|
482
|
+
}
|
|
523
483
|
|
|
524
484
|
predefined_modes = {
|
|
525
485
|
"FAST_COMPILE": FAST_COMPILE,
|
|
526
|
-
"
|
|
486
|
+
"C": C,
|
|
487
|
+
"CVM": CVM,
|
|
527
488
|
"JAX": JAX,
|
|
528
489
|
"NUMBA": NUMBA,
|
|
529
490
|
"PYTORCH": PYTORCH,
|
|
530
491
|
"MLX": MLX,
|
|
531
492
|
}
|
|
532
493
|
|
|
533
|
-
_CACHED_RUNTIME_MODES: dict[
|
|
494
|
+
_CACHED_RUNTIME_MODES: dict[Any, Mode] = {}
|
|
534
495
|
|
|
535
496
|
|
|
536
497
|
def get_mode(orig_string):
|
|
@@ -548,10 +509,20 @@ def get_mode(orig_string):
|
|
|
548
509
|
if upper_string in predefined_modes:
|
|
549
510
|
return predefined_modes[upper_string]
|
|
550
511
|
|
|
512
|
+
if upper_string == "FAST_RUN":
|
|
513
|
+
linker = config.linker
|
|
514
|
+
if linker == "auto":
|
|
515
|
+
return CVM if config.cxx else VM
|
|
516
|
+
return fast_run_linkers_to_mode[linker]
|
|
517
|
+
|
|
551
518
|
global _CACHED_RUNTIME_MODES
|
|
552
519
|
|
|
553
|
-
if upper_string
|
|
554
|
-
|
|
520
|
+
cache_key = ("MODE", config.linker) if upper_string == "MODE" else upper_string
|
|
521
|
+
|
|
522
|
+
try:
|
|
523
|
+
return _CACHED_RUNTIME_MODES[cache_key]
|
|
524
|
+
except KeyError:
|
|
525
|
+
pass
|
|
555
526
|
|
|
556
527
|
# Need to define the mode for the first time
|
|
557
528
|
if upper_string == "MODE":
|
|
@@ -577,7 +548,7 @@ def get_mode(orig_string):
|
|
|
577
548
|
if config.optimizer_requiring:
|
|
578
549
|
ret = ret.requiring(*config.optimizer_requiring.split(":"))
|
|
579
550
|
# Cache the mode for next time
|
|
580
|
-
_CACHED_RUNTIME_MODES[
|
|
551
|
+
_CACHED_RUNTIME_MODES[cache_key] = ret
|
|
581
552
|
|
|
582
553
|
return ret
|
|
583
554
|
|
|
@@ -45,8 +45,12 @@ def _filter_mode(val):
|
|
|
45
45
|
"NanGuardMode",
|
|
46
46
|
"FAST_COMPILE",
|
|
47
47
|
"DEBUG_MODE",
|
|
48
|
+
"CVM",
|
|
49
|
+
"C",
|
|
48
50
|
"JAX",
|
|
49
51
|
"NUMBA",
|
|
52
|
+
"PYTORCH",
|
|
53
|
+
"MLX",
|
|
50
54
|
]
|
|
51
55
|
if val in str_options:
|
|
52
56
|
return val
|
|
@@ -367,13 +371,26 @@ def add_compile_configvars():
|
|
|
367
371
|
)
|
|
368
372
|
del param
|
|
369
373
|
|
|
374
|
+
default_linker = "auto"
|
|
375
|
+
|
|
370
376
|
if rc == 0 and config.cxx != "":
|
|
371
377
|
# Keep the default linker the same as the one for the mode FAST_RUN
|
|
372
|
-
linker_options = [
|
|
378
|
+
linker_options = [
|
|
379
|
+
"cvm",
|
|
380
|
+
"c|py",
|
|
381
|
+
"py",
|
|
382
|
+
"c",
|
|
383
|
+
"c|py_nogc",
|
|
384
|
+
"vm",
|
|
385
|
+
"vm_nogc",
|
|
386
|
+
"cvm_nogc",
|
|
387
|
+
"numba",
|
|
388
|
+
"jax",
|
|
389
|
+
]
|
|
373
390
|
else:
|
|
374
391
|
# g++ is not present or the user disabled it,
|
|
375
392
|
# linker should default to python only.
|
|
376
|
-
linker_options = ["py", "vm_nogc"]
|
|
393
|
+
linker_options = ["py", "vm", "vm_nogc", "numba", "jax"]
|
|
377
394
|
if type(config).cxx.is_default:
|
|
378
395
|
# If the user provided an empty value for cxx, do not warn.
|
|
379
396
|
_logger.warning(
|
|
@@ -385,9 +402,8 @@ def add_compile_configvars():
|
|
|
385
402
|
|
|
386
403
|
config.add(
|
|
387
404
|
"linker",
|
|
388
|
-
"Default linker used if the pytensor flags mode is Mode",
|
|
389
|
-
|
|
390
|
-
EnumStr("cvm", linker_options, mutable=False),
|
|
405
|
+
"Default linker used if the pytensor flags mode is Mode or FAST_RUN",
|
|
406
|
+
EnumStr(default_linker, linker_options, mutable=True),
|
|
391
407
|
in_c_key=False,
|
|
392
408
|
)
|
|
393
409
|
|
|
@@ -410,7 +410,9 @@ class ConfigParam:
|
|
|
410
410
|
f"The config parameter '{self.name}' was registered on a different instance of the PyTensorConfigParser."
|
|
411
411
|
f" It is not accessible through the instance with id '{id(cls)}' because of safeguarding."
|
|
412
412
|
)
|
|
413
|
-
|
|
413
|
+
try:
|
|
414
|
+
return self.val
|
|
415
|
+
except AttributeError:
|
|
414
416
|
try:
|
|
415
417
|
val_str = cls.fetch_val_for_key(self.name, delete_key=delete_key)
|
|
416
418
|
self.is_default = False
|
|
@@ -1784,14 +1784,14 @@ class numeric_grad:
|
|
|
1784
1784
|
|
|
1785
1785
|
def mode_not_slow(mode):
|
|
1786
1786
|
from pytensor.compile.debugmode import DebugMode
|
|
1787
|
-
from pytensor.compile.mode import
|
|
1787
|
+
from pytensor.compile.mode import get_mode
|
|
1788
1788
|
|
|
1789
1789
|
if mode == "FAST_COMPILE":
|
|
1790
|
-
return FAST_RUN
|
|
1790
|
+
return get_mode("FAST_RUN")
|
|
1791
1791
|
mode = get_mode(mode)
|
|
1792
1792
|
if isinstance(mode, DebugMode):
|
|
1793
1793
|
opt = mode.optimizer
|
|
1794
|
-
return FAST_RUN.clone(optimizer=opt)
|
|
1794
|
+
return get_mode("FAST_RUN").clone(optimizer=opt)
|
|
1795
1795
|
else:
|
|
1796
1796
|
return mode
|
|
1797
1797
|
|
|
@@ -2188,7 +2188,7 @@ def hessian(cost, wrt, consider_constant=None, disconnected_inputs="raise"):
|
|
|
2188
2188
|
# It is possible that the inputs are disconnected from expr,
|
|
2189
2189
|
# even if they are connected to cost.
|
|
2190
2190
|
# This should not be an error.
|
|
2191
|
-
hess
|
|
2191
|
+
hess = pytensor.scan(
|
|
2192
2192
|
lambda i, y, x: grad(
|
|
2193
2193
|
y[i],
|
|
2194
2194
|
x,
|
|
@@ -2197,9 +2197,7 @@ def hessian(cost, wrt, consider_constant=None, disconnected_inputs="raise"):
|
|
|
2197
2197
|
),
|
|
2198
2198
|
sequences=pytensor.tensor.arange(expr.shape[0]),
|
|
2199
2199
|
non_sequences=[expr, input],
|
|
2200
|
-
|
|
2201
|
-
assert not updates, (
|
|
2202
|
-
"Scan has returned a list of updates; this should not happen."
|
|
2200
|
+
return_updates=False,
|
|
2203
2201
|
)
|
|
2204
2202
|
hessians.append(hess)
|
|
2205
2203
|
return as_list_or_tuple(using_list, using_tuple, hessians)
|
|
@@ -1010,7 +1010,7 @@ class FromFunctionNodeRewriter(NodeRewriter):
|
|
|
1010
1010
|
|
|
1011
1011
|
|
|
1012
1012
|
def node_rewriter(
|
|
1013
|
-
tracks: Sequence[Op | type
|
|
1013
|
+
tracks: Sequence[Op | type | OpPattern] | None,
|
|
1014
1014
|
inplace: bool = False,
|
|
1015
1015
|
requirements: tuple[type, ...] | None = (),
|
|
1016
1016
|
):
|