pytensor 3.0.4__tar.gz → 3.0.5__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-3.0.4/pytensor.egg-info → pytensor-3.0.5}/PKG-INFO +1 -1
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/_version.py +3 -3
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/diagonal.py +7 -2
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/permutation.py +12 -7
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/selection.py +12 -6
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/debug/profiling.py +2 -1
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/basic.py +19 -24
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/fg.py +7 -2
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/elemwise.py +1 -1
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/sparse/math.py +5 -3
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/vectorize_codegen.py +23 -25
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/math.py +48 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/linalg/summary.py +11 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/math.py +61 -1
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/subtensor.py +19 -15
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/subtensor_lift.py +20 -17
- {pytensor-3.0.4 → pytensor-3.0.5/pytensor.egg-info}/PKG-INFO +1 -1
- {pytensor-3.0.4 → pytensor-3.0.5}/LICENSE.txt +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/MANIFEST.in +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/README.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/.templates/layout.html +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/.templates/nb-badges.html +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/LICENSE.txt +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/README.md +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/acknowledgement.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/bcast.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/bcast.svg +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/blog.md +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/conf.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/core_development_guide.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/css.inc +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/dev_start_guide.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/environment.yml +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/apply.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/apply.svg +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/apply2.svg +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/ctype.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/extending_faq.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/graphstructures.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/index.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/inplace.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/op.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/other_ops.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/pipeline.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/scan.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/tips.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/type.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/unittest.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/extending/using_params.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/faq.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/gallery/optimize/root.ipynb +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/gallery/page_footer.md +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/glossary.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/Elman_srnn.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/PyTensor.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/binder.svg +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/blocksparse.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/colab.svg +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/github.svg +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/lstm.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/talk2010.gif +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/images/talk2010.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/index.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/install.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/internal/how_to_release.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/internal/index.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/introduction.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/function.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/index.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/io.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/mode.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/ops.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/compile/shared.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/config.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/index.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/graph/features.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/graph/graph.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/graph/index.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/graph/op.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/graph/replace.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/graph/type.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/graph/utils.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/index.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/printing.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/scalar/index.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/scan.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/sparse/index.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/basic.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/bcast.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/fft.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/functional.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/index.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/io.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/linalg.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/optimize.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/random.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/tensor/utils.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/typed_list.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/xtensor/index.md +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/xtensor/linalg.md +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/xtensor/math.md +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/xtensor/module_functions.md +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/xtensor/random.md +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/xtensor/signal.md +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/library/xtensor/type.md +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/links.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/optimizations.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/pylintrc +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/robots.txt +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/troubleshooting.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/adding.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/apply.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/apply.svg +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/bcast.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/conditions.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/examples.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/gradients.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/index.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/logistic.gp +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/logistic.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/loop.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/modes.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/prng.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/profiling.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/sparse.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/doc/user_guide.rst +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pyproject.toml +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/_sparse_lazy.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/alloc.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/blockwise.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/core.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/dimshuffle.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/dot.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/elemwise.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/orthogonal.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/positive_definite.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/reshape.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/shape.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/specify.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/subtensor.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/symmetric.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/assumptions/triangular.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/bin/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/breakpoint.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/aliasing.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/builders.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/compiledir.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/compilelock.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/debug/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/debug/debugmode.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/debug/dump.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/debug/monitormode.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/debug/nanguardmode.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/executor.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/io.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/maker.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/mode.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/ops.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/rebuild.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/configdefaults.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/configparser.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/html/template.html +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/gradient.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/features.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/null_type.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/op.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/replace.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/traversal.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/type.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/graph/utils.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/ifelse.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/ipython.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/cutils.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/cvm.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/interface.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/op.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/params_type.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/c/type.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/linalg/constructors.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/linalg/products.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/linalg/solvers.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/linalg/summary.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/scan.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/linker.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/jax/ops.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/blas.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/blockwise.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/einsum.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/linalg/products.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/linalg/solvers.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/linalg/summary.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/math.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/pad.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/scalar.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/shape.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/sort.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/dispatch/tensor_basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/mlx/linker.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/cache.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/blockwise.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/compile_ops.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/constructors.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/dispatch.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/eigen.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/decomposition/svd.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/products.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/cholesky.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/dispatch.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/general.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/hermitian.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/linear_control.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/lu_solve.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/posdef.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/symmetric.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/tridiagonal.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/solvers/utils.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/summary.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/random.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/scalar.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/scan.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/shape.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/sort.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/sparse/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/sparse/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/sparse/variable.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/subtensor.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/dispatch/typed_list.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/numba/linker.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/linalg/products.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/linalg/summary.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/shape.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/utils.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/link/vm.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/check_blas.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/frozendict.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/npy_2_compat.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/printing.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/py.typed +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/raise_op.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/loop.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/math.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/op.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/rewriting/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/rewriting/db.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/rewriting/inplace.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/rewriting/io.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/rewriting/merge.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/rewriting/push_out.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/rewriting/trace.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/rewriting/utils.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/utils.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/scan/views.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/linalg.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/type.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/utils.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/sparse/variable.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/blas.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/blas_c.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/blas_headers.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/blockwise.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/c_code/dimshuffle.c +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/einsum.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/elemwise.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/extra_ops.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/fft.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/fourier.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/functional.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/_lazy.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/constructors.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/decomposition/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/decomposition/cholesky.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/decomposition/eigen.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/decomposition/lu.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/decomposition/qr.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/decomposition/schur.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/decomposition/svd.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/dtype_utils.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/inverse.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/products.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/solvers/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/solvers/core.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/solvers/general.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/solvers/linear_control.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/solvers/lstsq.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/solvers/psd.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/solvers/triangular.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/solvers/tridiagonal.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/linalg/summary.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/math.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/nlinalg.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/optimize.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/pad.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/op.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/type.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/random/variable.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/reshape.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/assumptions.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/blas.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/elemwise.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/indexed_elemwise.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/linalg/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/linalg/decomposition.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/linalg/inverse.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/linalg/products.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/linalg/solvers.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/linalg/utils.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/optimize.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/reshape.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/shape.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/shape.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/signal/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/signal/conv.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/slinalg.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/sort.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/special.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/subtensor.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/symbolic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/type.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/type_other.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/utils.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/var.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/variable.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/typed_list/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/typed_list/type.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/utils.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/indexing.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/linalg.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/math.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/random/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/random/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/random/type.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/random/variable.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/reduction.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/rewriting/__init__.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/rewriting/basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/rewriting/indexing.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/rewriting/math.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/rewriting/reduction.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/rewriting/shape.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/rewriting/utils.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/rewriting/vectorization.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/shape.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/signal.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/type.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor/xtensor/vectorization.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor.egg-info/SOURCES.txt +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor.egg-info/requires.txt +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/scripts/mypy-failing.txt +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/setup.cfg +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/setup.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/tests/test_basic.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/tests/test_breakpoint.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/tests/test_config.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/tests/test_gradient.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/tests/test_ifelse.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/tests/test_printing.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/tests/test_raise_op.py +0 -0
- {pytensor-3.0.4 → pytensor-3.0.5}/tests/test_rop.py +0 -0
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2026-06-
|
|
11
|
+
"date": "2026-06-11T03:57:58+0200",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "3.0.
|
|
14
|
+
"full-revisionid": "3411b300d7a120e7fb58b5ad5495391ddd74e189",
|
|
15
|
+
"version": "3.0.5"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -49,8 +49,13 @@ def _diagonal_from_constant(var: TensorConstant) -> FactState:
|
|
|
49
49
|
if m != n:
|
|
50
50
|
result = FactState.FALSE
|
|
51
51
|
else:
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
# Off-diagonal has a nonzero iff there are more nonzeros in ``data``
|
|
53
|
+
# than on its diagonal.
|
|
54
|
+
diag = np.diagonal(data, axis1=-2, axis2=-1)
|
|
55
|
+
if np.count_nonzero(data) == np.count_nonzero(diag):
|
|
56
|
+
result = FactState.TRUE
|
|
57
|
+
else:
|
|
58
|
+
result = FactState.FALSE
|
|
54
59
|
|
|
55
60
|
var.tag.is_diagonal = result
|
|
56
61
|
return result
|
|
@@ -38,13 +38,18 @@ def _permutation_from_constant(var: TensorConstant) -> FactState:
|
|
|
38
38
|
if data.ndim < 2 or data.shape[-1] != data.shape[-2]:
|
|
39
39
|
result = FactState.FALSE
|
|
40
40
|
else:
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
41
|
+
with np.errstate(invalid="ignore"):
|
|
42
|
+
if not (data.sum(axis=-2) == 1).all():
|
|
43
|
+
is_permutation = False
|
|
44
|
+
elif not (data.sum(axis=-1) == 1).all():
|
|
45
|
+
is_permutation = False
|
|
46
|
+
elif data.dtype.kind in "ub":
|
|
47
|
+
is_permutation = True
|
|
48
|
+
elif data.dtype.kind == "i":
|
|
49
|
+
is_permutation = data.min(initial=0) >= 0
|
|
50
|
+
else:
|
|
51
|
+
n = data.shape[-1]
|
|
52
|
+
is_permutation = np.count_nonzero(data) == (data.size // n if n else 0)
|
|
48
53
|
result = FactState.TRUE if is_permutation else FactState.FALSE
|
|
49
54
|
|
|
50
55
|
var.tag.is_permutation = result
|
|
@@ -28,12 +28,18 @@ def _selection_from_constant(var: TensorConstant) -> FactState:
|
|
|
28
28
|
if data.ndim < 2:
|
|
29
29
|
result = FactState.FALSE
|
|
30
30
|
else:
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
31
|
+
with np.errstate(invalid="ignore"):
|
|
32
|
+
if not (data.sum(axis=-2) == 1).all():
|
|
33
|
+
is_selection = False
|
|
34
|
+
elif data.dtype.kind in "ub":
|
|
35
|
+
is_selection = True
|
|
36
|
+
elif data.dtype.kind == "i":
|
|
37
|
+
is_selection = data.min(initial=0) >= 0
|
|
38
|
+
else:
|
|
39
|
+
n_rows = data.shape[-2]
|
|
40
|
+
is_selection = np.count_nonzero(data) == (
|
|
41
|
+
data.size // n_rows if n_rows else 0
|
|
42
|
+
)
|
|
37
43
|
result = FactState.TRUE if is_selection else FactState.FALSE
|
|
38
44
|
|
|
39
45
|
var.tag.is_selection = result
|
|
@@ -15,6 +15,7 @@ import operator
|
|
|
15
15
|
import sys
|
|
16
16
|
import time
|
|
17
17
|
from collections import Counter, defaultdict
|
|
18
|
+
from collections.abc import Callable
|
|
18
19
|
from contextlib import contextmanager
|
|
19
20
|
from pathlib import Path
|
|
20
21
|
from typing import Any
|
|
@@ -172,7 +173,7 @@ def print_global_stats():
|
|
|
172
173
|
print("=" * 50, file=f)
|
|
173
174
|
|
|
174
175
|
|
|
175
|
-
_profiler_printers = []
|
|
176
|
+
_profiler_printers: list[Callable] = []
|
|
176
177
|
|
|
177
178
|
|
|
178
179
|
def register_profiler_printer(fct):
|
|
@@ -820,40 +820,35 @@ def _make_frozen_output_reduce(out: Variable):
|
|
|
820
820
|
class FrozenApply(Apply):
|
|
821
821
|
"""An immutable, globally-interned Apply node for frozen graphs.
|
|
822
822
|
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
the cached instance.
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
823
|
+
``inputs`` and ``outputs`` are tuples, so mutating them raises ``TypeError``.
|
|
824
|
+
|
|
825
|
+
Instances are interned on ``(op, inputs, output_types)``: constructing one
|
|
826
|
+
with a matching key returns the cached instance. Constant inputs are keyed
|
|
827
|
+
by ``signature()`` (so equal-valued Constants share a node). Other inputs
|
|
828
|
+
are already globally interned, so identity is enough; the key stores their
|
|
829
|
+
``id()`` rather than the variables themselves, keeping strong references out
|
|
830
|
+
of the cache so chains of ``FrozenApply`` nodes collect in a single GC pass.
|
|
831
|
+
|
|
832
|
+
``output_types`` is in the key because frozen graphs root on
|
|
833
|
+
``NominalVariable`` inputs (index and type only). Nominalizing truncates the
|
|
834
|
+
root inputs, discarding the values and subgraphs an Op may have read to
|
|
835
|
+
derive its output type (e.g. via ``infer_shape``), so ``(op, inputs)`` alone
|
|
836
|
+
no longer pins it down.
|
|
830
837
|
"""
|
|
831
838
|
|
|
832
839
|
_cache: weakref.WeakValueDictionary = weakref.WeakValueDictionary()
|
|
833
840
|
|
|
834
|
-
@staticmethod
|
|
835
|
-
def _input_to_key(inp: Variable):
|
|
836
|
-
"""Convert an input Variable to a hashable, value-based cache key element.
|
|
837
|
-
|
|
838
|
-
Non-Constants (NominalVariables, FrozenApply outputs) are already
|
|
839
|
-
globally interned, so ``id()`` is a correct identity key. Using
|
|
840
|
-
``id()`` instead of the object itself avoids strong references in
|
|
841
|
-
cache keys that would prevent GC from collecting chains of
|
|
842
|
-
FrozenApply nodes in a single pass.
|
|
843
|
-
|
|
844
|
-
Constants use their ``signature()`` for value-based deduplication.
|
|
845
|
-
"""
|
|
846
|
-
if isinstance(inp, Constant):
|
|
847
|
-
return inp.signature()
|
|
848
|
-
return id(inp)
|
|
849
|
-
|
|
850
841
|
def __new__(
|
|
851
842
|
cls,
|
|
852
843
|
op: "Op",
|
|
853
844
|
inputs: tuple[Variable, ...],
|
|
854
845
|
output_types: tuple["Type", ...],
|
|
855
846
|
):
|
|
856
|
-
cache_key = (
|
|
847
|
+
cache_key = (
|
|
848
|
+
op,
|
|
849
|
+
tuple(i.signature() if isinstance(i, Constant) else id(i) for i in inputs),
|
|
850
|
+
output_types,
|
|
851
|
+
)
|
|
857
852
|
cached = cls._cache.get(cache_key)
|
|
858
853
|
if cached is not None:
|
|
859
854
|
return cached
|
|
@@ -1074,12 +1074,17 @@ class FrozenFunctionGraph(AbstractFunctionGraph):
|
|
|
1074
1074
|
self._clients = clients
|
|
1075
1075
|
return self._clients
|
|
1076
1076
|
|
|
1077
|
-
def bind(
|
|
1077
|
+
def bind(
|
|
1078
|
+
self, replace: Sequence[Variable] | dict[Variable, Variable]
|
|
1079
|
+
) -> list[Variable]:
|
|
1078
1080
|
"""Return fresh outputs with root inputs substituted per *replace*.
|
|
1079
1081
|
|
|
1080
1082
|
Constants are reused; any non-Constant input not in *replace* raises KeyError.
|
|
1081
1083
|
"""
|
|
1082
|
-
|
|
1084
|
+
if isinstance(replace, dict):
|
|
1085
|
+
memo = replace.copy()
|
|
1086
|
+
else:
|
|
1087
|
+
memo = dict(zip(self.inputs, replace))
|
|
1083
1088
|
for node in self.toposort():
|
|
1084
1089
|
for i in node.inputs:
|
|
1085
1090
|
if i not in memo:
|
|
@@ -136,7 +136,9 @@ def numba_funcify_SparseDot(op, node, **kwargs):
|
|
|
136
136
|
x_format = x.type.format if x_is_sparse else None
|
|
137
137
|
y_format = y.type.format if y_is_sparse else None
|
|
138
138
|
|
|
139
|
-
|
|
139
|
+
out_type = np.dtype(out_dtype).type
|
|
140
|
+
|
|
141
|
+
cache_version = 3
|
|
140
142
|
cache_key = sha256(
|
|
141
143
|
str(
|
|
142
144
|
(
|
|
@@ -371,7 +373,7 @@ def numba_funcify_SparseDot(op, node, **kwargs):
|
|
|
371
373
|
for row_idx in range(n):
|
|
372
374
|
for idx in range(x_ptr[row_idx], x_ptr[row_idx + 1]):
|
|
373
375
|
col_idx = x_ind[idx]
|
|
374
|
-
value = x_data[idx]
|
|
376
|
+
value = out_type(x_data[idx])
|
|
375
377
|
z[row_idx] += value * y[col_idx]
|
|
376
378
|
return z
|
|
377
379
|
|
|
@@ -390,7 +392,7 @@ def numba_funcify_SparseDot(op, node, **kwargs):
|
|
|
390
392
|
for col_idx in range(p):
|
|
391
393
|
for idx in range(x_ptr[col_idx], x_ptr[col_idx + 1]):
|
|
392
394
|
row_idx = x_ind[idx]
|
|
393
|
-
value = x_data[idx]
|
|
395
|
+
value = out_type(x_data[idx])
|
|
394
396
|
z[row_idx] += value * y[col_idx]
|
|
395
397
|
return z
|
|
396
398
|
|
|
@@ -964,32 +964,30 @@ def _vectorized(
|
|
|
964
964
|
if spec is None:
|
|
965
965
|
continue
|
|
966
966
|
indexed_axes = {src_axis: idx_k for idx_k, src_axis in spec}
|
|
967
|
-
n_indexed = len(indexed_axes)
|
|
968
967
|
n_index_loop_dims = max(idx_types[idx_k].ndim for idx_k, _ in spec)
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
iter_bc[p] = tuple(new_bc)
|
|
968
|
+
# An indexed input imposes no constraint on the loop dims produced by
|
|
969
|
+
# its indices: those are pinned by the index arrays' own iter_shape
|
|
970
|
+
# entries below. Mark each such loop dim broadcastable and copy the
|
|
971
|
+
# source shape for the non-indexed dims.
|
|
972
|
+
batch_ndim = len(input_bc_patterns[p])
|
|
973
|
+
max_axis = max(a for _, a in spec)
|
|
974
|
+
new_shape = []
|
|
975
|
+
new_bc = []
|
|
976
|
+
src_d = 0
|
|
977
|
+
idx_d = 0
|
|
978
|
+
for loop_d in range(batch_ndim):
|
|
979
|
+
if src_d in indexed_axes and idx_d < n_index_loop_dims:
|
|
980
|
+
new_shape.append(one)
|
|
981
|
+
new_bc.append(True)
|
|
982
|
+
idx_d += 1
|
|
983
|
+
if idx_d >= n_index_loop_dims:
|
|
984
|
+
src_d = max_axis + 1
|
|
985
|
+
else:
|
|
986
|
+
new_shape.append(in_shapes[p][src_d])
|
|
987
|
+
new_bc.append(iter_bc[p][loop_d])
|
|
988
|
+
src_d += 1
|
|
989
|
+
iter_shapes[p] = new_shape
|
|
990
|
+
iter_bc[p] = tuple(new_bc)
|
|
993
991
|
|
|
994
992
|
# Each index array participates in iter_shape validation.
|
|
995
993
|
# Write indices can broadcast against each other, but if ALL write
|
|
@@ -11,8 +11,10 @@ import pytensor.tensor.math as ptm
|
|
|
11
11
|
from pytensor import config
|
|
12
12
|
from pytensor.gradient import grad_not_implemented
|
|
13
13
|
from pytensor.graph import Apply, Op
|
|
14
|
+
from pytensor.graph.replace import _vectorize_node
|
|
14
15
|
from pytensor.link.c.op import COp
|
|
15
16
|
from pytensor.sparse.type import SparseTensorType
|
|
17
|
+
from pytensor.tensor.reshape import join_dims, split_dims
|
|
16
18
|
from pytensor.tensor.shape import specify_broadcastable
|
|
17
19
|
from pytensor.tensor.type import TensorType, Variable, complex_dtypes, tensor
|
|
18
20
|
|
|
@@ -2067,3 +2069,49 @@ class Usmm(Op):
|
|
|
2067
2069
|
|
|
2068
2070
|
|
|
2069
2071
|
usmm = Usmm()
|
|
2072
|
+
|
|
2073
|
+
|
|
2074
|
+
@_vectorize_node.register(StructuredDot)
|
|
2075
|
+
def _vectorize_structured_dot(op, node, batch_a, batch_b):
|
|
2076
|
+
"""Batch StructuredDot(sparse_const, dense): (m,k)@(B...,k,n) -> (B...,m,n).
|
|
2077
|
+
|
|
2078
|
+
The sparse left input must stay unbatched (scipy has no batched-sparse
|
|
2079
|
+
type). The dense right input may gain any number of leading batch dims;
|
|
2080
|
+
we fold them through the existing 2D StructuredDot with a moveaxis +
|
|
2081
|
+
join_dims / split_dims round trip.
|
|
2082
|
+
"""
|
|
2083
|
+
a, b = node.inputs
|
|
2084
|
+
if batch_a.type.ndim != a.type.ndim:
|
|
2085
|
+
raise NotImplementedError(
|
|
2086
|
+
"Cannot vectorize StructuredDot when the sparse (left) input is "
|
|
2087
|
+
"batched; scipy has no batched-sparse type."
|
|
2088
|
+
)
|
|
2089
|
+
|
|
2090
|
+
if batch_b.type.ndim == b.type.ndim:
|
|
2091
|
+
# No batch dims added to the dense input — rebuild the op as-is.
|
|
2092
|
+
return op.make_node(batch_a, batch_b).outputs
|
|
2093
|
+
|
|
2094
|
+
# batch_b is (B1,...,BN, k, n). Move k to the front and fold the batch
|
|
2095
|
+
# dims and n into a single column axis: (k, B1*...*BN*n).
|
|
2096
|
+
moved = ptb.moveaxis(batch_b, -2, 0) # (k, B1,...,BN, n)
|
|
2097
|
+
trailing = moved.shape[1:]
|
|
2098
|
+
flat_b = join_dims(moved, start_axis=1) # (k, B*n)
|
|
2099
|
+
|
|
2100
|
+
flat_out = op.make_node(batch_a, flat_b).outputs[0] # (m, B*n)
|
|
2101
|
+
|
|
2102
|
+
# Unfold the column axis and move m back into the (-2) slot.
|
|
2103
|
+
unflat = split_dims(flat_out, shape=trailing, axis=1) # (m, B1,...,BN, n)
|
|
2104
|
+
out = ptb.moveaxis(unflat, 0, -2) # (B1,...,BN, m, n)
|
|
2105
|
+
return [out]
|
|
2106
|
+
|
|
2107
|
+
|
|
2108
|
+
def _vectorize_sparse_unsupported(op, node, *batched_inputs):
|
|
2109
|
+
raise NotImplementedError(
|
|
2110
|
+
f"Cannot vectorize {type(op).__name__}: scipy has no batched-sparse "
|
|
2111
|
+
"representation, so the sparse operand cannot be broadcast against a "
|
|
2112
|
+
"batched dense input."
|
|
2113
|
+
)
|
|
2114
|
+
|
|
2115
|
+
|
|
2116
|
+
for _op_cls in (AddSD, SparseDenseMultiply):
|
|
2117
|
+
_vectorize_node.register(_op_cls)(_vectorize_sparse_unsupported)
|
|
@@ -18,6 +18,7 @@ from pytensor.tensor.linalg.decomposition.cholesky import Cholesky
|
|
|
18
18
|
from pytensor.tensor.linalg.decomposition.lu import LU, LUFactor
|
|
19
19
|
from pytensor.tensor.linalg.decomposition.qr import QR
|
|
20
20
|
from pytensor.tensor.linalg.decomposition.svd import SVD
|
|
21
|
+
from pytensor.tensor.linalg.inverse import MatrixInverse
|
|
21
22
|
from pytensor.tensor.linalg.summary import SLogDet, det
|
|
22
23
|
from pytensor.tensor.math import Prod, log, prod
|
|
23
24
|
from pytensor.tensor.rewriting.basic import (
|
|
@@ -192,6 +193,16 @@ def det_of_triangular(fgraph, node):
|
|
|
192
193
|
return [det_val]
|
|
193
194
|
|
|
194
195
|
|
|
196
|
+
@register_canonicalize
|
|
197
|
+
@register_stabilize
|
|
198
|
+
@node_rewriter([det])
|
|
199
|
+
def det_of_inv(fgraph, node):
|
|
200
|
+
"""Replace det(matrix_inverse(X)) with reciprocal(det(X))."""
|
|
201
|
+
match node.inputs[0].owner_op_and_inputs:
|
|
202
|
+
case (Blockwise(MatrixInverse()), X):
|
|
203
|
+
return [1 / det(X)]
|
|
204
|
+
|
|
205
|
+
|
|
195
206
|
@register_specialize
|
|
196
207
|
@node_rewriter([det])
|
|
197
208
|
def slogdet_specialization(fgraph, node):
|
|
@@ -112,7 +112,7 @@ from pytensor.tensor.rewriting.basic import (
|
|
|
112
112
|
from pytensor.tensor.rewriting.blockwise import blockwise_of
|
|
113
113
|
from pytensor.tensor.rewriting.elemwise import apply_local_dimshuffle_lift
|
|
114
114
|
from pytensor.tensor.shape import Shape, Shape_i, specify_shape
|
|
115
|
-
from pytensor.tensor.subtensor import Subtensor
|
|
115
|
+
from pytensor.tensor.subtensor import Subtensor, _is_provably_positive
|
|
116
116
|
from pytensor.tensor.type import (
|
|
117
117
|
complex_dtypes,
|
|
118
118
|
uint_dtypes,
|
|
@@ -689,6 +689,66 @@ def local_exp_log_nan_switch(fgraph, node):
|
|
|
689
689
|
return [new_out]
|
|
690
690
|
|
|
691
691
|
|
|
692
|
+
@register_canonicalize
|
|
693
|
+
@register_stabilize
|
|
694
|
+
@register_specialize
|
|
695
|
+
@node_rewriter([log])
|
|
696
|
+
def local_log_div(fgraph, node):
|
|
697
|
+
"""Rewrite log(reciprocal(x)) -> -log(x) and log(a / b) -> log(a) - log(b).
|
|
698
|
+
|
|
699
|
+
A reciprocal is just ``1 / x``; log(a / b) only splits when a positive
|
|
700
|
+
constant operand is involved, so its log folds and the op count stays flat.
|
|
701
|
+
"""
|
|
702
|
+
(inp,) = node.inputs
|
|
703
|
+
if not (inp.owner and isinstance(inp.owner.op, Elemwise)):
|
|
704
|
+
return None
|
|
705
|
+
scalar_op = inp.owner.op.scalar_op
|
|
706
|
+
|
|
707
|
+
if isinstance(scalar_op, ps.Reciprocal):
|
|
708
|
+
return [neg(log(inp.owner.inputs[0]))]
|
|
709
|
+
|
|
710
|
+
if isinstance(scalar_op, ps.TrueDiv):
|
|
711
|
+
num, den = inp.owner.inputs
|
|
712
|
+
if (isinstance(num, Constant) and _is_provably_positive(num, strict=True)) or (
|
|
713
|
+
isinstance(den, Constant) and _is_provably_positive(den, strict=True)
|
|
714
|
+
):
|
|
715
|
+
return [log(num) - log(den)]
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
@register_canonicalize
|
|
719
|
+
@register_stabilize
|
|
720
|
+
@register_specialize
|
|
721
|
+
@node_rewriter([sign])
|
|
722
|
+
def local_sign_div(fgraph, node):
|
|
723
|
+
"""Rewrite sign of a reciprocal or division from a known-sign operand.
|
|
724
|
+
|
|
725
|
+
sign(reciprocal(x)) -> sign(x). For sign(a / b): a provably positive side ->
|
|
726
|
+
``sign(other)``; a negative constant side -> ``-sign(other)``. Bails out
|
|
727
|
+
otherwise.
|
|
728
|
+
"""
|
|
729
|
+
(inp,) = node.inputs
|
|
730
|
+
if not (inp.owner and isinstance(inp.owner.op, Elemwise)):
|
|
731
|
+
return None
|
|
732
|
+
scalar_op = inp.owner.op.scalar_op
|
|
733
|
+
|
|
734
|
+
if isinstance(scalar_op, ps.Reciprocal):
|
|
735
|
+
return [sign(inp.owner.inputs[0])]
|
|
736
|
+
|
|
737
|
+
if not isinstance(scalar_op, ps.TrueDiv):
|
|
738
|
+
return None
|
|
739
|
+
|
|
740
|
+
num, den = inp.owner.inputs
|
|
741
|
+
|
|
742
|
+
if _is_provably_positive(num, strict=True):
|
|
743
|
+
return [sign(den)]
|
|
744
|
+
if _is_provably_positive(den, strict=True):
|
|
745
|
+
return [sign(num)]
|
|
746
|
+
|
|
747
|
+
for side, other in ((num, den), (den, num)):
|
|
748
|
+
if isinstance(side, Constant) and np.all(np.asarray(side.data) < 0):
|
|
749
|
+
return [neg(sign(other))]
|
|
750
|
+
|
|
751
|
+
|
|
692
752
|
@register_canonicalize
|
|
693
753
|
@register_specialize
|
|
694
754
|
@node_rewriter([Sum])
|
|
@@ -2738,22 +2738,26 @@ def local_blockwise_inc_subtensor(fgraph, node):
|
|
|
2738
2738
|
idxs_core_ndim = [len(inp_sig) for inp_sig in node.op.inputs_sig[2:]]
|
|
2739
2739
|
max_idx_core_ndim = max(idxs_core_ndim, default=0)
|
|
2740
2740
|
|
|
2741
|
-
# Broadcast buffer to batch_shape
|
|
2742
|
-
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
|
|
2746
|
-
|
|
2747
|
-
|
|
2748
|
-
|
|
2749
|
-
|
|
2750
|
-
|
|
2751
|
-
|
|
2752
|
-
|
|
2753
|
-
|
|
2754
|
-
|
|
2741
|
+
# Broadcast buffer to batch_shape. The output batch shape and broadcast
|
|
2742
|
+
# pattern are derived from the inputs, never from `out.type`, which can be
|
|
2743
|
+
# stale after an upstream rewrite swaps an input.
|
|
2744
|
+
batch_shape = [1] * batch_ndim
|
|
2745
|
+
out_batch_bcast = [True] * batch_ndim
|
|
2746
|
+
for inp in node.inputs:
|
|
2747
|
+
for i, (broadcastable, batch_dim) in enumerate(
|
|
2748
|
+
zip(inp.type.broadcastable[:batch_ndim], tuple(inp.shape)[:batch_ndim])
|
|
2749
|
+
):
|
|
2750
|
+
if broadcastable:
|
|
2751
|
+
# This dimension is broadcastable, it doesn't provide shape information
|
|
2752
|
+
continue
|
|
2753
|
+
out_batch_bcast[i] = False
|
|
2754
|
+
if batch_shape[i] != 1:
|
|
2755
|
+
# We already found a source of shape for this batch dimension
|
|
2756
|
+
continue
|
|
2757
|
+
batch_shape[i] = batch_dim
|
|
2758
|
+
|
|
2759
|
+
if list(x.type.broadcastable[:batch_ndim]) != out_batch_bcast:
|
|
2755
2760
|
x = broadcast_to(x, (*batch_shape, *x.shape[batch_ndim:]))
|
|
2756
|
-
assert x.type.broadcastable == out.type.broadcastable
|
|
2757
2761
|
|
|
2758
2762
|
# Massage indices so they respect blockwise semantics while using regular indexing
|
|
2759
2763
|
core_idxs = []
|
|
@@ -567,8 +567,13 @@ def local_subtensor_of_expand_dims(fgraph, node):
|
|
|
567
567
|
|
|
568
568
|
idx_tuple = indices_from_subtensor(idx, node.op.idx_list)
|
|
569
569
|
|
|
570
|
-
# Keep indexes for the original dimensions, and drop indexes for the expanded
|
|
570
|
+
# Keep indexes for the original dimensions, and drop indexes for the expanded
|
|
571
|
+
# dimensions when safe. We also track where each kept expanded dimension lands
|
|
572
|
+
# in the output (`out_pos`), so it can be re-introduced with expand_dims below.
|
|
573
|
+
# These axes are derived from the indices, not the (possibly stale) output type.
|
|
571
574
|
new_idxs = []
|
|
575
|
+
expand_axes = []
|
|
576
|
+
out_pos = 0
|
|
572
577
|
for i, idx_item in enumerate(idx_tuple):
|
|
573
578
|
if i in expanded_axes:
|
|
574
579
|
if isinstance(idx_item, slice):
|
|
@@ -576,6 +581,8 @@ def local_subtensor_of_expand_dims(fgraph, node):
|
|
|
576
581
|
if idx_item == slice(None):
|
|
577
582
|
# A None slice, always keeps the dimension.
|
|
578
583
|
# We skip the index, and later introduce the needed expand_dim
|
|
584
|
+
expand_axes.append(out_pos)
|
|
585
|
+
out_pos += 1
|
|
579
586
|
continue
|
|
580
587
|
else:
|
|
581
588
|
# Other slices could keep or drop the dimension.
|
|
@@ -589,27 +596,23 @@ def local_subtensor_of_expand_dims(fgraph, node):
|
|
|
589
596
|
else:
|
|
590
597
|
# Keep indexes for non-expanded dimensions
|
|
591
598
|
new_idxs.append(idx_item)
|
|
599
|
+
# An integer index drops the dimension; any slice keeps one.
|
|
600
|
+
if isinstance(idx_item, slice):
|
|
601
|
+
out_pos += 1
|
|
602
|
+
|
|
603
|
+
# Trailing dimensions beyond the explicit indices are implicit full slices;
|
|
604
|
+
# the expanded ones among them must also be re-introduced.
|
|
605
|
+
for axis in range(len(idx_tuple), ds.type.ndim):
|
|
606
|
+
if axis in expanded_axes:
|
|
607
|
+
expand_axes.append(out_pos)
|
|
608
|
+
out_pos += 1
|
|
592
609
|
|
|
593
610
|
[old_out] = node.outputs
|
|
594
611
|
out = x[tuple(new_idxs)]
|
|
612
|
+
if expand_axes:
|
|
613
|
+
out = expand_dims(out, axis=expand_axes)
|
|
595
614
|
copy_stack_trace(old_out, out)
|
|
596
615
|
|
|
597
|
-
if out.type.broadcastable != old_out.type.broadcastable:
|
|
598
|
-
# Re-introduce needed new dimensions (corresponding to full slices on the original expanded dimensions)
|
|
599
|
-
# If out.type.broadcastable == (False) and old_out.type.broadcastable == (True, False, True)
|
|
600
|
-
# then axis = (0, 2)
|
|
601
|
-
old_bcast = list(old_out.type.broadcastable)
|
|
602
|
-
expanded_bcast = list(out.type.broadcastable)
|
|
603
|
-
axis = []
|
|
604
|
-
i = 0
|
|
605
|
-
while i < len(old_bcast):
|
|
606
|
-
if i == len(expanded_bcast) or expanded_bcast[i] != old_bcast[i]:
|
|
607
|
-
expanded_bcast.insert(i, True)
|
|
608
|
-
axis.append(i)
|
|
609
|
-
i += 1
|
|
610
|
-
out = expand_dims(out, axis=axis)
|
|
611
|
-
copy_stack_trace(old_out, out)
|
|
612
|
-
|
|
613
616
|
return [out]
|
|
614
617
|
|
|
615
618
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|