pytensor 2.28.3__tar.gz → 2.30.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.28.3/pytensor.egg-info → pytensor-2.30.0}/PKG-INFO +3 -2
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/basic.rst +6 -9
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/_version.py +3 -3
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/function/pfunc.py +1 -7
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/mode.py +15 -7
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/configdefaults.py +3 -1
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/op.py +1 -1
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/ifelse.py +1 -2
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/__init__.py +1 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/random.py +84 -110
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/scan.py +1 -1
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/shape.py +1 -9
- pytensor-2.30.0/pytensor/link/jax/dispatch/signal/__init__.py +1 -0
- pytensor-2.30.0/pytensor/link/jax/dispatch/signal/conv.py +14 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/slinalg.py +23 -5
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/__init__.py +2 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/basic.py +14 -88
- {pytensor-2.28.3/pytensor/link/numba/dispatch → pytensor-2.30.0/pytensor/link/numba/dispatch/linalg}/_LAPACK.py +67 -0
- pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +66 -0
- pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +87 -0
- pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/general.py +256 -0
- pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/norm.py +58 -0
- pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/posdef.py +223 -0
- pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +228 -0
- pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/triangular.py +116 -0
- pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +299 -0
- pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/utils.py +11 -0
- pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/utils.py +108 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/scan.py +32 -7
- pytensor-2.30.0/pytensor/link/numba/dispatch/signal/__init__.py +1 -0
- pytensor-2.30.0/pytensor/link/numba/dispatch/signal/conv.py +16 -0
- pytensor-2.30.0/pytensor/link/numba/dispatch/slinalg.py +213 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/subtensor.py +60 -50
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/tensor_basic.py +0 -10
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/shape.py +1 -9
- pytensor-2.30.0/pytensor/misc/__init__.py +0 -0
- pytensor-2.30.0/pytensor/py.typed +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/basic.py +5 -5
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/op.py +11 -2
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/rewriting.py +135 -100
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/utils.py +2 -2
- pytensor-2.30.0/pytensor/sparse/sandbox/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/__init__.py +1 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/basic.py +33 -32
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/blas.py +53 -42
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/einsum.py +13 -1
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/math.py +158 -128
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/nlinalg.py +77 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/basic.py +8 -1
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/blas.py +2 -2
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/shape.py +0 -77
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/subtensor.py +0 -37
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/shape.py +0 -116
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/sharedvar.py +0 -6
- pytensor-2.30.0/pytensor/tensor/signal/__init__.py +4 -0
- pytensor-2.30.0/pytensor/tensor/signal/conv.py +132 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/slinalg.py +100 -24
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/subtensor.py +45 -17
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/utils.py +0 -8
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/variable.py +1 -1
- {pytensor-2.28.3 → pytensor-2.30.0/pytensor.egg-info}/PKG-INFO +3 -2
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor.egg-info/SOURCES.txt +20 -1
- {pytensor-2.28.3 → pytensor-2.30.0}/tests/test_rop.py +0 -8
- pytensor-2.28.3/pytensor/link/numba/dispatch/slinalg.py +0 -1192
- {pytensor-2.28.3 → pytensor-2.30.0}/LICENSE.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/MANIFEST.in +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/README.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/.templates/layout.html +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/.templates/nb-badges.html +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/LICENSE.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/README.md +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/acknowledgement.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/bcast.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/bcast.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/blog.md +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/conf.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/core_development_guide.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/css.inc +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/dev_start_guide.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/environment.yml +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/apply.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/apply.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/apply2.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/ctype.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/extending_faq.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/graphstructures.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/inplace.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/op.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/other_ops.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/pipeline.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/scan.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/tips.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/type.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/unittest.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/extending/using_params.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/faq.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/gallery/page_footer.md +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/glossary.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/Elman_srnn.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/PyTensor.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/binder.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/blocksparse.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/colab.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/github.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/lstm.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/talk2010.gif +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/images/talk2010.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/install.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/internal/how_to_release.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/internal/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/introduction.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/function.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/io.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/mode.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/ops.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/compile/shared.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/config.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/graph/features.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/graph/graph.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/graph/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/graph/op.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/graph/replace.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/graph/type.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/graph/utils.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/printing.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/scalar/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/scan.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/sparse/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/bcast.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/conv.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/fft.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/functional.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/io.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/random/distributions.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/random/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/tensor/utils.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/library/typed_list.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/links.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/optimizations.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/pylintrc +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/robots.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/troubleshooting.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/adding.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/apply.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/apply.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/bcast.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/conditions.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/examples.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/gradients.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/logistic.gp +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/logistic.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/loop.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/modes.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/prng.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/profiling.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/sparse.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/doc/user_guide.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pyproject.toml +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/bin/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/breakpoint.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/builders.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/compiledir.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/compilelock.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/debugmode.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/function/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/function/types.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/io.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/monitormode.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/nanguardmode.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/ops.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/profiling.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/configparser.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/gradient.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/features.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/fg.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/null_type.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/replace.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/type.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/graph/utils.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/cutils.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/cvm.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/interface.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/op.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/params_type.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/c/type.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/jax/linker.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/blockwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/elemwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-2.28.3/pytensor/misc → pytensor-2.30.0/pytensor/link/numba/dispatch/linalg}/__init__.py +0 -0
- {pytensor-2.28.3/pytensor/sparse/sandbox → pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/decomposition}/__init__.py +0 -0
- /pytensor-2.28.3/pytensor/py.typed → /pytensor-2.30.0/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/random.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/scalar.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/sparse.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/numba/linker.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/utils.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/link/vm.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/check_blas.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/frozendict.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/npy_2_compat.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/printing.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/raise_op.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/loop.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/math.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/scan/views.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/sparse/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/sparse/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/sparse/sandbox/sp.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/sparse/sandbox/sp2.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/sparse/type.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/sparse/utils.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/blas_c.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/blas_headers.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/blas_scipy.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/blockwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/c_code/dimshuffle.c +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/conv/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/conv/abstract_conv.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/elemwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/extra_ops.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/fft.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/fourier.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/functional.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/inplace.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/io.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/linalg.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/pad.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/op.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/type.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/random/var.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/elemwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/linalg.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/math.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/sort.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/special.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/type.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/type_other.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/var.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/typed_list/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/typed_list/type.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/updates.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor/utils.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor.egg-info/requires.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/scripts/mypy-failing.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/setup.cfg +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/setup.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/tests/test_breakpoint.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/tests/test_config.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/tests/test_gradient.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/tests/test_ifelse.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/tests/test_printing.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/tests/test_raise_op.py +0 -0
- {pytensor-2.28.3 → pytensor-2.30.0}/tests/test_updates.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: pytensor
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.30.0
|
|
4
4
|
Summary: Optimizing compiler for evaluating mathematical expressions on CPUs and GPUs.
|
|
5
5
|
Author-email: pymc-devs <pymc.devs@gmail.com>
|
|
6
6
|
License: .. _license:
|
|
@@ -108,6 +108,7 @@ Requires-Dist: jaxlib; extra == "jax"
|
|
|
108
108
|
Provides-Extra: numba
|
|
109
109
|
Requires-Dist: numba>=0.57; extra == "numba"
|
|
110
110
|
Requires-Dist: llvmlite; extra == "numba"
|
|
111
|
+
Dynamic: license-file
|
|
111
112
|
|
|
112
113
|
.. image:: https://cdn.rawgit.com/pymc-devs/pytensor/main/doc/images/PyTensor_RGB.svg
|
|
113
114
|
:height: 100px
|
|
@@ -619,9 +619,8 @@ dimensions, see :meth:`_tensor_py_operators.dimshuffle`.
|
|
|
619
619
|
|
|
620
620
|
.. function:: shape_padleft(x, n_ones=1)
|
|
621
621
|
|
|
622
|
-
Reshape `x` by left padding the shape with `n_ones` 1s.
|
|
623
|
-
|
|
624
|
-
see the :func:`unbroadcast`.
|
|
622
|
+
Reshape `x` by left padding the shape with `n_ones` 1s.
|
|
623
|
+
All new dimensions will be broadcastable.
|
|
625
624
|
|
|
626
625
|
:param x: variable to be reshaped
|
|
627
626
|
:type x: any `TensorVariable` (or compatible)
|
|
@@ -633,9 +632,8 @@ dimensions, see :meth:`_tensor_py_operators.dimshuffle`.
|
|
|
633
632
|
|
|
634
633
|
.. function:: shape_padright(x, n_ones=1)
|
|
635
634
|
|
|
636
|
-
Reshape `x` by right padding the shape with `n_ones` ones.
|
|
637
|
-
|
|
638
|
-
see the :func:`unbroadcast`.
|
|
635
|
+
Reshape `x` by right padding the shape with `n_ones` ones.
|
|
636
|
+
All new dimensions will be broadcastable.
|
|
639
637
|
|
|
640
638
|
:param x: variable to be reshaped
|
|
641
639
|
:type x: any TensorVariable (or compatible)
|
|
@@ -646,9 +644,8 @@ dimensions, see :meth:`_tensor_py_operators.dimshuffle`.
|
|
|
646
644
|
|
|
647
645
|
.. function:: shape_padaxis(t, axis)
|
|
648
646
|
|
|
649
|
-
Reshape `t` by inserting ``1`` at the dimension `axis`.
|
|
650
|
-
|
|
651
|
-
see the :func:`unbroadcast`.
|
|
647
|
+
Reshape `t` by inserting ``1`` at the dimension `axis`.
|
|
648
|
+
All new dimensions will be broadcastable.
|
|
652
649
|
|
|
653
650
|
:type x: any `TensorVariable` (or compatible)
|
|
654
651
|
:param x: variable to be reshaped
|
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-03-
|
|
11
|
+
"date": "2025-03-28T02:16:52+0800",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.
|
|
14
|
+
"full-revisionid": "0b56ed9c6514e4ba641cb07fd7bbca629dd797c3",
|
|
15
|
+
"version": "2.30.0"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -292,14 +292,8 @@ def rebuild_collect_shared(
|
|
|
292
292
|
f" shared_var.type={store_into.type},"
|
|
293
293
|
f" update_val={update_val}, update_val.type={getattr(update_val, 'type', None)})."
|
|
294
294
|
)
|
|
295
|
-
err_sug = (
|
|
296
|
-
"If the difference is related to the broadcast pattern,"
|
|
297
|
-
" you can call the"
|
|
298
|
-
" tensor.shape.unbroadcast(var, axis_to_unbroadcast[, ...])"
|
|
299
|
-
" function to mask broadcastable dimensions."
|
|
300
|
-
)
|
|
301
295
|
|
|
302
|
-
raise TypeError(err_msg
|
|
296
|
+
raise TypeError(err_msg)
|
|
303
297
|
assert store_into.type.is_super(update_val.type)
|
|
304
298
|
|
|
305
299
|
update_d[store_into] = update_val
|
|
@@ -454,6 +454,19 @@ else:
|
|
|
454
454
|
RewriteDatabaseQuery(include=["fast_run", "py_only"]),
|
|
455
455
|
)
|
|
456
456
|
|
|
457
|
+
NUMBA = Mode(
|
|
458
|
+
NumbaLinker(),
|
|
459
|
+
RewriteDatabaseQuery(
|
|
460
|
+
include=["fast_run", "numba"],
|
|
461
|
+
exclude=[
|
|
462
|
+
"cxx_only",
|
|
463
|
+
"BlasOpt",
|
|
464
|
+
"local_careduce_fusion",
|
|
465
|
+
"scan_save_mem_prealloc",
|
|
466
|
+
],
|
|
467
|
+
),
|
|
468
|
+
)
|
|
469
|
+
|
|
457
470
|
JAX = Mode(
|
|
458
471
|
JAXLinker(),
|
|
459
472
|
RewriteDatabaseQuery(
|
|
@@ -463,6 +476,7 @@ JAX = Mode(
|
|
|
463
476
|
"BlasOpt",
|
|
464
477
|
"fusion",
|
|
465
478
|
"inplace",
|
|
479
|
+
"scan_save_mem_prealloc",
|
|
466
480
|
],
|
|
467
481
|
),
|
|
468
482
|
)
|
|
@@ -476,16 +490,10 @@ PYTORCH = Mode(
|
|
|
476
490
|
"fusion",
|
|
477
491
|
"inplace",
|
|
478
492
|
"local_uint_constant_indices",
|
|
493
|
+
"scan_save_mem_prealloc",
|
|
479
494
|
],
|
|
480
495
|
),
|
|
481
496
|
)
|
|
482
|
-
NUMBA = Mode(
|
|
483
|
-
NumbaLinker(),
|
|
484
|
-
RewriteDatabaseQuery(
|
|
485
|
-
include=["fast_run", "numba"],
|
|
486
|
-
exclude=["cxx_only", "BlasOpt", "local_careduce_fusion"],
|
|
487
|
-
),
|
|
488
|
-
)
|
|
489
497
|
|
|
490
498
|
|
|
491
499
|
predefined_modes = {
|
|
@@ -1085,7 +1085,9 @@ def add_scan_configvars():
|
|
|
1085
1085
|
"scan__allow_output_prealloc",
|
|
1086
1086
|
"Allow/disallow memory preallocation for outputs inside of scan "
|
|
1087
1087
|
"(default: True)",
|
|
1088
|
-
|
|
1088
|
+
# Non-mutable because ScanSaveMem rewrite checks it,
|
|
1089
|
+
# and we can't have the rewrite and the implementation mismatch
|
|
1090
|
+
BoolParam(True, mutable=False),
|
|
1089
1091
|
in_c_key=False,
|
|
1090
1092
|
)
|
|
1091
1093
|
|
|
@@ -366,7 +366,7 @@ class Op(MetaObject):
|
|
|
366
366
|
.. [1] Giles, Mike. 2008. “An Extended Collection of Matrix Derivative Results for Forward and Reverse Mode Automatic Differentiation.”
|
|
367
367
|
|
|
368
368
|
"""
|
|
369
|
-
raise NotImplementedError()
|
|
369
|
+
raise NotImplementedError(f"grad not implemented for Op {self}")
|
|
370
370
|
|
|
371
371
|
def L_op(
|
|
372
372
|
self,
|
|
@@ -26,7 +26,7 @@ from pytensor.graph.op import _NoPythonOp
|
|
|
26
26
|
from pytensor.graph.replace import clone_replace
|
|
27
27
|
from pytensor.graph.rewriting.basic import GraphRewriter, in2out, node_rewriter
|
|
28
28
|
from pytensor.graph.type import HasDataType, HasShape
|
|
29
|
-
from pytensor.tensor.shape import Reshape, Shape, SpecifyShape
|
|
29
|
+
from pytensor.tensor.shape import Reshape, Shape, SpecifyShape
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
if TYPE_CHECKING:
|
|
@@ -481,7 +481,6 @@ acceptable_ops = (
|
|
|
481
481
|
Shape,
|
|
482
482
|
SpecifyShape,
|
|
483
483
|
Reshape,
|
|
484
|
-
Unbroadcast,
|
|
485
484
|
pt.math.Dot,
|
|
486
485
|
pt.math.Max,
|
|
487
486
|
pt.math.Argmax,
|
|
@@ -14,6 +14,7 @@ import pytensor.link.jax.dispatch.random
|
|
|
14
14
|
import pytensor.link.jax.dispatch.scalar
|
|
15
15
|
import pytensor.link.jax.dispatch.scan
|
|
16
16
|
import pytensor.link.jax.dispatch.shape
|
|
17
|
+
import pytensor.link.jax.dispatch.signal
|
|
17
18
|
import pytensor.link.jax.dispatch.slinalg
|
|
18
19
|
import pytensor.link.jax.dispatch.sort
|
|
19
20
|
import pytensor.link.jax.dispatch.sparse
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from functools import singledispatch
|
|
2
2
|
|
|
3
3
|
import jax
|
|
4
|
+
import jax.numpy as jnp
|
|
4
5
|
import numpy as np
|
|
5
6
|
from numpy.random import Generator
|
|
6
7
|
from numpy.random.bit_generator import ( # type: ignore[attr-defined]
|
|
@@ -105,14 +106,24 @@ def jax_funcify_RandomVariable(op: ptr.RandomVariable, node, **kwargs):
|
|
|
105
106
|
assert_size_argument_jax_compatible(node)
|
|
106
107
|
|
|
107
108
|
def sample_fn(rng, size, *parameters):
|
|
108
|
-
|
|
109
|
+
rng_key = rng["jax_state"]
|
|
110
|
+
rng_key, sampling_key = jax.random.split(rng_key, 2)
|
|
111
|
+
rng["jax_state"] = rng_key
|
|
112
|
+
sample = jax_sample_fn(op, node=node)(
|
|
113
|
+
sampling_key, size, out_dtype, *parameters
|
|
114
|
+
)
|
|
115
|
+
return (rng, sample)
|
|
109
116
|
|
|
110
117
|
else:
|
|
111
118
|
|
|
112
119
|
def sample_fn(rng, size, *parameters):
|
|
113
|
-
|
|
114
|
-
|
|
120
|
+
rng_key = rng["jax_state"]
|
|
121
|
+
rng_key, sampling_key = jax.random.split(rng_key, 2)
|
|
122
|
+
rng["jax_state"] = rng_key
|
|
123
|
+
sample = jax_sample_fn(op, node=node)(
|
|
124
|
+
sampling_key, static_size, out_dtype, *parameters
|
|
115
125
|
)
|
|
126
|
+
return (rng, sample)
|
|
116
127
|
|
|
117
128
|
return sample_fn
|
|
118
129
|
|
|
@@ -133,12 +144,9 @@ def jax_sample_fn_generic(op, node):
|
|
|
133
144
|
name = op.name
|
|
134
145
|
jax_op = getattr(jax.random, name)
|
|
135
146
|
|
|
136
|
-
def sample_fn(
|
|
137
|
-
rng_key =
|
|
138
|
-
|
|
139
|
-
sample = jax_op(sampling_key, *parameters, shape=size, dtype=dtype)
|
|
140
|
-
rng["jax_state"] = rng_key
|
|
141
|
-
return (rng, sample)
|
|
147
|
+
def sample_fn(rng_key, size, dtype, *parameters):
|
|
148
|
+
sample = jax_op(rng_key, *parameters, shape=size, dtype=dtype)
|
|
149
|
+
return sample
|
|
142
150
|
|
|
143
151
|
return sample_fn
|
|
144
152
|
|
|
@@ -159,29 +167,23 @@ def jax_sample_fn_loc_scale(op, node):
|
|
|
159
167
|
name = op.name
|
|
160
168
|
jax_op = getattr(jax.random, name)
|
|
161
169
|
|
|
162
|
-
def sample_fn(
|
|
163
|
-
rng_key = rng["jax_state"]
|
|
164
|
-
rng_key, sampling_key = jax.random.split(rng_key, 2)
|
|
170
|
+
def sample_fn(rng_key, size, dtype, *parameters):
|
|
165
171
|
loc, scale = parameters
|
|
166
172
|
if size is None:
|
|
167
173
|
size = jax.numpy.broadcast_arrays(loc, scale)[0].shape
|
|
168
|
-
sample = loc + jax_op(
|
|
169
|
-
|
|
170
|
-
return (rng, sample)
|
|
174
|
+
sample = loc + jax_op(rng_key, size, dtype) * scale
|
|
175
|
+
return sample
|
|
171
176
|
|
|
172
177
|
return sample_fn
|
|
173
178
|
|
|
174
179
|
|
|
175
180
|
@jax_sample_fn.register(ptr.MvNormalRV)
|
|
176
181
|
def jax_sample_mvnormal(op, node):
|
|
177
|
-
def sample_fn(
|
|
178
|
-
rng_key = rng["jax_state"]
|
|
179
|
-
rng_key, sampling_key = jax.random.split(rng_key, 2)
|
|
182
|
+
def sample_fn(rng_key, size, dtype, mean, cov):
|
|
180
183
|
sample = jax.random.multivariate_normal(
|
|
181
|
-
|
|
184
|
+
rng_key, mean, cov, shape=size, dtype=dtype, method=op.method
|
|
182
185
|
)
|
|
183
|
-
|
|
184
|
-
return (rng, sample)
|
|
186
|
+
return sample
|
|
185
187
|
|
|
186
188
|
return sample_fn
|
|
187
189
|
|
|
@@ -191,12 +193,9 @@ def jax_sample_fn_bernoulli(op, node):
|
|
|
191
193
|
"""JAX implementation of `BernoulliRV`."""
|
|
192
194
|
|
|
193
195
|
# We need a separate dispatch, because there is no dtype argument for Bernoulli in JAX
|
|
194
|
-
def sample_fn(
|
|
195
|
-
rng_key =
|
|
196
|
-
|
|
197
|
-
sample = jax.random.bernoulli(sampling_key, p, shape=size)
|
|
198
|
-
rng["jax_state"] = rng_key
|
|
199
|
-
return (rng, sample)
|
|
196
|
+
def sample_fn(rng_key, size, dtype, p):
|
|
197
|
+
sample = jax.random.bernoulli(rng_key, p, shape=size)
|
|
198
|
+
return sample
|
|
200
199
|
|
|
201
200
|
return sample_fn
|
|
202
201
|
|
|
@@ -206,14 +205,10 @@ def jax_sample_fn_categorical(op, node):
|
|
|
206
205
|
"""JAX implementation of `CategoricalRV`."""
|
|
207
206
|
|
|
208
207
|
# We need a separate dispatch because Categorical expects logits in JAX
|
|
209
|
-
def sample_fn(
|
|
210
|
-
rng_key = rng["jax_state"]
|
|
211
|
-
rng_key, sampling_key = jax.random.split(rng_key, 2)
|
|
212
|
-
|
|
208
|
+
def sample_fn(rng_key, size, dtype, p):
|
|
213
209
|
logits = jax.scipy.special.logit(p)
|
|
214
|
-
sample = jax.random.categorical(
|
|
215
|
-
|
|
216
|
-
return (rng, sample)
|
|
210
|
+
sample = jax.random.categorical(rng_key, logits=logits, shape=size)
|
|
211
|
+
return sample
|
|
217
212
|
|
|
218
213
|
return sample_fn
|
|
219
214
|
|
|
@@ -233,15 +228,10 @@ def jax_sample_fn_uniform(op, node):
|
|
|
233
228
|
name = "randint"
|
|
234
229
|
jax_op = getattr(jax.random, name)
|
|
235
230
|
|
|
236
|
-
def sample_fn(
|
|
237
|
-
rng_key = rng["jax_state"]
|
|
238
|
-
rng_key, sampling_key = jax.random.split(rng_key, 2)
|
|
231
|
+
def sample_fn(rng_key, size, dtype, *parameters):
|
|
239
232
|
minval, maxval = parameters
|
|
240
|
-
sample = jax_op(
|
|
241
|
-
|
|
242
|
-
)
|
|
243
|
-
rng["jax_state"] = rng_key
|
|
244
|
-
return (rng, sample)
|
|
233
|
+
sample = jax_op(rng_key, shape=size, dtype=dtype, minval=minval, maxval=maxval)
|
|
234
|
+
return sample
|
|
245
235
|
|
|
246
236
|
return sample_fn
|
|
247
237
|
|
|
@@ -258,14 +248,11 @@ def jax_sample_fn_shape_scale(op, node):
|
|
|
258
248
|
name = op.name
|
|
259
249
|
jax_op = getattr(jax.random, name)
|
|
260
250
|
|
|
261
|
-
def sample_fn(
|
|
262
|
-
rng_key = rng["jax_state"]
|
|
263
|
-
rng_key, sampling_key = jax.random.split(rng_key, 2)
|
|
251
|
+
def sample_fn(rng_key, size, dtype, shape, scale):
|
|
264
252
|
if size is None:
|
|
265
253
|
size = jax.numpy.broadcast_arrays(shape, scale)[0].shape
|
|
266
|
-
sample = jax_op(
|
|
267
|
-
|
|
268
|
-
return (rng, sample)
|
|
254
|
+
sample = jax_op(rng_key, shape, size, dtype) * scale
|
|
255
|
+
return sample
|
|
269
256
|
|
|
270
257
|
return sample_fn
|
|
271
258
|
|
|
@@ -274,14 +261,11 @@ def jax_sample_fn_shape_scale(op, node):
|
|
|
274
261
|
def jax_sample_fn_exponential(op, node):
|
|
275
262
|
"""JAX implementation of `ExponentialRV`."""
|
|
276
263
|
|
|
277
|
-
def sample_fn(
|
|
278
|
-
rng_key = rng["jax_state"]
|
|
279
|
-
rng_key, sampling_key = jax.random.split(rng_key, 2)
|
|
264
|
+
def sample_fn(rng_key, size, dtype, scale):
|
|
280
265
|
if size is None:
|
|
281
266
|
size = jax.numpy.asarray(scale).shape
|
|
282
|
-
sample = jax.random.exponential(
|
|
283
|
-
|
|
284
|
-
return (rng, sample)
|
|
267
|
+
sample = jax.random.exponential(rng_key, size, dtype) * scale
|
|
268
|
+
return sample
|
|
285
269
|
|
|
286
270
|
return sample_fn
|
|
287
271
|
|
|
@@ -290,14 +274,11 @@ def jax_sample_fn_exponential(op, node):
|
|
|
290
274
|
def jax_sample_fn_t(op, node):
|
|
291
275
|
"""JAX implementation of `StudentTRV`."""
|
|
292
276
|
|
|
293
|
-
def sample_fn(
|
|
294
|
-
rng_key = rng["jax_state"]
|
|
295
|
-
rng_key, sampling_key = jax.random.split(rng_key, 2)
|
|
277
|
+
def sample_fn(rng_key, size, dtype, df, loc, scale):
|
|
296
278
|
if size is None:
|
|
297
279
|
size = jax.numpy.broadcast_arrays(df, loc, scale)[0].shape
|
|
298
|
-
sample = loc + jax.random.t(
|
|
299
|
-
|
|
300
|
-
return (rng, sample)
|
|
280
|
+
sample = loc + jax.random.t(rng_key, df, size, dtype) * scale
|
|
281
|
+
return sample
|
|
301
282
|
|
|
302
283
|
return sample_fn
|
|
303
284
|
|
|
@@ -315,10 +296,7 @@ def jax_funcify_choice(op: ptr.ChoiceWithoutReplacement, node):
|
|
|
315
296
|
"A default JAX rewrite should have materialized the implicit arange"
|
|
316
297
|
)
|
|
317
298
|
|
|
318
|
-
def sample_fn(
|
|
319
|
-
rng_key = rng["jax_state"]
|
|
320
|
-
rng_key, sampling_key = jax.random.split(rng_key, 2)
|
|
321
|
-
|
|
299
|
+
def sample_fn(rng_key, size, dtype, *parameters):
|
|
322
300
|
if op.has_p_param:
|
|
323
301
|
a, p, core_shape = parameters
|
|
324
302
|
else:
|
|
@@ -327,9 +305,7 @@ def jax_funcify_choice(op: ptr.ChoiceWithoutReplacement, node):
|
|
|
327
305
|
core_shape = tuple(np.asarray(core_shape)[(0,) * batch_ndim])
|
|
328
306
|
|
|
329
307
|
if batch_ndim == 0:
|
|
330
|
-
sample = jax.random.choice(
|
|
331
|
-
sampling_key, a, shape=core_shape, replace=False, p=p
|
|
332
|
-
)
|
|
308
|
+
sample = jax.random.choice(rng_key, a, shape=core_shape, replace=False, p=p)
|
|
333
309
|
|
|
334
310
|
else:
|
|
335
311
|
if size is None:
|
|
@@ -345,7 +321,7 @@ def jax_funcify_choice(op: ptr.ChoiceWithoutReplacement, node):
|
|
|
345
321
|
if p is not None:
|
|
346
322
|
p = jax.numpy.broadcast_to(p, size + p.shape[batch_ndim:])
|
|
347
323
|
|
|
348
|
-
batch_sampling_keys = jax.random.split(
|
|
324
|
+
batch_sampling_keys = jax.random.split(rng_key, np.prod(size))
|
|
349
325
|
|
|
350
326
|
# Ravel the batch dimensions because vmap only works along a single axis
|
|
351
327
|
raveled_batch_a = a.reshape((-1,) + a.shape[batch_ndim:])
|
|
@@ -366,8 +342,7 @@ def jax_funcify_choice(op: ptr.ChoiceWithoutReplacement, node):
|
|
|
366
342
|
# Reshape the batch dimensions
|
|
367
343
|
sample = raveled_sample.reshape(size + raveled_sample.shape[1:])
|
|
368
344
|
|
|
369
|
-
|
|
370
|
-
return (rng, sample)
|
|
345
|
+
return sample
|
|
371
346
|
|
|
372
347
|
return sample_fn
|
|
373
348
|
|
|
@@ -378,9 +353,7 @@ def jax_sample_fn_permutation(op, node):
|
|
|
378
353
|
|
|
379
354
|
batch_ndim = op.batch_ndim(node)
|
|
380
355
|
|
|
381
|
-
def sample_fn(
|
|
382
|
-
rng_key = rng["jax_state"]
|
|
383
|
-
rng_key, sampling_key = jax.random.split(rng_key, 2)
|
|
356
|
+
def sample_fn(rng_key, size, dtype, *parameters):
|
|
384
357
|
(x,) = parameters
|
|
385
358
|
if batch_ndim:
|
|
386
359
|
# jax.random.permutation has no concept of batch dims
|
|
@@ -389,17 +362,16 @@ def jax_sample_fn_permutation(op, node):
|
|
|
389
362
|
else:
|
|
390
363
|
x = jax.numpy.broadcast_to(x, size + x.shape[batch_ndim:])
|
|
391
364
|
|
|
392
|
-
batch_sampling_keys = jax.random.split(
|
|
365
|
+
batch_sampling_keys = jax.random.split(rng_key, np.prod(size))
|
|
393
366
|
raveled_batch_x = x.reshape((-1,) + x.shape[batch_ndim:])
|
|
394
367
|
raveled_sample = jax.vmap(lambda key, x: jax.random.permutation(key, x))(
|
|
395
368
|
batch_sampling_keys, raveled_batch_x
|
|
396
369
|
)
|
|
397
370
|
sample = raveled_sample.reshape(size + raveled_sample.shape[1:])
|
|
398
371
|
else:
|
|
399
|
-
sample = jax.random.permutation(
|
|
372
|
+
sample = jax.random.permutation(rng_key, x)
|
|
400
373
|
|
|
401
|
-
|
|
402
|
-
return (rng, sample)
|
|
374
|
+
return sample
|
|
403
375
|
|
|
404
376
|
return sample_fn
|
|
405
377
|
|
|
@@ -414,38 +386,45 @@ def jax_sample_fn_binomial(op, node):
|
|
|
414
386
|
|
|
415
387
|
from numpyro.distributions.util import binomial
|
|
416
388
|
|
|
417
|
-
def sample_fn(
|
|
418
|
-
rng_key =
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
sample = binomial(key=sampling_key, n=n, p=p, shape=size)
|
|
422
|
-
|
|
423
|
-
rng["jax_state"] = rng_key
|
|
424
|
-
|
|
425
|
-
return (rng, sample)
|
|
389
|
+
def sample_fn(rng_key, size, dtype, n, p):
|
|
390
|
+
sample = binomial(key=rng_key, n=n, p=p, shape=size)
|
|
391
|
+
return sample
|
|
426
392
|
|
|
427
393
|
return sample_fn
|
|
428
394
|
|
|
429
395
|
|
|
430
396
|
@jax_sample_fn.register(ptr.MultinomialRV)
|
|
431
397
|
def jax_sample_fn_multinomial(op, node):
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
)
|
|
437
|
-
|
|
438
|
-
from numpyro.distributions.util import multinomial
|
|
439
|
-
|
|
440
|
-
def sample_fn(rng, size, dtype, n, p):
|
|
441
|
-
rng_key = rng["jax_state"]
|
|
442
|
-
rng_key, sampling_key = jax.random.split(rng_key, 2)
|
|
443
|
-
|
|
444
|
-
sample = multinomial(key=sampling_key, n=n, p=p, shape=size)
|
|
445
|
-
|
|
446
|
-
rng["jax_state"] = rng_key
|
|
398
|
+
def sample_fn(rng_key, size, dtype, n, p):
|
|
399
|
+
if size is not None:
|
|
400
|
+
n = jnp.broadcast_to(n, size)
|
|
401
|
+
p = jnp.broadcast_to(p, size + jnp.shape(p)[-1:])
|
|
447
402
|
|
|
448
|
-
|
|
403
|
+
else:
|
|
404
|
+
broadcast_shape = jax.lax.broadcast_shapes(jnp.shape(n), jnp.shape(p)[:-1])
|
|
405
|
+
n = jnp.broadcast_to(n, broadcast_shape)
|
|
406
|
+
p = jnp.broadcast_to(p, broadcast_shape + jnp.shape(p)[-1:])
|
|
407
|
+
|
|
408
|
+
binom_p = jnp.moveaxis(p, -1, 0)[:-1, ...]
|
|
409
|
+
sampling_rng = jax.random.split(rng_key, binom_p.shape[0])
|
|
410
|
+
|
|
411
|
+
def _binomial_sample_fn(carry, p_rng):
|
|
412
|
+
s, rho = carry
|
|
413
|
+
p, rng = p_rng
|
|
414
|
+
samples = jax.random.binomial(rng, s, p / rho)
|
|
415
|
+
s = s - samples
|
|
416
|
+
rho = rho - p
|
|
417
|
+
return ((s, rho), samples)
|
|
418
|
+
|
|
419
|
+
(remain, _), samples = jax.lax.scan(
|
|
420
|
+
_binomial_sample_fn,
|
|
421
|
+
(n.astype(np.float64), jnp.ones(binom_p.shape[1:])),
|
|
422
|
+
(binom_p, sampling_rng),
|
|
423
|
+
)
|
|
424
|
+
sample = jnp.concatenate(
|
|
425
|
+
[jnp.moveaxis(samples, 0, -1), jnp.expand_dims(remain, -1)], axis=-1
|
|
426
|
+
)
|
|
427
|
+
return sample
|
|
449
428
|
|
|
450
429
|
return sample_fn
|
|
451
430
|
|
|
@@ -460,17 +439,12 @@ def jax_sample_fn_vonmises(op, node):
|
|
|
460
439
|
|
|
461
440
|
from numpyro.distributions.util import von_mises_centered
|
|
462
441
|
|
|
463
|
-
def sample_fn(
|
|
464
|
-
rng_key = rng["jax_state"]
|
|
465
|
-
rng_key, sampling_key = jax.random.split(rng_key, 2)
|
|
466
|
-
|
|
442
|
+
def sample_fn(rng_key, size, dtype, mu, kappa):
|
|
467
443
|
sample = von_mises_centered(
|
|
468
|
-
key=
|
|
444
|
+
key=rng_key, concentration=kappa, shape=size, dtype=dtype
|
|
469
445
|
)
|
|
470
446
|
sample = (sample + mu + np.pi) % (2.0 * np.pi) - np.pi
|
|
471
447
|
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
return (rng, sample)
|
|
448
|
+
return sample
|
|
475
449
|
|
|
476
450
|
return sample_fn
|
|
@@ -29,7 +29,7 @@ def jax_funcify_Scan(op: Scan, **kwargs):
|
|
|
29
29
|
# Extract JAX scan inputs
|
|
30
30
|
outer_inputs = list(outer_inputs)
|
|
31
31
|
n_steps = outer_inputs[0] # JAX `length`
|
|
32
|
-
seqs = op.outer_seqs(outer_inputs) # JAX `xs`
|
|
32
|
+
seqs = [seq[:n_steps] for seq in op.outer_seqs(outer_inputs)] # JAX `xs`
|
|
33
33
|
|
|
34
34
|
mit_sot_init = []
|
|
35
35
|
for tap, seq in zip(
|
|
@@ -4,7 +4,7 @@ from pytensor.graph import Constant
|
|
|
4
4
|
from pytensor.graph.basic import Apply
|
|
5
5
|
from pytensor.graph.op import Op
|
|
6
6
|
from pytensor.link.jax.dispatch.basic import jax_funcify
|
|
7
|
-
from pytensor.tensor.shape import Reshape, Shape, Shape_i, SpecifyShape
|
|
7
|
+
from pytensor.tensor.shape import Reshape, Shape, Shape_i, SpecifyShape
|
|
8
8
|
from pytensor.tensor.type import TensorType
|
|
9
9
|
|
|
10
10
|
|
|
@@ -104,11 +104,3 @@ def jax_funcify_SpecifyShape(op, node, **kwargs):
|
|
|
104
104
|
return x
|
|
105
105
|
|
|
106
106
|
return specifyshape
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
@jax_funcify.register(Unbroadcast)
|
|
110
|
-
def jax_funcify_Unbroadcast(op, **kwargs):
|
|
111
|
-
def unbroadcast(x):
|
|
112
|
-
return x
|
|
113
|
-
|
|
114
|
-
return unbroadcast
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import pytensor.link.jax.dispatch.signal.conv
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import jax
|
|
2
|
+
|
|
3
|
+
from pytensor.link.jax.dispatch import jax_funcify
|
|
4
|
+
from pytensor.tensor.signal.conv import Conv1d
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@jax_funcify.register(Conv1d)
|
|
8
|
+
def jax_funcify_Conv1d(op, node, **kwargs):
|
|
9
|
+
mode = op.mode
|
|
10
|
+
|
|
11
|
+
def conv1d(data, kernel):
|
|
12
|
+
return jax.numpy.convolve(data, kernel, mode=mode)
|
|
13
|
+
|
|
14
|
+
return conv1d
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import warnings
|
|
2
|
+
|
|
1
3
|
import jax
|
|
2
4
|
|
|
3
5
|
from pytensor.link.jax.dispatch.basic import jax_funcify
|
|
@@ -39,13 +41,29 @@ def jax_funcify_Cholesky(op, **kwargs):
|
|
|
39
41
|
|
|
40
42
|
@jax_funcify.register(Solve)
|
|
41
43
|
def jax_funcify_Solve(op, **kwargs):
|
|
42
|
-
|
|
43
|
-
|
|
44
|
+
assume_a = op.assume_a
|
|
45
|
+
lower = op.lower
|
|
46
|
+
|
|
47
|
+
if assume_a == "tridiagonal":
|
|
48
|
+
# jax.scipy.solve does not yet support tridiagonal matrices
|
|
49
|
+
# But there's a jax.lax.linalg.tridiaonal_solve we can use instead.
|
|
50
|
+
def solve(a, b):
|
|
51
|
+
dl = jax.numpy.diagonal(a, offset=-1, axis1=-2, axis2=-1)
|
|
52
|
+
d = jax.numpy.diagonal(a, offset=0, axis1=-2, axis2=-1)
|
|
53
|
+
du = jax.numpy.diagonal(a, offset=1, axis1=-2, axis2=-1)
|
|
54
|
+
return jax.lax.linalg.tridiagonal_solve(dl, d, du, b, lower=lower)
|
|
55
|
+
|
|
44
56
|
else:
|
|
45
|
-
|
|
57
|
+
if assume_a not in ("gen", "sym", "her", "pos"):
|
|
58
|
+
warnings.warn(
|
|
59
|
+
f"JAX solve does not support assume_a={op.assume_a}. Defaulting to assume_a='gen'.\n"
|
|
60
|
+
f"If appropriate, you may want to set assume_a to one of 'sym', 'pos', 'her' or 'tridiagonal' to improve performance.",
|
|
61
|
+
UserWarning,
|
|
62
|
+
)
|
|
63
|
+
assume_a = "gen"
|
|
46
64
|
|
|
47
|
-
|
|
48
|
-
|
|
65
|
+
def solve(a, b):
|
|
66
|
+
return jax.scipy.linalg.solve(a, b, lower=lower, assume_a=assume_a)
|
|
49
67
|
|
|
50
68
|
return solve
|
|
51
69
|
|
|
@@ -9,9 +9,11 @@ import pytensor.link.numba.dispatch.nlinalg
|
|
|
9
9
|
import pytensor.link.numba.dispatch.random
|
|
10
10
|
import pytensor.link.numba.dispatch.scan
|
|
11
11
|
import pytensor.link.numba.dispatch.scalar
|
|
12
|
+
import pytensor.link.numba.dispatch.signal
|
|
12
13
|
import pytensor.link.numba.dispatch.slinalg
|
|
13
14
|
import pytensor.link.numba.dispatch.sparse
|
|
14
15
|
import pytensor.link.numba.dispatch.subtensor
|
|
15
16
|
import pytensor.link.numba.dispatch.tensor_basic
|
|
16
17
|
|
|
18
|
+
|
|
17
19
|
# isort: on
|