pytensor 2.28.2__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.2/pytensor.egg-info → pytensor-2.29.0}/PKG-INFO +1 -1
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/basic.rst +6 -9
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/_version.py +3 -3
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/function/pfunc.py +1 -7
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/mode.py +15 -7
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/configdefaults.py +3 -1
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/ifelse.py +1 -2
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/scan.py +1 -1
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/shape.py +1 -9
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/slinalg.py +24 -7
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/basic.py +0 -87
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/scan.py +32 -7
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/slinalg.py +18 -14
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/subtensor.py +60 -50
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/tensor_basic.py +0 -10
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/shape.py +1 -9
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/basic.py +5 -5
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/op.py +11 -2
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/rewriting.py +135 -100
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/utils.py +2 -2
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/basic.py +16 -31
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/blas.py +53 -42
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/c_code/dimshuffle.c +7 -2
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/einsum.py +13 -1
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/math.py +152 -128
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/basic.py +8 -1
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/blas.py +2 -2
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/shape.py +0 -77
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/subtensor.py +0 -37
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/shape.py +0 -116
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/slinalg.py +121 -34
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/subtensor.py +45 -17
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/utils.py +0 -8
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/variable.py +1 -1
- {pytensor-2.28.2 → pytensor-2.29.0/pytensor.egg-info}/PKG-INFO +1 -1
- {pytensor-2.28.2 → pytensor-2.29.0}/tests/test_rop.py +0 -8
- {pytensor-2.28.2 → pytensor-2.29.0}/LICENSE.txt +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/MANIFEST.in +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/README.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/.templates/layout.html +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/.templates/nb-badges.html +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/LICENSE.txt +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/README.md +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/acknowledgement.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/bcast.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/bcast.svg +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/blog.md +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/conf.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/core_development_guide.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/css.inc +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/dev_start_guide.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/environment.yml +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/apply.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/apply.svg +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/apply2.svg +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/ctype.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/extending_faq.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/graphstructures.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/index.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/inplace.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/op.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/other_ops.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/pipeline.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/scan.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/tips.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/type.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/unittest.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/extending/using_params.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/faq.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/gallery/page_footer.md +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/glossary.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/Elman_srnn.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/PyTensor.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/binder.svg +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/blocksparse.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/colab.svg +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/github.svg +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/lstm.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/talk2010.gif +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/images/talk2010.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/index.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/install.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/internal/how_to_release.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/internal/index.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/introduction.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/function.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/index.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/io.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/mode.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/ops.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/compile/shared.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/config.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/index.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/graph/features.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/graph/graph.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/graph/index.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/graph/op.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/graph/replace.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/graph/type.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/graph/utils.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/index.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/printing.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/scalar/index.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/scan.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/sparse/index.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/bcast.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/conv.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/fft.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/functional.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/index.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/io.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/random/distributions.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/random/index.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/tensor/utils.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/library/typed_list.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/links.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/optimizations.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/pylintrc +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/robots.txt +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/troubleshooting.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/adding.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/apply.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/apply.svg +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/bcast.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/conditions.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/examples.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/gradients.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/index.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/logistic.gp +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/logistic.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/loop.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/modes.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/prng.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/profiling.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/sparse.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/doc/user_guide.rst +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pyproject.toml +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/bin/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/breakpoint.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/builders.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/compiledir.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/compilelock.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/debugmode.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/function/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/function/types.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/io.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/monitormode.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/nanguardmode.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/ops.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/profiling.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/configparser.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/gradient.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/basic.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/features.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/fg.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/null_type.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/op.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/replace.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/type.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/graph/utils.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/basic.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/basic.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/cutils.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/cvm.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/interface.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/op.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/params_type.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/c/type.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/jax/linker.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/_LAPACK.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/blockwise.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/elemwise.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/random.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/scalar.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/sparse.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/numba/linker.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/basic.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/utils.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/link/vm.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/check_blas.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/frozendict.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/npy_2_compat.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/printing.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/py.typed +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/raise_op.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/basic.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/loop.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/math.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/scan/views.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/basic.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/sandbox/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/sandbox/sp.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/sandbox/sp2.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/type.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/sparse/utils.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/blas_c.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/blas_headers.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/blas_scipy.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/blockwise.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/conv/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/conv/abstract_conv.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/elemwise.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/extra_ops.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/fft.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/fourier.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/functional.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/inplace.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/io.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/linalg.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/nlinalg.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/pad.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/op.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/type.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/random/var.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/basic.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/elemwise.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/linalg.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/math.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/sort.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/special.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/type.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/type_other.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/var.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/typed_list/basic.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/typed_list/type.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/updates.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor/utils.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor.egg-info/SOURCES.txt +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor.egg-info/requires.txt +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/scripts/mypy-failing.txt +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/setup.cfg +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/setup.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/tests/test_breakpoint.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/tests/test_config.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/tests/test_gradient.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/tests/test_ifelse.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/tests/test_printing.py +0 -0
- {pytensor-2.28.2 → pytensor-2.29.0}/tests/test_raise_op.py +0 -0
- {pytensor-2.28.2 → 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
|
|
|
@@ -53,7 +71,6 @@ def jax_funcify_Solve(op, **kwargs):
|
|
|
53
71
|
@jax_funcify.register(SolveTriangular)
|
|
54
72
|
def jax_funcify_SolveTriangular(op, **kwargs):
|
|
55
73
|
lower = op.lower
|
|
56
|
-
trans = op.trans
|
|
57
74
|
unit_diagonal = op.unit_diagonal
|
|
58
75
|
check_finite = op.check_finite
|
|
59
76
|
|
|
@@ -62,7 +79,7 @@ def jax_funcify_SolveTriangular(op, **kwargs):
|
|
|
62
79
|
A,
|
|
63
80
|
b,
|
|
64
81
|
lower=lower,
|
|
65
|
-
trans=
|
|
82
|
+
trans=0, # this is handled by explicitly transposing A, so it will always be 0 when we get to here.
|
|
66
83
|
unit_diagonal=unit_diagonal,
|
|
67
84
|
check_finite=check_finite,
|
|
68
85
|
)
|
|
@@ -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
|
|
@@ -180,7 +181,6 @@ def solve_triangular_impl(A, B, trans, lower, unit_diagonal, b_ndim, overwrite_b
|
|
|
180
181
|
|
|
181
182
|
@numba_funcify.register(SolveTriangular)
|
|
182
183
|
def numba_funcify_SolveTriangular(op, node, **kwargs):
|
|
183
|
-
trans = bool(op.trans)
|
|
184
184
|
lower = op.lower
|
|
185
185
|
unit_diagonal = op.unit_diagonal
|
|
186
186
|
check_finite = op.check_finite
|
|
@@ -208,7 +208,7 @@ def numba_funcify_SolveTriangular(op, node, **kwargs):
|
|
|
208
208
|
res = _solve_triangular(
|
|
209
209
|
a,
|
|
210
210
|
b,
|
|
211
|
-
trans=
|
|
211
|
+
trans=0, # transposing is handled explicitly on the graph, so we never use this argument
|
|
212
212
|
lower=lower,
|
|
213
213
|
unit_diagonal=unit_diagonal,
|
|
214
214
|
overwrite_b=overwrite_b,
|
|
@@ -654,7 +654,7 @@ def solve_gen_impl(
|
|
|
654
654
|
|
|
655
655
|
def _sysv(
|
|
656
656
|
A: np.ndarray, B: np.ndarray, lower: bool, overwrite_a: bool, overwrite_b: bool
|
|
657
|
-
) -> tuple[np.ndarray, np.ndarray, int]:
|
|
657
|
+
) -> tuple[np.ndarray, np.ndarray, np.ndarray, int]:
|
|
658
658
|
"""
|
|
659
659
|
Placeholder for solving a linear system with a symmetric matrix; used by linalg.solve.
|
|
660
660
|
"""
|
|
@@ -665,7 +665,8 @@ def _sysv(
|
|
|
665
665
|
def sysv_impl(
|
|
666
666
|
A: np.ndarray, B: np.ndarray, lower: bool, overwrite_a: bool, overwrite_b: bool
|
|
667
667
|
) -> Callable[
|
|
668
|
-
[np.ndarray, np.ndarray, bool, bool, bool],
|
|
668
|
+
[np.ndarray, np.ndarray, bool, bool, bool],
|
|
669
|
+
tuple[np.ndarray, np.ndarray, np.ndarray, int],
|
|
669
670
|
]:
|
|
670
671
|
ensure_lapack()
|
|
671
672
|
_check_scipy_linalg_matrix(A, "sysv")
|
|
@@ -741,8 +742,8 @@ def sysv_impl(
|
|
|
741
742
|
)
|
|
742
743
|
|
|
743
744
|
if B_is_1d:
|
|
744
|
-
|
|
745
|
-
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)
|
|
746
747
|
|
|
747
748
|
return impl
|
|
748
749
|
|
|
@@ -771,7 +772,7 @@ def sycon_impl(
|
|
|
771
772
|
|
|
772
773
|
N = val_to_int_ptr(_N)
|
|
773
774
|
LDA = val_to_int_ptr(_N)
|
|
774
|
-
UPLO = val_to_int_ptr(ord("
|
|
775
|
+
UPLO = val_to_int_ptr(ord("U"))
|
|
775
776
|
ANORM = np.array(anorm, dtype=dtype)
|
|
776
777
|
RCOND = np.empty(1, dtype=dtype)
|
|
777
778
|
WORK = np.empty(2 * _N, dtype=dtype)
|
|
@@ -844,10 +845,10 @@ def solve_symmetric_impl(
|
|
|
844
845
|
) -> np.ndarray:
|
|
845
846
|
_solve_check_input_shapes(A, B)
|
|
846
847
|
|
|
847
|
-
x, ipiv, info = _sysv(A, B, lower, overwrite_a, overwrite_b)
|
|
848
|
+
lu, x, ipiv, info = _sysv(A, B, lower, overwrite_a, overwrite_b)
|
|
848
849
|
_solve_check(A.shape[-1], info)
|
|
849
850
|
|
|
850
|
-
rcond, info = _sycon(
|
|
851
|
+
rcond, info = _sycon(lu, ipiv, _xlange(A, order="I"))
|
|
851
852
|
_solve_check(A.shape[-1], info, True, rcond)
|
|
852
853
|
|
|
853
854
|
return x
|
|
@@ -1071,14 +1072,17 @@ def numba_funcify_Solve(op, node, **kwargs):
|
|
|
1071
1072
|
elif assume_a == "sym":
|
|
1072
1073
|
solve_fn = _solve_symmetric
|
|
1073
1074
|
elif assume_a == "her":
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
"please open an issue on github."
|
|
1077
|
-
)
|
|
1075
|
+
# We already ruled out complex inputs
|
|
1076
|
+
solve_fn = _solve_symmetric
|
|
1078
1077
|
elif assume_a == "pos":
|
|
1079
1078
|
solve_fn = _solve_psd
|
|
1080
1079
|
else:
|
|
1081
|
-
|
|
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
|
|
1082
1086
|
|
|
1083
1087
|
@numba_basic.numba_njit(inline="always")
|
|
1084
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
|
|