pytensor 2.28.3__tar.gz → 2.29.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.29.0}/PKG-INFO +1 -1
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/basic.rst +6 -9
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/_version.py +3 -3
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/compile/function/pfunc.py +1 -7
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/compile/mode.py +15 -7
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/configdefaults.py +3 -1
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/ifelse.py +1 -2
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/scan.py +1 -1
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/shape.py +1 -9
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/slinalg.py +23 -5
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/dispatch/basic.py +0 -87
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/dispatch/scan.py +32 -7
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/dispatch/slinalg.py +17 -12
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/dispatch/subtensor.py +60 -50
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/dispatch/tensor_basic.py +0 -10
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/shape.py +1 -9
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scan/basic.py +5 -5
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scan/op.py +11 -2
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scan/rewriting.py +135 -100
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scan/utils.py +2 -2
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/basic.py +16 -31
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/blas.py +53 -42
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/einsum.py +13 -1
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/math.py +152 -128
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/random/basic.py +8 -1
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/blas.py +2 -2
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/shape.py +0 -77
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/subtensor.py +0 -37
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/shape.py +0 -116
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/slinalg.py +98 -23
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/subtensor.py +45 -17
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/utils.py +0 -8
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/variable.py +1 -1
- {pytensor-2.28.3 → pytensor-2.29.0/pytensor.egg-info}/PKG-INFO +1 -1
- {pytensor-2.28.3 → pytensor-2.29.0}/tests/test_rop.py +0 -8
- {pytensor-2.28.3 → pytensor-2.29.0}/LICENSE.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/MANIFEST.in +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/README.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/.templates/layout.html +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/.templates/nb-badges.html +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/LICENSE.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/README.md +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/acknowledgement.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/bcast.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/bcast.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/blog.md +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/conf.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/core_development_guide.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/css.inc +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/dev_start_guide.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/environment.yml +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/apply.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/apply.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/apply2.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/ctype.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/extending_faq.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/graphstructures.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/inplace.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/op.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/other_ops.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/pipeline.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/scan.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/tips.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/type.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/unittest.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/extending/using_params.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/faq.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/gallery/page_footer.md +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/glossary.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/images/Elman_srnn.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/images/PyTensor.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/images/binder.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/images/blocksparse.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/images/colab.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/images/github.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/images/lstm.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/images/talk2010.gif +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/images/talk2010.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/install.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/internal/how_to_release.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/internal/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/introduction.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/compile/function.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/compile/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/compile/io.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/compile/mode.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/compile/ops.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/compile/shared.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/config.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/graph/features.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/graph/graph.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/graph/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/graph/op.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/graph/replace.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/graph/type.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/graph/utils.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/printing.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/scalar/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/scan.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/sparse/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/bcast.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/conv.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/fft.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/functional.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/io.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/random/distributions.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/random/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/tensor/utils.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/library/typed_list.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/links.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/optimizations.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/pylintrc +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/robots.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/troubleshooting.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/adding.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/apply.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/apply.svg +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/bcast.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/conditions.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/examples.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/gradients.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/index.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/logistic.gp +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/logistic.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/loop.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/modes.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/prng.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/profiling.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/sparse.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/doc/user_guide.rst +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pyproject.toml +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/bin/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/breakpoint.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/compile/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/compile/builders.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/compile/compiledir.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/compile/compilelock.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/compile/debugmode.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/compile/function/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/compile/function/types.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/compile/io.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/compile/monitormode.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/compile/nanguardmode.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/compile/ops.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/compile/profiling.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/configparser.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/gradient.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/graph/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/graph/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/graph/features.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/graph/fg.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/graph/null_type.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/graph/op.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/graph/replace.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/graph/type.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/graph/utils.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/c/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/c/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/c/cutils.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/c/cvm.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/c/interface.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/c/op.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/c/params_type.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/c/type.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/jax/linker.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/dispatch/_LAPACK.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/dispatch/blockwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/dispatch/elemwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/dispatch/random.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/dispatch/scalar.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/dispatch/sparse.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/numba/linker.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/utils.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/link/vm.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/misc/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/misc/check_blas.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/misc/frozendict.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/npy_2_compat.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/printing.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/py.typed +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/raise_op.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scalar/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scalar/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scalar/loop.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scalar/math.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scan/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/scan/views.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/sparse/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/sparse/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/sparse/sandbox/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/sparse/sandbox/sp.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/sparse/sandbox/sp2.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/sparse/type.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/sparse/utils.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/blas_c.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/blas_headers.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/blas_scipy.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/blockwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/c_code/dimshuffle.c +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/conv/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/conv/abstract_conv.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/elemwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/extra_ops.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/fft.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/fourier.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/functional.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/inplace.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/io.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/linalg.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/nlinalg.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/pad.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/random/op.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/random/type.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/random/var.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/elemwise.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/linalg.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/math.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/sort.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/special.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/type.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/type_other.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/var.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/typed_list/basic.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/typed_list/type.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/updates.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor/utils.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor.egg-info/SOURCES.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor.egg-info/requires.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/scripts/mypy-failing.txt +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/setup.cfg +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/setup.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/tests/test_breakpoint.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/tests/test_config.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/tests/test_gradient.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/tests/test_ifelse.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/tests/test_printing.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/tests/test_raise_op.py +0 -0
- {pytensor-2.28.3 → pytensor-2.29.0}/tests/test_updates.py +0 -0
|
@@ -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-18T14:02:26+0100",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.
|
|
14
|
+
"full-revisionid": "a149f6c996bd0499406150853bef517e7d7a3c4f",
|
|
15
|
+
"version": "2.29.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
|
|
|
@@ -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,
|
|
@@ -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
|
|
@@ -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
|
|
|
@@ -243,93 +243,6 @@ def impl_to_scalar(x):
|
|
|
243
243
|
raise TypingError(f"{x} must be a scalar compatible type.")
|
|
244
244
|
|
|
245
245
|
|
|
246
|
-
def enable_slice_literals():
|
|
247
|
-
"""Enable lowering for ``SliceLiteral``s.
|
|
248
|
-
|
|
249
|
-
TODO: This can be removed once https://github.com/numba/numba/pull/6996 is merged
|
|
250
|
-
and a release is made.
|
|
251
|
-
"""
|
|
252
|
-
from numba.core import types
|
|
253
|
-
from numba.core.datamodel.models import SliceModel
|
|
254
|
-
from numba.core.datamodel.registry import register_default
|
|
255
|
-
from numba.core.imputils import lower_cast, lower_constant
|
|
256
|
-
from numba.core.types.misc import SliceLiteral
|
|
257
|
-
from numba.cpython.slicing import get_defaults
|
|
258
|
-
|
|
259
|
-
register_default(numba.types.misc.SliceLiteral)(SliceModel)
|
|
260
|
-
|
|
261
|
-
@property
|
|
262
|
-
def key(self):
|
|
263
|
-
return self.name
|
|
264
|
-
|
|
265
|
-
SliceLiteral.key = key
|
|
266
|
-
|
|
267
|
-
def make_slice_from_constant(context, builder, ty, pyval):
|
|
268
|
-
sli = context.make_helper(builder, ty)
|
|
269
|
-
lty = context.get_value_type(types.intp)
|
|
270
|
-
|
|
271
|
-
(
|
|
272
|
-
default_start_pos,
|
|
273
|
-
default_start_neg,
|
|
274
|
-
default_stop_pos,
|
|
275
|
-
default_stop_neg,
|
|
276
|
-
default_step,
|
|
277
|
-
) = (context.get_constant(types.intp, x) for x in get_defaults(context))
|
|
278
|
-
|
|
279
|
-
step = pyval.step
|
|
280
|
-
if step is None:
|
|
281
|
-
step_is_neg = False
|
|
282
|
-
step = default_step
|
|
283
|
-
else:
|
|
284
|
-
step_is_neg = step < 0
|
|
285
|
-
step = lty(step)
|
|
286
|
-
|
|
287
|
-
start = pyval.start
|
|
288
|
-
if start is None:
|
|
289
|
-
if step_is_neg:
|
|
290
|
-
start = default_start_neg
|
|
291
|
-
else:
|
|
292
|
-
start = default_start_pos
|
|
293
|
-
else:
|
|
294
|
-
start = lty(start)
|
|
295
|
-
|
|
296
|
-
stop = pyval.stop
|
|
297
|
-
if stop is None:
|
|
298
|
-
if step_is_neg:
|
|
299
|
-
stop = default_stop_neg
|
|
300
|
-
else:
|
|
301
|
-
stop = default_stop_pos
|
|
302
|
-
else:
|
|
303
|
-
stop = lty(stop)
|
|
304
|
-
|
|
305
|
-
sli.start = start
|
|
306
|
-
sli.stop = stop
|
|
307
|
-
sli.step = step
|
|
308
|
-
|
|
309
|
-
return sli._getvalue()
|
|
310
|
-
|
|
311
|
-
@lower_constant(numba.types.SliceType)
|
|
312
|
-
def constant_slice(context, builder, ty, pyval):
|
|
313
|
-
if isinstance(ty, types.Literal):
|
|
314
|
-
typ = ty.literal_type
|
|
315
|
-
else:
|
|
316
|
-
typ = ty
|
|
317
|
-
|
|
318
|
-
return make_slice_from_constant(context, builder, typ, pyval)
|
|
319
|
-
|
|
320
|
-
@lower_cast(numba.types.misc.SliceLiteral, numba.types.SliceType)
|
|
321
|
-
def cast_from_literal(context, builder, fromty, toty, val):
|
|
322
|
-
return make_slice_from_constant(
|
|
323
|
-
context,
|
|
324
|
-
builder,
|
|
325
|
-
toty,
|
|
326
|
-
fromty.literal_value,
|
|
327
|
-
)
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
enable_slice_literals()
|
|
331
|
-
|
|
332
|
-
|
|
333
246
|
def create_tuple_creator(f, n):
|
|
334
247
|
"""Construct a compile-time ``tuple``-comprehension-like loop.
|
|
335
248
|
|
|
@@ -55,7 +55,7 @@ def array0d_range(x):
|
|
|
55
55
|
|
|
56
56
|
|
|
57
57
|
@numba_funcify.register(Scan)
|
|
58
|
-
def numba_funcify_Scan(op, node, **kwargs):
|
|
58
|
+
def numba_funcify_Scan(op: Scan, node, **kwargs):
|
|
59
59
|
# Apply inner rewrites
|
|
60
60
|
# TODO: Not sure this is the right place to do this, should we have a rewrite that
|
|
61
61
|
# explicitly triggers the optimization of the inner graphs of Scan?
|
|
@@ -67,9 +67,32 @@ def numba_funcify_Scan(op, node, **kwargs):
|
|
|
67
67
|
.optimizer
|
|
68
68
|
)
|
|
69
69
|
fgraph = op.fgraph
|
|
70
|
+
# When the buffer can only hold one SITSOT or as as many MITSOT as there are taps,
|
|
71
|
+
# We must always discard the oldest tap, so it's safe to destroy it in the inner function.
|
|
72
|
+
# TODO: Allow inplace for MITMOT
|
|
73
|
+
destroyable_sitsot = [
|
|
74
|
+
inner_sitsot
|
|
75
|
+
for outer_sitsot, inner_sitsot in zip(
|
|
76
|
+
op.outer_sitsot(node.inputs), op.inner_sitsot(fgraph.inputs), strict=True
|
|
77
|
+
)
|
|
78
|
+
if outer_sitsot.type.shape[0] == 1
|
|
79
|
+
]
|
|
80
|
+
destroyable_mitsot = [
|
|
81
|
+
oldest_inner_mitmot
|
|
82
|
+
for outer_mitsot, oldest_inner_mitmot, taps in zip(
|
|
83
|
+
op.outer_mitsot(node.inputs),
|
|
84
|
+
op.oldest_inner_mitsot(fgraph.inputs),
|
|
85
|
+
op.info.mit_sot_in_slices,
|
|
86
|
+
strict=True,
|
|
87
|
+
)
|
|
88
|
+
if outer_mitsot.type.shape[0] == abs(min(taps))
|
|
89
|
+
]
|
|
90
|
+
destroyable = {*destroyable_sitsot, *destroyable_mitsot}
|
|
70
91
|
add_supervisor_to_fgraph(
|
|
71
92
|
fgraph=fgraph,
|
|
72
|
-
input_specs=[
|
|
93
|
+
input_specs=[
|
|
94
|
+
In(x, borrow=True, mutable=x in destroyable) for x in fgraph.inputs
|
|
95
|
+
],
|
|
73
96
|
accept_inplace=True,
|
|
74
97
|
)
|
|
75
98
|
rewriter(fgraph)
|
|
@@ -222,14 +245,16 @@ def numba_funcify_Scan(op, node, **kwargs):
|
|
|
222
245
|
# the storage array.
|
|
223
246
|
# This is needed when the output storage array does not have a length
|
|
224
247
|
# equal to the number of taps plus `n_steps`.
|
|
248
|
+
# If the storage size only allows one entry, there's nothing to rotate
|
|
225
249
|
output_storage_post_proc_stmts.append(
|
|
226
250
|
dedent(
|
|
227
251
|
f"""
|
|
228
|
-
if (i + {tap_size})
|
|
252
|
+
if 1 < {storage_size} < (i + {tap_size}):
|
|
229
253
|
{outer_in_name}_shift = (i + {tap_size}) % ({storage_size})
|
|
230
|
-
{outer_in_name}
|
|
231
|
-
|
|
232
|
-
|
|
254
|
+
if {outer_in_name}_shift > 0:
|
|
255
|
+
{outer_in_name}_left = {outer_in_name}[:{outer_in_name}_shift]
|
|
256
|
+
{outer_in_name}_right = {outer_in_name}[{outer_in_name}_shift:]
|
|
257
|
+
{outer_in_name} = np.concatenate(({outer_in_name}_right, {outer_in_name}_left))
|
|
233
258
|
"""
|
|
234
259
|
).strip()
|
|
235
260
|
)
|
|
@@ -417,4 +442,4 @@ def scan({", ".join(outer_in_names)}):
|
|
|
417
442
|
|
|
418
443
|
scan_op_fn = compile_function_src(scan_op_src, "scan", {**globals(), **global_env})
|
|
419
444
|
|
|
420
|
-
return numba_basic.numba_njit(scan_op_fn)
|
|
445
|
+
return numba_basic.numba_njit(scan_op_fn, boundscheck=False)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import warnings
|
|
1
2
|
from collections.abc import Callable
|
|
2
3
|
|
|
3
4
|
import numba
|
|
@@ -653,7 +654,7 @@ def solve_gen_impl(
|
|
|
653
654
|
|
|
654
655
|
def _sysv(
|
|
655
656
|
A: np.ndarray, B: np.ndarray, lower: bool, overwrite_a: bool, overwrite_b: bool
|
|
656
|
-
) -> tuple[np.ndarray, np.ndarray, int]:
|
|
657
|
+
) -> tuple[np.ndarray, np.ndarray, np.ndarray, int]:
|
|
657
658
|
"""
|
|
658
659
|
Placeholder for solving a linear system with a symmetric matrix; used by linalg.solve.
|
|
659
660
|
"""
|
|
@@ -664,7 +665,8 @@ def _sysv(
|
|
|
664
665
|
def sysv_impl(
|
|
665
666
|
A: np.ndarray, B: np.ndarray, lower: bool, overwrite_a: bool, overwrite_b: bool
|
|
666
667
|
) -> Callable[
|
|
667
|
-
[np.ndarray, np.ndarray, bool, bool, bool],
|
|
668
|
+
[np.ndarray, np.ndarray, bool, bool, bool],
|
|
669
|
+
tuple[np.ndarray, np.ndarray, np.ndarray, int],
|
|
668
670
|
]:
|
|
669
671
|
ensure_lapack()
|
|
670
672
|
_check_scipy_linalg_matrix(A, "sysv")
|
|
@@ -740,8 +742,8 @@ def sysv_impl(
|
|
|
740
742
|
)
|
|
741
743
|
|
|
742
744
|
if B_is_1d:
|
|
743
|
-
|
|
744
|
-
return B_copy, IPIV, int_ptr_to_val(INFO)
|
|
745
|
+
B_copy = B_copy[..., 0]
|
|
746
|
+
return A_copy, B_copy, IPIV, int_ptr_to_val(INFO)
|
|
745
747
|
|
|
746
748
|
return impl
|
|
747
749
|
|
|
@@ -770,7 +772,7 @@ def sycon_impl(
|
|
|
770
772
|
|
|
771
773
|
N = val_to_int_ptr(_N)
|
|
772
774
|
LDA = val_to_int_ptr(_N)
|
|
773
|
-
UPLO = val_to_int_ptr(ord("
|
|
775
|
+
UPLO = val_to_int_ptr(ord("U"))
|
|
774
776
|
ANORM = np.array(anorm, dtype=dtype)
|
|
775
777
|
RCOND = np.empty(1, dtype=dtype)
|
|
776
778
|
WORK = np.empty(2 * _N, dtype=dtype)
|
|
@@ -843,10 +845,10 @@ def solve_symmetric_impl(
|
|
|
843
845
|
) -> np.ndarray:
|
|
844
846
|
_solve_check_input_shapes(A, B)
|
|
845
847
|
|
|
846
|
-
x, ipiv, info = _sysv(A, B, lower, overwrite_a, overwrite_b)
|
|
848
|
+
lu, x, ipiv, info = _sysv(A, B, lower, overwrite_a, overwrite_b)
|
|
847
849
|
_solve_check(A.shape[-1], info)
|
|
848
850
|
|
|
849
|
-
rcond, info = _sycon(
|
|
851
|
+
rcond, info = _sycon(lu, ipiv, _xlange(A, order="I"))
|
|
850
852
|
_solve_check(A.shape[-1], info, True, rcond)
|
|
851
853
|
|
|
852
854
|
return x
|
|
@@ -1070,14 +1072,17 @@ def numba_funcify_Solve(op, node, **kwargs):
|
|
|
1070
1072
|
elif assume_a == "sym":
|
|
1071
1073
|
solve_fn = _solve_symmetric
|
|
1072
1074
|
elif assume_a == "her":
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
"please open an issue on github."
|
|
1076
|
-
)
|
|
1075
|
+
# We already ruled out complex inputs
|
|
1076
|
+
solve_fn = _solve_symmetric
|
|
1077
1077
|
elif assume_a == "pos":
|
|
1078
1078
|
solve_fn = _solve_psd
|
|
1079
1079
|
else:
|
|
1080
|
-
|
|
1080
|
+
warnings.warn(
|
|
1081
|
+
f"Numba assume_a={assume_a} not implemented. Falling back to general solve.\n"
|
|
1082
|
+
f"If appropriate, you may want to set assume_a to one of 'sym', 'pos', or 'her' to improve performance.",
|
|
1083
|
+
UserWarning,
|
|
1084
|
+
)
|
|
1085
|
+
solve_fn = _solve_gen
|
|
1081
1086
|
|
|
1082
1087
|
@numba_basic.numba_njit(inline="always")
|
|
1083
1088
|
def solve(a, b):
|
|
@@ -130,15 +130,6 @@ def numba_funcify_AdvancedSubtensor(op, node, **kwargs):
|
|
|
130
130
|
if isinstance(idx.type, TensorType)
|
|
131
131
|
]
|
|
132
132
|
|
|
133
|
-
def broadcasted_to(x_bcast: tuple[bool, ...], to_bcast: tuple[bool, ...]):
|
|
134
|
-
# Check that x is not broadcasted to y based on broadcastable info
|
|
135
|
-
if len(x_bcast) < len(to_bcast):
|
|
136
|
-
return True
|
|
137
|
-
for x_bcast_dim, to_bcast_dim in zip(x_bcast, to_bcast, strict=True):
|
|
138
|
-
if x_bcast_dim and not to_bcast_dim:
|
|
139
|
-
return True
|
|
140
|
-
return False
|
|
141
|
-
|
|
142
133
|
# Special implementation for consecutive integer vector indices
|
|
143
134
|
if (
|
|
144
135
|
not basic_idxs
|
|
@@ -151,17 +142,6 @@ def numba_funcify_AdvancedSubtensor(op, node, **kwargs):
|
|
|
151
142
|
)
|
|
152
143
|
# Must be consecutive
|
|
153
144
|
and not op.non_consecutive_adv_indexing(node)
|
|
154
|
-
# y in set/inc_subtensor cannot be broadcasted
|
|
155
|
-
and (
|
|
156
|
-
y is None
|
|
157
|
-
or not broadcasted_to(
|
|
158
|
-
y.type.broadcastable,
|
|
159
|
-
(
|
|
160
|
-
x.type.broadcastable[: adv_idxs[0]["axis"]]
|
|
161
|
-
+ x.type.broadcastable[adv_idxs[-1]["axis"] :]
|
|
162
|
-
),
|
|
163
|
-
)
|
|
164
|
-
)
|
|
165
145
|
):
|
|
166
146
|
return numba_funcify_multiple_integer_vector_indexing(op, node, **kwargs)
|
|
167
147
|
|
|
@@ -191,14 +171,24 @@ def numba_funcify_AdvancedSubtensor(op, node, **kwargs):
|
|
|
191
171
|
return numba_funcify_default_subtensor(op, node, **kwargs)
|
|
192
172
|
|
|
193
173
|
|
|
174
|
+
def _broadcasted_to(x_bcast: tuple[bool, ...], to_bcast: tuple[bool, ...]):
|
|
175
|
+
# Check that x is not broadcasted to y based on broadcastable info
|
|
176
|
+
if len(x_bcast) < len(to_bcast):
|
|
177
|
+
return True
|
|
178
|
+
for x_bcast_dim, to_bcast_dim in zip(x_bcast, to_bcast, strict=True):
|
|
179
|
+
if x_bcast_dim and not to_bcast_dim:
|
|
180
|
+
return True
|
|
181
|
+
return False
|
|
182
|
+
|
|
183
|
+
|
|
194
184
|
def numba_funcify_multiple_integer_vector_indexing(
|
|
195
185
|
op: AdvancedSubtensor | AdvancedIncSubtensor, node, **kwargs
|
|
196
186
|
):
|
|
197
187
|
# Special-case implementation for multiple consecutive vector integer indices (and set/incsubtensor)
|
|
198
188
|
if isinstance(op, AdvancedSubtensor):
|
|
199
|
-
|
|
189
|
+
idxs = node.inputs[1:]
|
|
200
190
|
else:
|
|
201
|
-
|
|
191
|
+
idxs = node.inputs[2:]
|
|
202
192
|
|
|
203
193
|
first_axis = next(
|
|
204
194
|
i for i, idx in enumerate(idxs) if isinstance(idx.type, TensorType)
|
|
@@ -211,6 +201,10 @@ def numba_funcify_multiple_integer_vector_indexing(
|
|
|
211
201
|
)
|
|
212
202
|
except StopIteration:
|
|
213
203
|
after_last_axis = len(idxs)
|
|
204
|
+
last_axis = after_last_axis - 1
|
|
205
|
+
|
|
206
|
+
vector_indices = idxs[first_axis:after_last_axis]
|
|
207
|
+
assert all(v.type.broadcastable == (False,) for v in vector_indices)
|
|
214
208
|
|
|
215
209
|
if isinstance(op, AdvancedSubtensor):
|
|
216
210
|
|
|
@@ -231,43 +225,59 @@ def numba_funcify_multiple_integer_vector_indexing(
|
|
|
231
225
|
|
|
232
226
|
return advanced_subtensor_multiple_vector
|
|
233
227
|
|
|
234
|
-
|
|
228
|
+
else:
|
|
235
229
|
inplace = op.inplace
|
|
236
230
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
231
|
+
# Check if y must be broadcasted
|
|
232
|
+
# Includes the last integer vector index,
|
|
233
|
+
x, y = node.inputs[:2]
|
|
234
|
+
indexed_bcast_dims = (
|
|
235
|
+
*x.type.broadcastable[:first_axis],
|
|
236
|
+
*x.type.broadcastable[last_axis:],
|
|
237
|
+
)
|
|
238
|
+
y_is_broadcasted = _broadcasted_to(y.type.broadcastable, indexed_bcast_dims)
|
|
241
239
|
|
|
242
|
-
|
|
243
|
-
out = x
|
|
244
|
-
else:
|
|
245
|
-
out = x.copy()
|
|
240
|
+
if op.set_instead_of_inc:
|
|
246
241
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
242
|
+
@numba_njit
|
|
243
|
+
def advanced_set_subtensor_multiple_vector(x, y, *idxs):
|
|
244
|
+
vec_idxs = idxs[first_axis:after_last_axis]
|
|
245
|
+
x_shape = x.shape
|
|
251
246
|
|
|
252
|
-
|
|
247
|
+
if inplace:
|
|
248
|
+
out = x
|
|
249
|
+
else:
|
|
250
|
+
out = x.copy()
|
|
253
251
|
|
|
254
|
-
|
|
255
|
-
|
|
252
|
+
if y_is_broadcasted:
|
|
253
|
+
y = np.broadcast_to(y, x_shape[:first_axis] + x_shape[last_axis:])
|
|
256
254
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
255
|
+
for outer in np.ndindex(x_shape[:first_axis]):
|
|
256
|
+
for i, scalar_idxs in enumerate(zip(*vec_idxs)): # noqa: B905
|
|
257
|
+
out[(*outer, *scalar_idxs)] = y[(*outer, i)]
|
|
258
|
+
return out
|
|
259
|
+
|
|
260
|
+
return advanced_set_subtensor_multiple_vector
|
|
261
|
+
|
|
262
|
+
else:
|
|
263
|
+
|
|
264
|
+
@numba_njit
|
|
265
|
+
def advanced_inc_subtensor_multiple_vector(x, y, *idxs):
|
|
266
|
+
vec_idxs = idxs[first_axis:after_last_axis]
|
|
267
|
+
x_shape = x.shape
|
|
268
|
+
|
|
269
|
+
if inplace:
|
|
270
|
+
out = x
|
|
271
|
+
else:
|
|
272
|
+
out = x.copy()
|
|
261
273
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
else:
|
|
265
|
-
out = x.copy()
|
|
274
|
+
if y_is_broadcasted:
|
|
275
|
+
y = np.broadcast_to(y, x_shape[:first_axis] + x_shape[last_axis:])
|
|
266
276
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
277
|
+
for outer in np.ndindex(x_shape[:first_axis]):
|
|
278
|
+
for i, scalar_idxs in enumerate(zip(*vec_idxs)): # noqa: B905
|
|
279
|
+
out[(*outer, *scalar_idxs)] += y[(*outer, i)]
|
|
280
|
+
return out
|
|
271
281
|
|
|
272
282
|
return advanced_inc_subtensor_multiple_vector
|
|
273
283
|
|
|
@@ -17,7 +17,6 @@ from pytensor.tensor.basic import (
|
|
|
17
17
|
Split,
|
|
18
18
|
TensorFromScalar,
|
|
19
19
|
)
|
|
20
|
-
from pytensor.tensor.shape import Unbroadcast
|
|
21
20
|
|
|
22
21
|
|
|
23
22
|
@numba_funcify.register(AllocEmpty)
|
|
@@ -232,15 +231,6 @@ def makevector({", ".join(input_names)}):
|
|
|
232
231
|
return numba_basic.numba_njit(makevector_fn)
|
|
233
232
|
|
|
234
233
|
|
|
235
|
-
@numba_funcify.register(Unbroadcast)
|
|
236
|
-
def numba_funcify_Unbroadcast(op, **kwargs):
|
|
237
|
-
@numba_basic.numba_njit
|
|
238
|
-
def unbroadcast(x):
|
|
239
|
-
return x
|
|
240
|
-
|
|
241
|
-
return unbroadcast
|
|
242
|
-
|
|
243
|
-
|
|
244
234
|
@numba_funcify.register(TensorFromScalar)
|
|
245
235
|
def numba_funcify_TensorFromScalar(op, **kwargs):
|
|
246
236
|
@numba_basic.numba_njit(inline="always")
|
|
@@ -2,7 +2,7 @@ import torch
|
|
|
2
2
|
|
|
3
3
|
from pytensor.graph.basic import Constant
|
|
4
4
|
from pytensor.link.pytorch.dispatch.basic import pytorch_funcify
|
|
5
|
-
from pytensor.tensor.shape import Reshape, Shape, Shape_i, SpecifyShape
|
|
5
|
+
from pytensor.tensor.shape import Reshape, Shape, Shape_i, SpecifyShape
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
@pytorch_funcify.register(Reshape)
|
|
@@ -56,11 +56,3 @@ def pytorch_funcify_SpecifyShape(op, node, **kwargs):
|
|
|
56
56
|
return x
|
|
57
57
|
|
|
58
58
|
return specifyshape
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
@pytorch_funcify.register(Unbroadcast)
|
|
62
|
-
def pytorch_funcify_Unbroadcast(op, **kwargs):
|
|
63
|
-
def unbroadcast(x):
|
|
64
|
-
return x
|
|
65
|
-
|
|
66
|
-
return unbroadcast
|