pytensor 3.3.2__tar.gz → 3.3.3__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.3.2/pytensor.egg-info → pytensor-3.3.3}/PKG-INFO +1 -1
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/gallery/introduction/pytensor_intro.ipynb +2 -2
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/prng.rst +1 -1
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/_version.py +3 -3
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/tensor_basic.py +8 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/linker.py +2 -2
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/ops.py +37 -7
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/blockwise.py +24 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/decomposition.py +10 -4
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/inverse.py +2 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/solvers.py +25 -6
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/summary.py +6 -4
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/pad.py +20 -2
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/shape.py +15 -3
- pytensor-3.3.3/pytensor/link/mlx/dispatch/sort.py +52 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/subtensor.py +21 -3
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/tensor_basic.py +22 -21
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/basic.py +7 -1
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/linker.py +2 -2
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/rewriting/numba.py +2 -2
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/variable.py +2 -1
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/summary.py +1 -1
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/random/variable.py +1 -1
- {pytensor-3.3.2 → pytensor-3.3.3/pytensor.egg-info}/PKG-INFO +1 -1
- pytensor-3.3.2/pytensor/link/mlx/dispatch/sort.py +0 -38
- {pytensor-3.3.2 → pytensor-3.3.3}/LICENSE.txt +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/MANIFEST.in +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/README.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/.templates/layout.html +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/.templates/nb-badges.html +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/LICENSE.txt +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/README.md +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/acknowledgement.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/bcast.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/bcast.svg +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/blog.md +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/conf.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/core_development_guide.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/css.inc +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/dev_start_guide.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/environment.yml +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/apply.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/apply.svg +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/apply2.svg +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/ctype.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/extending_faq.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/graphstructures.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/index.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/inplace.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/op.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/other_ops.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/pipeline.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/scan.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/tips.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/type.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/unification_kanren.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/unittest.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/extending/using_params.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/faq.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/gallery/applications/tiny_transformer_llm.ipynb +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/gallery/optimize/root.ipynb +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/gallery/page_footer.md +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/glossary.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/Elman_srnn.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/PyTensor.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/binder.svg +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/blocksparse.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/colab.svg +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/github.svg +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/lstm.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/talk2010.gif +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/images/talk2010.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/index.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/install.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/internal/how_to_release.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/internal/index.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/introduction.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/function.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/index.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/io.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/mode.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/ops.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/compile/shared.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/config.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/index.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/features.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/graph.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/index.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/op.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/replace.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/traversal.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/type.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/graph/utils.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/index.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/printing.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/scalar/index.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/scan.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/sparse/index.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/basic.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/bcast.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/fft.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/functional.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/index.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/io.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/linalg.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/optimize.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/random.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/tensor/utils.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/typed_list.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/xtensor/index.md +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/xtensor/linalg.md +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/xtensor/math.md +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/xtensor/module_functions.md +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/xtensor/random.md +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/xtensor/signal.md +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/library/xtensor/type.md +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/links.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/optimizations.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/pylintrc +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/robots.txt +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/troubleshooting.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/adding.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/apply.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/apply.svg +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/bcast.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/conditions.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/examples.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/gradients.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/index.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/logistic.gp +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/logistic.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/loop.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/modes.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/profiling.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/sparse.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/doc/user_guide.rst +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pyproject.toml +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/_sparse_lazy.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/alloc.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/blockwise.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/core.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/diagonal.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/dimshuffle.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/dot.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/elemwise.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/orthogonal.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/permutation.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/positive_definite.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/reshape.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/selection.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/shape.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/specify.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/subtensor.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/symmetric.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/assumptions/triangular.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/bin/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/breakpoint.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/aliasing.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/builders.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/compiledir.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/compilelock.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/debug/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/debug/debugmode.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/debug/dump.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/debug/monitormode.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/debug/nanguardmode.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/debug/profiling.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/executor.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/inner_function.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/io.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/maker.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/mode.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/ops.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/rebuild.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/rewriting.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/configdefaults.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/configparser.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/html/template.html +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/gradient.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/features.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/fg.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/null_type.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/op.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/replace.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/rewriting/reachability.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/traversal.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/type.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/graph/utils.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/ifelse.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/ipython.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/cutils.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/cvm.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/interface.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/op.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/params_type.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/c/type.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/constructors.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/products.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/solvers.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/summary.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/scan.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/blas.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/einsum.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/products.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/math.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/random.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/bessel.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/beta.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/erf.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/erfcinv.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/gamma.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/gammainc.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/helpers.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/math.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/mlx/linker.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/cache.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/_llvmlite_self_ref.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/_patch_list_to_tuple.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/_patch_pointer_add.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/blockwise.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/compile_ops.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/elemwise.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/_BLAS.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/constructors.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/dispatch.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/eigen.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/svd.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/products.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/cholesky.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/dispatch.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/general.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/hermitian.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/linear_control.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/lu_solve.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/posdef.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/symmetric.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/tridiagonal.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/utils.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/summary.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/random.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/scalar.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/scan.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/shape.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sort.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sparse/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sparse/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sparse/math.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sparse/variable.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/subtensor.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/typed_list.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/numba/linker.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/products.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/summary.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/shape.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/utils.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/link/vm.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/check_blas.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/frozendict.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/npy_2_compat.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/printing.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/py.typed +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/raise_op.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/loop.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/math.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/op.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/db.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/inner_graph.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/inplace.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/io.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/merge.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/push_out.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/trace.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/rewriting/utils.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/utils.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/scan/views.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/linalg.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/math.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/type.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/utils.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/sparse/variable.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/_core.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/batched.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/blas_c.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/alt_blas_common.h +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/alt_blas_template.c +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/blas_headers.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/codegen.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/gemm.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/gemv.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blas/ger.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/blockwise.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/einsum.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/elemwise.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/extra_ops.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/fft.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/fourier.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/functional.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/_lazy.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/constructors.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/cholesky.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/eigen.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/lu.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/qr.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/schur.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/svd.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/dtype_utils.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/inverse.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/products.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/core.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/general.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/linear_control.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/lstsq.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/psd.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/triangular.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/tridiagonal.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/linalg/summary.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/math.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/nlinalg.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/optimize.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/pad.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/op.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/type.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/reshape.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/assumptions.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/blas.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/elemwise.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/fused_elemwise.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/decomposition.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/inverse.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/products.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/solvers.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/utils.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/math.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/optimize.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/reshape.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/shape.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/subtensor.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/shape.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/signal/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/signal/conv.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/slinalg.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/sort.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/special.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/subtensor.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/symbolic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/type.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/type_other.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/utils.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/var.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/variable.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/typed_list/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/typed_list/type.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/utils.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/indexing.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/linalg.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/math.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/random/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/random/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/random/type.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/reduction.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/rewriting/__init__.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/rewriting/basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/rewriting/indexing.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/rewriting/math.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/rewriting/reduction.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/rewriting/shape.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/rewriting/utils.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/rewriting/vectorization.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/shape.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/signal.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/type.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor/xtensor/vectorization.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor.egg-info/SOURCES.txt +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor.egg-info/requires.txt +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/scripts/mypy-failing.txt +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/setup.cfg +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/setup.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/tests/test_basic.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/tests/test_breakpoint.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/tests/test_config.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/tests/test_gradient.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/tests/test_ifelse.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/tests/test_printing.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/tests/test_raise_op.py +0 -0
- {pytensor-3.3.2 → pytensor-3.3.3}/tests/test_rop.py +0 -0
|
@@ -877,7 +877,7 @@
|
|
|
877
877
|
"text": [
|
|
878
878
|
"Exp [id A]\n",
|
|
879
879
|
" └─ normal_rv{\"(),()->()\"}.1 [id B]\n",
|
|
880
|
-
" ├─ RNG(
|
|
880
|
+
" ├─ RNG(Generator(PCG64)) [id C]\n",
|
|
881
881
|
" ├─ [10] [id D]\n",
|
|
882
882
|
" ├─ ExpandDims{axis=0} [id E]\n",
|
|
883
883
|
" │ └─ 0 [id F]\n",
|
|
@@ -1495,7 +1495,7 @@
|
|
|
1495
1495
|
"output_type": "stream",
|
|
1496
1496
|
"text": [
|
|
1497
1497
|
"normal_rv{\"(),()->()\"}.1 [id A] 'z'\n",
|
|
1498
|
-
" ├─ RNG(
|
|
1498
|
+
" ├─ RNG(Generator(PCG64)) [id B]\n",
|
|
1499
1499
|
" ├─ NoneConst{None} [id C]\n",
|
|
1500
1500
|
" ├─ [0 0] [id D]\n",
|
|
1501
1501
|
" └─ [1 2] [id E]\n"
|
|
@@ -568,7 +568,7 @@ In general, update rules are still respected, but they won't update/rely on the
|
|
|
568
568
|
>>> jax_fn = pytensor.function([], [x], updates={rng: next_rng}, mode="JAX")
|
|
569
569
|
>>> _ = pytensor.dprint(jax_fn, print_type=True) # doctest: +ELLIPSIS
|
|
570
570
|
uniform_rv{"(),()->()"}.1 [id A] <Scalar(float64, shape=())> 0
|
|
571
|
-
├─ RNG(
|
|
571
|
+
├─ RNG(Generator(PCG64)) [id B] <RandomGeneratorType>
|
|
572
572
|
├─ NoneConst{None} [id C] <NoneTypeT>
|
|
573
573
|
├─ 0.0 [id D] <Scalar(float32, shape=())>
|
|
574
574
|
└─ 1.0 [id E] <Scalar(float32, shape=())>
|
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2026-
|
|
11
|
+
"date": "2026-10-01T22:39:01+0200",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "3.3.
|
|
14
|
+
"full-revisionid": "259987437e5efea3678a7d632af90d366c8fd9a2",
|
|
15
|
+
"version": "3.3.3"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -14,6 +14,7 @@ from pytensor.tensor.basic import (
|
|
|
14
14
|
Eye,
|
|
15
15
|
Join,
|
|
16
16
|
MakeVector,
|
|
17
|
+
Nonzero,
|
|
17
18
|
ScalarFromTensor,
|
|
18
19
|
Split,
|
|
19
20
|
TensorFromScalar,
|
|
@@ -32,6 +33,13 @@ An example of a graph that can be compiled to JAX:
|
|
|
32
33
|
"""
|
|
33
34
|
|
|
34
35
|
|
|
36
|
+
@jax_funcify.register(Nonzero)
|
|
37
|
+
def jax_funcify_Nonzero(op, **kwargs):
|
|
38
|
+
raise NotImplementedError(
|
|
39
|
+
"JAX does not support nonzero, its output shape is data-dependent"
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
35
43
|
@jax_funcify.register(AllocEmpty)
|
|
36
44
|
def jax_funcify_AllocEmpty(op, **kwargs):
|
|
37
45
|
def allocempty(*shape):
|
|
@@ -21,8 +21,8 @@ class JAXLinker(JITLinker):
|
|
|
21
21
|
# JAX does it his own inplace optimization
|
|
22
22
|
"inplace",
|
|
23
23
|
# There are specific variants for the LU decompositions supported by JAX
|
|
24
|
-
"
|
|
25
|
-
"
|
|
24
|
+
"reuse_decomposition_multiple_solves",
|
|
25
|
+
"scan_split_non_sequence_decomposition_and_solve",
|
|
26
26
|
)
|
|
27
27
|
|
|
28
28
|
scalar_shape_inputs: tuple[int, ...]
|
|
@@ -10,7 +10,7 @@ from pytensor.compile.mode import Mode
|
|
|
10
10
|
from pytensor.gradient import DisconnectedType
|
|
11
11
|
from pytensor.graph import Apply, Op, Variable
|
|
12
12
|
from pytensor.tensor.basic import as_tensor, infer_static_shape
|
|
13
|
-
from pytensor.tensor.type import TensorType
|
|
13
|
+
from pytensor.tensor.type import TensorType, discrete_dtypes
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class JAXOp(Op):
|
|
@@ -135,6 +135,13 @@ class JAXOp(Op):
|
|
|
135
135
|
return outputs[0]
|
|
136
136
|
return outputs
|
|
137
137
|
|
|
138
|
+
def connection_pattern(self, node):
|
|
139
|
+
"""Mark discrete inputs as disconnected from every output."""
|
|
140
|
+
return [
|
|
141
|
+
[input_type.dtype not in discrete_dtypes] * len(self.output_types)
|
|
142
|
+
for input_type in self.input_types
|
|
143
|
+
]
|
|
144
|
+
|
|
138
145
|
def pullback(self, inputs, outputs, output_gradients):
|
|
139
146
|
"""Compute gradients using JAX's vector-Jacobian product (VJP)."""
|
|
140
147
|
import jax
|
|
@@ -146,6 +153,15 @@ class JAXOp(Op):
|
|
|
146
153
|
if not isinstance(output_grad.type, DisconnectedType)
|
|
147
154
|
]
|
|
148
155
|
|
|
156
|
+
# Integer and boolean inputs are not differentiable. JAX gives them
|
|
157
|
+
# float0 cotangents, which have no PyTensor equivalent, so they are
|
|
158
|
+
# held constant in the VJP and reported as disconnected.
|
|
159
|
+
differentiable_input_indices = [
|
|
160
|
+
i
|
|
161
|
+
for i, input_type in enumerate(self.input_types)
|
|
162
|
+
if input_type.dtype not in discrete_dtypes
|
|
163
|
+
]
|
|
164
|
+
|
|
149
165
|
num_inputs = len(inputs)
|
|
150
166
|
|
|
151
167
|
def vjp_operation(*args):
|
|
@@ -154,15 +170,23 @@ class JAXOp(Op):
|
|
|
154
170
|
cotangent_vectors = args[num_inputs:]
|
|
155
171
|
assert len(cotangent_vectors) == len(connected_output_indices)
|
|
156
172
|
|
|
157
|
-
def restricted_function(*
|
|
158
|
-
"""Restricted function
|
|
159
|
-
|
|
173
|
+
def restricted_function(*differentiable_values):
|
|
174
|
+
"""Restricted function of the differentiable inputs, returning connected outputs."""
|
|
175
|
+
all_input_values = list(input_values)
|
|
176
|
+
for i, value in zip(
|
|
177
|
+
differentiable_input_indices, differentiable_values, strict=True
|
|
178
|
+
):
|
|
179
|
+
all_input_values[i] = value
|
|
180
|
+
outputs = self.jax_func(*all_input_values)
|
|
160
181
|
return [
|
|
161
182
|
outputs[i].astype(self.output_types[i].dtype)
|
|
162
183
|
for i in connected_output_indices
|
|
163
184
|
]
|
|
164
185
|
|
|
165
|
-
_primals, vjp_function = jax.vjp(
|
|
186
|
+
_primals, vjp_function = jax.vjp(
|
|
187
|
+
restricted_function,
|
|
188
|
+
*(input_values[i] for i in differentiable_input_indices),
|
|
189
|
+
)
|
|
166
190
|
output_dtypes = [
|
|
167
191
|
self.output_types[i].dtype for i in connected_output_indices
|
|
168
192
|
]
|
|
@@ -184,15 +208,21 @@ class JAXOp(Op):
|
|
|
184
208
|
vjp_op = JAXOp(
|
|
185
209
|
self.input_types
|
|
186
210
|
+ tuple(self.output_types[i] for i in connected_output_indices),
|
|
187
|
-
[self.input_types[i] for i in
|
|
211
|
+
[self.input_types[i] for i in differentiable_input_indices],
|
|
188
212
|
vjp_operation,
|
|
189
213
|
name=name,
|
|
190
214
|
)
|
|
191
215
|
|
|
192
|
-
|
|
216
|
+
differentiable_input_gradients = vjp_op(
|
|
193
217
|
*[*inputs, *[output_gradients[i] for i in connected_output_indices]],
|
|
194
218
|
return_list=True,
|
|
195
219
|
)
|
|
220
|
+
input_gradients = [DisconnectedType()() for _ in inputs]
|
|
221
|
+
for i, input_gradient in zip(
|
|
222
|
+
differentiable_input_indices, differentiable_input_gradients, strict=True
|
|
223
|
+
):
|
|
224
|
+
input_gradients[i] = input_gradient
|
|
225
|
+
return input_gradients
|
|
196
226
|
|
|
197
227
|
|
|
198
228
|
def wrap_jax(jax_function=None, *, allow_eval=True):
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import mlx.core as mx
|
|
2
|
+
import numpy as np
|
|
2
3
|
|
|
3
4
|
from pytensor.link.mlx.dispatch import mlx_funcify
|
|
4
5
|
from pytensor.tensor.blockwise import Blockwise, _check_runtime_broadcast_core
|
|
@@ -19,6 +20,29 @@ def funcify_Blockwise(op: Blockwise, node, **kwargs):
|
|
|
19
20
|
# Hoisted out of the per-call path, unlike Blockwise._check_runtime_broadcast.
|
|
20
21
|
batch_bcast = [inp.type.broadcastable[:batch_ndim] for inp in node.inputs]
|
|
21
22
|
|
|
23
|
+
# A core function that sets `natively_batched` runs directly on inputs
|
|
24
|
+
# broadcast to the common batch shape. MLX's linalg functions take leading
|
|
25
|
+
# batch dims themselves, and mx.vmap has no rule for LUF or QRF and drops the
|
|
26
|
+
# triangular flags of solve_triangular.
|
|
27
|
+
if getattr(core_f, "natively_batched", False):
|
|
28
|
+
|
|
29
|
+
def blockwise_native(*args):
|
|
30
|
+
_check_runtime_broadcast_core(args, batch_bcast, batch_ndim)
|
|
31
|
+
|
|
32
|
+
batch_shapes = [
|
|
33
|
+
arg.shape[: arg.ndim - n_core] for arg, n_core in zip(args, core_ndims)
|
|
34
|
+
]
|
|
35
|
+
batch_shape = np.broadcast_shapes(*batch_shapes)
|
|
36
|
+
args = [
|
|
37
|
+
mx.broadcast_to(arg, (*batch_shape, *arg.shape[arg.ndim - n_core :]))
|
|
38
|
+
for arg, n_core in zip(args, core_ndims)
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
out = core_f(*args)
|
|
42
|
+
return tuple(out) if multi_output else out
|
|
43
|
+
|
|
44
|
+
return blockwise_native
|
|
45
|
+
|
|
22
46
|
# Decide batching purely from static shapes so a graph batches identically
|
|
23
47
|
# here and in every other backend: a batch axis broadcasts (is never mapped)
|
|
24
48
|
# only when its static size is exactly 1, or the input lacks it entirely.
|
|
@@ -29,10 +29,9 @@ def mlx_funcify_SVD(op, node, **kwargs):
|
|
|
29
29
|
)
|
|
30
30
|
return outputs
|
|
31
31
|
|
|
32
|
-
if compute_uv
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
return svd_S_only
|
|
32
|
+
svd = svd_full if compute_uv else svd_S_only
|
|
33
|
+
svd.natively_batched = True
|
|
34
|
+
return svd
|
|
36
35
|
|
|
37
36
|
|
|
38
37
|
@mlx_funcify.register(Cholesky)
|
|
@@ -45,6 +44,7 @@ def mlx_funcify_Cholesky(op, node, **kwargs):
|
|
|
45
44
|
a.astype(dtype=a_dtype, stream=mx.cpu), upper=not lower, stream=mx.cpu
|
|
46
45
|
)
|
|
47
46
|
|
|
47
|
+
cholesky.natively_batched = True
|
|
48
48
|
return cholesky
|
|
49
49
|
|
|
50
50
|
|
|
@@ -70,6 +70,7 @@ def mlx_funcify_LU(op, node, **kwargs):
|
|
|
70
70
|
U,
|
|
71
71
|
)
|
|
72
72
|
|
|
73
|
+
lu.natively_batched = True
|
|
73
74
|
return lu
|
|
74
75
|
|
|
75
76
|
|
|
@@ -80,6 +81,7 @@ def mlx_funcify_Eig(op, node, **kwargs):
|
|
|
80
81
|
def eig(x):
|
|
81
82
|
return mx.linalg.eig(x.astype(dtype=X_dtype, stream=mx.cpu), stream=mx.cpu)
|
|
82
83
|
|
|
84
|
+
eig.natively_batched = True
|
|
83
85
|
return eig
|
|
84
86
|
|
|
85
87
|
|
|
@@ -99,6 +101,7 @@ def mlx_funcify_Eigh(op, node, **kwargs):
|
|
|
99
101
|
a.astype(dtype=X_dtype, stream=mx.cpu), UPLO=UPLO, stream=mx.cpu
|
|
100
102
|
)
|
|
101
103
|
|
|
104
|
+
eigh.natively_batched = True
|
|
102
105
|
return eigh
|
|
103
106
|
|
|
104
107
|
|
|
@@ -118,6 +121,7 @@ def mlx_funcify_Eigvalsh(op, node, **kwargs):
|
|
|
118
121
|
a.astype(dtype=X_dtype, stream=mx.cpu), UPLO=UPLO, stream=mx.cpu
|
|
119
122
|
)
|
|
120
123
|
|
|
124
|
+
eigvalsh.natively_batched = True
|
|
121
125
|
return eigvalsh
|
|
122
126
|
|
|
123
127
|
|
|
@@ -131,6 +135,7 @@ def mlx_funcify_LUFactor(op, node, **kwargs):
|
|
|
131
135
|
)
|
|
132
136
|
return lu, pivots.astype(mx.int32, stream=mx.cpu)
|
|
133
137
|
|
|
138
|
+
lu_factor.natively_batched = True
|
|
134
139
|
return lu_factor
|
|
135
140
|
|
|
136
141
|
|
|
@@ -174,4 +179,5 @@ def mlx_funcify_QR(op, node, **kwargs):
|
|
|
174
179
|
return R
|
|
175
180
|
return Q, R
|
|
176
181
|
|
|
182
|
+
qr.natively_batched = True
|
|
177
183
|
return qr
|
|
@@ -11,6 +11,7 @@ def mlx_funcify_MatrixInverse(op, node, **kwargs):
|
|
|
11
11
|
def inv(x):
|
|
12
12
|
return mx.linalg.inv(x.astype(dtype=X_dtype, stream=mx.cpu), stream=mx.cpu)
|
|
13
13
|
|
|
14
|
+
inv.natively_batched = True
|
|
14
15
|
return inv
|
|
15
16
|
|
|
16
17
|
|
|
@@ -21,4 +22,5 @@ def mlx_funcify_MatrixPinv(op, node, **kwargs):
|
|
|
21
22
|
def pinv(x):
|
|
22
23
|
return mx.linalg.pinv(x.astype(dtype=x_dtype, stream=mx.cpu), stream=mx.cpu)
|
|
23
24
|
|
|
25
|
+
pinv.natively_batched = True
|
|
24
26
|
return pinv
|
|
@@ -8,6 +8,15 @@ from pytensor.tensor.linalg.solvers.psd import CholeskySolve
|
|
|
8
8
|
from pytensor.tensor.linalg.solvers.triangular import SolveTriangular
|
|
9
9
|
|
|
10
10
|
|
|
11
|
+
def _as_column(b, b_ndim):
|
|
12
|
+
# MLX treats a 2-d rhs as a matrix, so a batched vector rhs needs an explicit column.
|
|
13
|
+
return mx.expand_dims(b, -1, stream=mx.cpu) if b_ndim == 1 else b
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _from_column(out, b_ndim):
|
|
17
|
+
return mx.squeeze(out, -1, stream=mx.cpu) if b_ndim == 1 else out
|
|
18
|
+
|
|
19
|
+
|
|
11
20
|
@mlx_funcify.register(Solve)
|
|
12
21
|
def mlx_funcify_Solve(op, node, **kwargs):
|
|
13
22
|
assume_a = op.assume_a
|
|
@@ -20,13 +29,17 @@ def mlx_funcify_Solve(op, node, **kwargs):
|
|
|
20
29
|
UserWarning,
|
|
21
30
|
)
|
|
22
31
|
|
|
32
|
+
b_ndim = op.b_ndim
|
|
33
|
+
|
|
23
34
|
def solve(a, b):
|
|
24
|
-
|
|
35
|
+
out = mx.linalg.solve(
|
|
25
36
|
a.astype(stream=mx.cpu, dtype=a_dtype),
|
|
26
|
-
b.astype(stream=mx.cpu, dtype=b_dtype),
|
|
37
|
+
_as_column(b.astype(stream=mx.cpu, dtype=b_dtype), b_ndim),
|
|
27
38
|
stream=mx.cpu,
|
|
28
39
|
)
|
|
40
|
+
return _from_column(out, b_ndim)
|
|
29
41
|
|
|
42
|
+
solve.natively_batched = True
|
|
30
43
|
return solve
|
|
31
44
|
|
|
32
45
|
|
|
@@ -36,6 +49,7 @@ def mlx_funcify_SolveTriangular(op, node, **kwargs):
|
|
|
36
49
|
unit_diagonal = op.unit_diagonal
|
|
37
50
|
A_dtype = getattr(mx, node.inputs[0].dtype)
|
|
38
51
|
b_dtype = getattr(mx, node.inputs[1].dtype)
|
|
52
|
+
b_ndim = op.b_ndim
|
|
39
53
|
|
|
40
54
|
def solve_triangular(A, b):
|
|
41
55
|
A = A.astype(stream=mx.cpu, dtype=A_dtype)
|
|
@@ -47,13 +61,15 @@ def mlx_funcify_SolveTriangular(op, node, **kwargs):
|
|
|
47
61
|
diagonal_mask = mx.eye(A.shape[-1], dtype=mx.bool_, stream=mx.cpu)
|
|
48
62
|
A = mx.where(diagonal_mask, mx.array(1, dtype=A_dtype), A, stream=mx.cpu)
|
|
49
63
|
|
|
50
|
-
|
|
64
|
+
out = mx.linalg.solve_triangular(
|
|
51
65
|
A,
|
|
52
|
-
b.astype(stream=mx.cpu, dtype=b_dtype),
|
|
66
|
+
_as_column(b.astype(stream=mx.cpu, dtype=b_dtype), b_ndim),
|
|
53
67
|
upper=not lower,
|
|
54
68
|
stream=mx.cpu,
|
|
55
69
|
)
|
|
70
|
+
return _from_column(out, b_ndim)
|
|
56
71
|
|
|
72
|
+
solve_triangular.natively_batched = True
|
|
57
73
|
return solve_triangular
|
|
58
74
|
|
|
59
75
|
|
|
@@ -62,15 +78,18 @@ def mlx_funcify_CholeskySolve(op, node, **kwargs):
|
|
|
62
78
|
lower = op.lower
|
|
63
79
|
c_dtype = getattr(mx, node.inputs[0].dtype)
|
|
64
80
|
b_dtype = getattr(mx, node.inputs[1].dtype)
|
|
81
|
+
b_ndim = op.b_ndim
|
|
65
82
|
|
|
66
83
|
# MLX has no cho_solve, so with A = L L.T we solve L y = b then L.T x = y.
|
|
67
84
|
def cho_solve(c, b):
|
|
68
85
|
c = c.astype(stream=mx.cpu, dtype=c_dtype)
|
|
69
|
-
b = b.astype(stream=mx.cpu, dtype=b_dtype)
|
|
86
|
+
b = _as_column(b.astype(stream=mx.cpu, dtype=b_dtype), b_ndim)
|
|
70
87
|
c_T = mx.swapaxes(c, -1, -2, stream=mx.cpu)
|
|
71
88
|
L, L_T = (c, c_T) if lower else (c_T, c)
|
|
72
89
|
|
|
73
90
|
y = mx.linalg.solve_triangular(L, b, upper=False, stream=mx.cpu)
|
|
74
|
-
|
|
91
|
+
out = mx.linalg.solve_triangular(L_T, y, upper=True, stream=mx.cpu)
|
|
92
|
+
return _from_column(out, b_ndim)
|
|
75
93
|
|
|
94
|
+
cho_solve.natively_batched = True
|
|
76
95
|
return cho_solve
|
|
@@ -7,11 +7,11 @@ from pytensor.tensor.linalg.summary import Det, SLogDet
|
|
|
7
7
|
def _lu_det_parts(x):
|
|
8
8
|
"""Compute sign and logdet via LU factorization. Call within a CPU stream context."""
|
|
9
9
|
lu, pivots = mx.linalg.lu_factor(x)
|
|
10
|
-
diag_u = mx.diagonal(lu)
|
|
11
|
-
n_swaps = mx.sum(pivots != mx.arange(pivots.shape[
|
|
10
|
+
diag_u = mx.diagonal(lu, axis1=-2, axis2=-1)
|
|
11
|
+
n_swaps = mx.sum(pivots != mx.arange(pivots.shape[-1], dtype=pivots.dtype), axis=-1)
|
|
12
12
|
pivot_sign = 1 - 2 * (n_swaps % 2)
|
|
13
|
-
sign = pivot_sign * mx.prod(mx.sign(diag_u))
|
|
14
|
-
logabsdet = mx.sum(mx.log(mx.abs(diag_u)))
|
|
13
|
+
sign = pivot_sign * mx.prod(mx.sign(diag_u), axis=-1)
|
|
14
|
+
logabsdet = mx.sum(mx.log(mx.abs(diag_u)), axis=-1)
|
|
15
15
|
return sign, logabsdet
|
|
16
16
|
|
|
17
17
|
|
|
@@ -24,6 +24,7 @@ def mlx_funcify_Det(op, node, **kwargs):
|
|
|
24
24
|
sign, logabsdet = _lu_det_parts(x.astype(dtype=X_dtype))
|
|
25
25
|
return sign * mx.exp(logabsdet)
|
|
26
26
|
|
|
27
|
+
det.natively_batched = True
|
|
27
28
|
return det
|
|
28
29
|
|
|
29
30
|
|
|
@@ -35,4 +36,5 @@ def mlx_funcify_SLogDet(op, node, **kwargs):
|
|
|
35
36
|
with mx.stream(mx.cpu):
|
|
36
37
|
return _lu_det_parts(x.astype(dtype=X_dtype))
|
|
37
38
|
|
|
39
|
+
slogdet.natively_batched = True
|
|
38
40
|
return slogdet
|
|
@@ -1,12 +1,27 @@
|
|
|
1
1
|
import mlx.core as mx
|
|
2
|
+
import numpy as np
|
|
2
3
|
|
|
3
4
|
from pytensor.link.mlx.dispatch.basic import mlx_funcify
|
|
5
|
+
from pytensor.link.mlx.dispatch.tensor_basic import mlx_to_list_shape
|
|
4
6
|
from pytensor.tensor.pad import Pad
|
|
5
7
|
|
|
6
8
|
|
|
9
|
+
def _runtime_pad_width_pairs(pad_width, ndim):
|
|
10
|
+
widths = np.array(mlx_to_list_shape(pad_width.flatten())).reshape(pad_width.shape)
|
|
11
|
+
widths = np.broadcast_to(widths, (ndim, 2))
|
|
12
|
+
return [tuple(pair) for pair in widths.tolist()]
|
|
13
|
+
|
|
14
|
+
|
|
7
15
|
@mlx_funcify.register(Pad)
|
|
8
16
|
def mlx_funcify_pad(op, node, **kwargs):
|
|
9
17
|
pad_mode = op.pad_mode
|
|
18
|
+
ndim = node.inputs[0].type.ndim
|
|
19
|
+
static_pairs = None if op.static_pad_width is None else list(op.static_pad_width)
|
|
20
|
+
|
|
21
|
+
def pad_width_pairs(pad_width):
|
|
22
|
+
if static_pairs is not None:
|
|
23
|
+
return static_pairs
|
|
24
|
+
return _runtime_pad_width_pairs(pad_width, ndim)
|
|
10
25
|
|
|
11
26
|
if pad_mode == "constant":
|
|
12
27
|
_, _, constant_values = node.inputs
|
|
@@ -18,7 +33,10 @@ def mlx_funcify_pad(op, node, **kwargs):
|
|
|
18
33
|
|
|
19
34
|
def constant_pad_fn(x, pad_width, constant_values):
|
|
20
35
|
return mx.pad(
|
|
21
|
-
x,
|
|
36
|
+
x,
|
|
37
|
+
pad_width_pairs(pad_width),
|
|
38
|
+
mode="constant",
|
|
39
|
+
constant_values=constant_values,
|
|
22
40
|
)
|
|
23
41
|
|
|
24
42
|
return constant_pad_fn
|
|
@@ -26,7 +44,7 @@ def mlx_funcify_pad(op, node, **kwargs):
|
|
|
26
44
|
elif pad_mode == "edge":
|
|
27
45
|
|
|
28
46
|
def edge_pad_fn(x, pad_width):
|
|
29
|
-
return mx.pad(x, pad_width, mode="edge")
|
|
47
|
+
return mx.pad(x, pad_width_pairs(pad_width), mode="edge")
|
|
30
48
|
|
|
31
49
|
return edge_pad_fn
|
|
32
50
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import mlx.core as mx
|
|
2
2
|
|
|
3
|
+
from pytensor.graph import Constant
|
|
3
4
|
from pytensor.link.mlx.dispatch.basic import mlx_funcify
|
|
5
|
+
from pytensor.link.mlx.dispatch.tensor_basic import mlx_to_list_shape
|
|
4
6
|
from pytensor.tensor.shape import Reshape, Shape, Shape_i, SpecifyShape
|
|
5
7
|
|
|
6
8
|
|
|
@@ -37,8 +39,18 @@ def mlx_funcify_Shape_i(op, node, **kwargs):
|
|
|
37
39
|
|
|
38
40
|
|
|
39
41
|
@mlx_funcify.register(Reshape)
|
|
40
|
-
def mlx_funcify_Reshape(op, **kwargs):
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
def mlx_funcify_Reshape(op, node, **kwargs):
|
|
43
|
+
shape = node.inputs[1]
|
|
44
|
+
|
|
45
|
+
if isinstance(shape, Constant):
|
|
46
|
+
constant_shape = tuple(int(dim) for dim in shape.data)
|
|
47
|
+
|
|
48
|
+
def reshape(x, shp):
|
|
49
|
+
return mx.reshape(x, constant_shape)
|
|
50
|
+
|
|
51
|
+
else:
|
|
52
|
+
|
|
53
|
+
def reshape(x, shp):
|
|
54
|
+
return mx.reshape(x, mlx_to_list_shape(shp))
|
|
43
55
|
|
|
44
56
|
return reshape
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import warnings
|
|
2
|
+
|
|
3
|
+
import mlx.core as mx
|
|
4
|
+
|
|
5
|
+
from pytensor.link.mlx.dispatch.basic import convert_dtype_to_mlx, mlx_funcify
|
|
6
|
+
from pytensor.link.mlx.dispatch.tensor_basic import coerce_to_int
|
|
7
|
+
from pytensor.tensor.basic import get_scalar_constant_value
|
|
8
|
+
from pytensor.tensor.exceptions import NotScalarConstantError
|
|
9
|
+
from pytensor.tensor.sort import ArgSortOp, SortOp
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _warn_unsupported_kind(op, name):
|
|
13
|
+
if op.kind != "quicksort":
|
|
14
|
+
warnings.warn(
|
|
15
|
+
message=f"MLX {name} does not support the kind argument (got kind={op.kind}). "
|
|
16
|
+
"The argument will be ignored.",
|
|
17
|
+
category=UserWarning,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _static_axis(node):
|
|
22
|
+
try:
|
|
23
|
+
return int(get_scalar_constant_value(node.inputs[1]))
|
|
24
|
+
except NotScalarConstantError:
|
|
25
|
+
return None
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _resolve_axis(static_axis, axis):
|
|
29
|
+
return coerce_to_int(axis) if static_axis is None else static_axis
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@mlx_funcify.register(SortOp)
|
|
33
|
+
def mlx_funcify_Sort(op, node, **kwargs):
|
|
34
|
+
_warn_unsupported_kind(op, "sort")
|
|
35
|
+
static_axis = _static_axis(node)
|
|
36
|
+
|
|
37
|
+
def sort(x, axis):
|
|
38
|
+
return mx.sort(x, axis=_resolve_axis(static_axis, axis))
|
|
39
|
+
|
|
40
|
+
return sort
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@mlx_funcify.register(ArgSortOp)
|
|
44
|
+
def mlx_funcify_ArgSort(op, node, **kwargs):
|
|
45
|
+
_warn_unsupported_kind(op, "argsort")
|
|
46
|
+
static_axis = _static_axis(node)
|
|
47
|
+
out_dtype = convert_dtype_to_mlx(node.outputs[0].dtype)
|
|
48
|
+
|
|
49
|
+
def argsort(x, axis):
|
|
50
|
+
return mx.argsort(x, axis=_resolve_axis(static_axis, axis)).astype(out_dtype)
|
|
51
|
+
|
|
52
|
+
return argsort
|
|
@@ -10,6 +10,21 @@ from pytensor.tensor.subtensor import (
|
|
|
10
10
|
)
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
def _with_int_slice_bounds(indices):
|
|
14
|
+
# Slice bounds arrive as 0-d arrays, which MLX slices reject.
|
|
15
|
+
return tuple(
|
|
16
|
+
slice(
|
|
17
|
+
*(
|
|
18
|
+
None if bound is None else int(bound)
|
|
19
|
+
for bound in (index.start, index.stop, index.step)
|
|
20
|
+
)
|
|
21
|
+
)
|
|
22
|
+
if isinstance(index, slice)
|
|
23
|
+
else index
|
|
24
|
+
for index in indices
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
13
28
|
@mlx_funcify.register(Subtensor)
|
|
14
29
|
def mlx_funcify_Subtensor(op, node, **kwargs):
|
|
15
30
|
def subtensor(x, *ilists):
|
|
@@ -27,7 +42,7 @@ def mlx_funcify_Subtensor(op, node, **kwargs):
|
|
|
27
42
|
@mlx_funcify.register(AdvancedSubtensor)
|
|
28
43
|
def mlx_funcify_AdvancedSubtensor(op, node, **kwargs):
|
|
29
44
|
def advanced_subtensor(x, *ilists):
|
|
30
|
-
indices = indices_from_subtensor(ilists, op.idx_list)
|
|
45
|
+
indices = _with_int_slice_bounds(indices_from_subtensor(ilists, op.idx_list))
|
|
31
46
|
if len(indices) == 1:
|
|
32
47
|
indices = indices[0]
|
|
33
48
|
|
|
@@ -96,9 +111,12 @@ def mlx_funcify_AdvancedIncSubtensor(op, node, **kwargs):
|
|
|
96
111
|
def mlx_fn(x, indices, y):
|
|
97
112
|
return x.at[indices].add(y)
|
|
98
113
|
|
|
99
|
-
def advancedincsubtensor(x, y, *ilist, mlx_fn=mlx_fn):
|
|
114
|
+
def advancedincsubtensor(x, y, *ilist, mlx_fn=mlx_fn, idx_list=op.idx_list):
|
|
100
115
|
op._check_runtime_broadcast_of_vector_index(node, x, y, ilist[0])
|
|
101
116
|
|
|
102
|
-
|
|
117
|
+
# mirrors AdvancedIncSubtensor.perform
|
|
118
|
+
indices = _with_int_slice_bounds(indices_from_subtensor(ilist, idx_list))
|
|
119
|
+
|
|
120
|
+
return mlx_fn(x, indices, y)
|
|
103
121
|
|
|
104
122
|
return advancedincsubtensor
|
|
@@ -19,14 +19,14 @@ from pytensor.tensor.basic import (
|
|
|
19
19
|
from pytensor.tensor.exceptions import NotScalarConstantError
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
"MLX compilation limitation:
|
|
24
|
-
"cannot be used inside compiled functions.
|
|
25
|
-
"compilation forbids evaluating arrays to extract
|
|
22
|
+
MLX_DYNAMIC_VALUE_ERROR = (
|
|
23
|
+
"MLX compilation limitation: integer arguments (shapes, axes, pad widths) "
|
|
24
|
+
"computed from symbolic inputs cannot be used inside compiled functions. "
|
|
25
|
+
"This is because MLX compilation forbids evaluating arrays to extract "
|
|
26
|
+
"their values. "
|
|
26
27
|
"\n\nWorkarounds:"
|
|
27
|
-
"\n1.
|
|
28
|
-
"\n2.
|
|
29
|
-
"\n3. Move Alloc operations outside compiled functions"
|
|
28
|
+
"\n1. Use constant values for these arguments when possible"
|
|
29
|
+
"\n2. Compile with `MLXLinker(use_compile=False)`"
|
|
30
30
|
)
|
|
31
31
|
|
|
32
32
|
|
|
@@ -147,7 +147,7 @@ def mlx_funcify_AllocEmpty(op, node, **kwargs):
|
|
|
147
147
|
resolved_shape = (
|
|
148
148
|
_resolve_shape(static_dims, shape)
|
|
149
149
|
if static_dims is not None
|
|
150
|
-
else tuple(
|
|
150
|
+
else tuple(mlx_to_list_shape(shape))
|
|
151
151
|
)
|
|
152
152
|
return mx.zeros(resolved_shape, dtype=dtype)
|
|
153
153
|
|
|
@@ -167,7 +167,7 @@ def mlx_funcify_Alloc(op, node, **kwargs):
|
|
|
167
167
|
resolved_shape = (
|
|
168
168
|
_resolve_shape(static_dims, shape)
|
|
169
169
|
if static_dims is not None
|
|
170
|
-
else tuple(
|
|
170
|
+
else tuple(mlx_to_list_shape(shape))
|
|
171
171
|
)
|
|
172
172
|
result = mx.broadcast_to(x, resolved_shape)
|
|
173
173
|
if node_inputs is not None:
|
|
@@ -222,12 +222,12 @@ def _resolve_shape(static_dims, runtime_shape):
|
|
|
222
222
|
|
|
223
223
|
resolved = []
|
|
224
224
|
for const_dim, dim in zip(static_dims, runtime_shape, strict=True):
|
|
225
|
-
resolved.append(const_dim if const_dim is not None else
|
|
225
|
+
resolved.append(const_dim if const_dim is not None else coerce_to_int(dim))
|
|
226
226
|
|
|
227
227
|
return tuple(resolved)
|
|
228
228
|
|
|
229
229
|
|
|
230
|
-
def
|
|
230
|
+
def coerce_to_int(value):
|
|
231
231
|
if isinstance(value, np.integer | int):
|
|
232
232
|
return int(value)
|
|
233
233
|
try:
|
|
@@ -235,21 +235,22 @@ def _coerce_to_int(value):
|
|
|
235
235
|
return int(value.item())
|
|
236
236
|
return int(value)
|
|
237
237
|
except (ValueError, TypeError) as exc:
|
|
238
|
-
|
|
238
|
+
_rethrow_dynamic_value_error(exc)
|
|
239
239
|
raise
|
|
240
240
|
|
|
241
241
|
|
|
242
242
|
def mlx_to_list_shape(size) -> list[int]:
|
|
243
|
-
"""Convert a
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
243
|
+
"""Convert a shape given as an ``mx.array``, ``np.ndarray`` or sequence to a list of Python ints."""
|
|
244
|
+
if isinstance(size, mx.array):
|
|
245
|
+
try:
|
|
246
|
+
return [int(dim) for dim in size.tolist()]
|
|
247
|
+
except (ValueError, TypeError) as exc:
|
|
248
|
+
_rethrow_dynamic_value_error(exc)
|
|
249
|
+
raise
|
|
250
|
+
return [coerce_to_int(x) for x in size]
|
|
250
251
|
|
|
251
252
|
|
|
252
|
-
def
|
|
253
|
+
def _rethrow_dynamic_value_error(exc):
|
|
253
254
|
msg = str(exc)
|
|
254
255
|
if "[eval] Attempting to eval an array during function transformations" in msg:
|
|
255
|
-
raise ValueError(f"{
|
|
256
|
+
raise ValueError(f"{MLX_DYNAMIC_VALUE_ERROR}\n\nOriginal error: {msg}") from exc
|