pytensor 3.3.1__tar.gz → 3.3.2__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.1/pytensor.egg-info → pytensor-3.3.2}/PKG-INFO +1 -1
- {pytensor-3.3.1 → pytensor-3.3.2}/pyproject.toml +1 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/_version.py +3 -3
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/d3viz.py +1 -1
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/fg.py +1 -1
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/traversal.py +2 -2
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/__init__.py +1 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/basic.py +3 -1
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/solvers.py +11 -1
- pytensor-3.3.2/pytensor/link/mlx/dispatch/random.py +276 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/tensor_basic.py +10 -0
- pytensor-3.3.2/pytensor/link/mlx/linker.py +143 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/cython_support.py +17 -20
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -6
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/scalar.py +2 -8
- {pytensor-3.3.1 → pytensor-3.3.2/pytensor.egg-info}/PKG-INFO +1 -1
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor.egg-info/SOURCES.txt +1 -0
- pytensor-3.3.1/pytensor/link/mlx/linker.py +0 -79
- {pytensor-3.3.1 → pytensor-3.3.2}/LICENSE.txt +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/MANIFEST.in +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/README.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/.templates/layout.html +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/.templates/nb-badges.html +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/LICENSE.txt +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/README.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/acknowledgement.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/bcast.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/bcast.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/blog.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/conf.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/core_development_guide.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/css.inc +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/dev_start_guide.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/environment.yml +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/apply.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/apply.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/apply2.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/ctype.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/extending_faq.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/graphstructures.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/inplace.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/op.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/other_ops.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/pipeline.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/scan.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/tips.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/type.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/unification_kanren.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/unittest.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/extending/using_params.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/faq.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/gallery/applications/tiny_transformer_llm.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/gallery/optimize/root.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/gallery/page_footer.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/glossary.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/Elman_srnn.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/PyTensor.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/binder.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/blocksparse.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/colab.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/github.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/lstm.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/talk2010.gif +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/images/talk2010.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/install.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/internal/how_to_release.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/internal/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/introduction.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/function.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/io.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/mode.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/ops.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/compile/shared.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/config.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/features.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/graph.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/op.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/replace.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/traversal.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/type.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/graph/utils.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/printing.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/scalar/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/scan.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/sparse/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/basic.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/bcast.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/fft.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/functional.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/io.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/linalg.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/optimize.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/random.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/tensor/utils.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/typed_list.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/xtensor/index.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/xtensor/linalg.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/xtensor/math.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/xtensor/module_functions.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/xtensor/random.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/xtensor/signal.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/library/xtensor/type.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/links.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/optimizations.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/pylintrc +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/robots.txt +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/troubleshooting.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/adding.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/apply.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/apply.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/bcast.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/conditions.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/examples.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/gradients.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/logistic.gp +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/logistic.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/loop.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/modes.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/prng.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/profiling.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/sparse.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/doc/user_guide.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/_sparse_lazy.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/alloc.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/blockwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/core.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/diagonal.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/dimshuffle.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/dot.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/elemwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/orthogonal.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/permutation.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/positive_definite.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/reshape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/selection.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/specify.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/subtensor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/symmetric.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/assumptions/triangular.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/bin/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/breakpoint.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/aliasing.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/builders.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/compiledir.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/compilelock.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/debug/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/debug/debugmode.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/debug/dump.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/debug/monitormode.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/debug/nanguardmode.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/debug/profiling.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/executor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/inner_function.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/io.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/maker.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/mode.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/rebuild.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/rewriting.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/configdefaults.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/configparser.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/html/template.html +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/gradient.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/features.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/null_type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/op.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/replace.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/rewriting/reachability.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/graph/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/ifelse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/ipython.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/cutils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/cvm.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/interface.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/op.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/params_type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/c/type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/constructors.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/products.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/solvers.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/linalg/summary.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/scan.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/linker.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/jax/ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/blas.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/blockwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/einsum.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/products.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/linalg/summary.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/pad.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/bessel.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/beta.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/erf.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/erfcinv.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/gamma.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/gammainc.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/helpers.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/scalar/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/sort.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/cache.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/_llvmlite_self_ref.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/_patch_list_to_tuple.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/_patch_pointer_add.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/blockwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/compile_ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/elemwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/_BLAS.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/constructors.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/dispatch.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/eigen.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/decomposition/svd.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/products.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/cholesky.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/dispatch.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/general.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/hermitian.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/linear_control.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/lu_solve.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/posdef.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/symmetric.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/tridiagonal.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/solvers/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/summary.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/random.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/scan.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/sort.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/sparse/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/sparse/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/sparse/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/sparse/variable.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/subtensor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/typed_list.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/numba/linker.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/linalg/products.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/linalg/summary.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/link/vm.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/check_blas.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/frozendict.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/npy_2_compat.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/printing.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/py.typed +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/raise_op.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/loop.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/op.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/db.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/inner_graph.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/inplace.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/io.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/merge.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/push_out.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/trace.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/rewriting/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/scan/views.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/linalg.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/sparse/variable.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/_core.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/batched.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/blas_c.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/c_code/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/c_code/alt_blas_common.h +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/c_code/alt_blas_template.c +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/c_code/blas_headers.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/c_code/codegen.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/gemm.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/gemv.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blas/ger.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/blockwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/einsum.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/elemwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/extra_ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/fft.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/fourier.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/functional.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/_lazy.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/constructors.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/cholesky.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/eigen.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/lu.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/qr.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/schur.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/decomposition/svd.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/dtype_utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/inverse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/products.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/core.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/general.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/linear_control.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/lstsq.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/psd.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/triangular.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/solvers/tridiagonal.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/linalg/summary.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/nlinalg.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/optimize.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/pad.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/op.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/random/variable.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/reshape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/assumptions.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/blas.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/elemwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/fused_elemwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/decomposition.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/inverse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/products.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/solvers.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/summary.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/linalg/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/optimize.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/reshape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/subtensor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/signal/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/signal/conv.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/slinalg.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/sort.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/special.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/subtensor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/symbolic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/type_other.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/var.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/variable.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/typed_list/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/typed_list/type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/indexing.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/linalg.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/random/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/random/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/random/type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/random/variable.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/reduction.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/rewriting/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/rewriting/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/rewriting/indexing.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/rewriting/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/rewriting/reduction.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/rewriting/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/rewriting/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/rewriting/vectorization.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/signal.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor/xtensor/vectorization.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor.egg-info/requires.txt +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/scripts/mypy-failing.txt +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/setup.cfg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/setup.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/tests/test_basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/tests/test_breakpoint.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/tests/test_config.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/tests/test_gradient.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/tests/test_ifelse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/tests/test_printing.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/tests/test_raise_op.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.2}/tests/test_rop.py +0 -0
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2026-09-
|
|
11
|
+
"date": "2026-09-14T16:15:54+0200",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "3.3.
|
|
14
|
+
"full-revisionid": "895f7795e2ae8ea16e3a4097ce4b92c61c8faf76",
|
|
15
|
+
"version": "3.3.2"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -321,7 +321,7 @@ class FunctionGraph(AbstractFunctionGraph):
|
|
|
321
321
|
|
|
322
322
|
Parameters
|
|
323
323
|
----------
|
|
324
|
-
|
|
324
|
+
var : pytensor.graph.basic.Variable
|
|
325
325
|
The variable to be imported.
|
|
326
326
|
reason : str
|
|
327
327
|
The name of the optimization or operation in progress.
|
|
@@ -666,9 +666,9 @@ def toposort_with_orderings(
|
|
|
666
666
|
Parameters
|
|
667
667
|
----------
|
|
668
668
|
graphs : list or tuple of Variable instances
|
|
669
|
-
Graph inputs.
|
|
670
|
-
outputs : list or tuple of Apply instances
|
|
671
669
|
Graph outputs.
|
|
670
|
+
blockers : list or tuple of Variable instances
|
|
671
|
+
Graph inputs.
|
|
672
672
|
orderings : dict
|
|
673
673
|
Keys are `Apply` or `Variable` instances, values are lists of `Apply` or `Variable` instances.
|
|
674
674
|
|
|
@@ -132,7 +132,9 @@ def mlx_typify_tensor(data, dtype=None, **kwargs):
|
|
|
132
132
|
# and it does so on the CPU too, where float64 is perfectly usable
|
|
133
133
|
if dtype is None and data.dtype == np.float64 and float64_supported():
|
|
134
134
|
dtype = mx.float64
|
|
135
|
-
|
|
135
|
+
# MLX's elementwise kernels misread a non-contiguous buffer, and rewriting
|
|
136
|
+
# produces such arrays -- `triu` of a transpose, for one
|
|
137
|
+
return _nan_safe_constant(np.asarray(data, order="C"), dtype=dtype)
|
|
136
138
|
|
|
137
139
|
|
|
138
140
|
@mlx_typify.register(slice)
|
|
@@ -33,12 +33,22 @@ def mlx_funcify_Solve(op, node, **kwargs):
|
|
|
33
33
|
@mlx_funcify.register(SolveTriangular)
|
|
34
34
|
def mlx_funcify_SolveTriangular(op, node, **kwargs):
|
|
35
35
|
lower = op.lower
|
|
36
|
+
unit_diagonal = op.unit_diagonal
|
|
36
37
|
A_dtype = getattr(mx, node.inputs[0].dtype)
|
|
37
38
|
b_dtype = getattr(mx, node.inputs[1].dtype)
|
|
38
39
|
|
|
39
40
|
def solve_triangular(A, b):
|
|
41
|
+
A = A.astype(stream=mx.cpu, dtype=A_dtype)
|
|
42
|
+
|
|
43
|
+
if unit_diagonal:
|
|
44
|
+
# MLX's `solve_triangular` has no `unit_diagonal`. LAPACK's `trtrs`
|
|
45
|
+
# never reads the diagonal in that mode, so overwriting it with ones
|
|
46
|
+
# gives the same answer.
|
|
47
|
+
diagonal_mask = mx.eye(A.shape[-1], dtype=mx.bool_, stream=mx.cpu)
|
|
48
|
+
A = mx.where(diagonal_mask, mx.array(1, dtype=A_dtype), A, stream=mx.cpu)
|
|
49
|
+
|
|
40
50
|
return mx.linalg.solve_triangular(
|
|
41
|
-
A
|
|
51
|
+
A,
|
|
42
52
|
b.astype(stream=mx.cpu, dtype=b_dtype),
|
|
43
53
|
upper=not lower,
|
|
44
54
|
stream=mx.cpu,
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
from functools import singledispatch
|
|
2
|
+
|
|
3
|
+
import mlx.core as mx
|
|
4
|
+
from numpy.random import Generator
|
|
5
|
+
|
|
6
|
+
import pytensor.tensor.random.basic as ptr
|
|
7
|
+
from pytensor.link.mlx.dispatch.basic import mlx_funcify, mlx_typify
|
|
8
|
+
from pytensor.link.mlx.dispatch.tensor_basic import (
|
|
9
|
+
convert_dtype_to_mlx,
|
|
10
|
+
mlx_to_list_shape,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def numpy_generator_to_mlx_key(rng: Generator) -> mx.array:
|
|
15
|
+
"""Convert a NumPy Generator to an MLX random key.
|
|
16
|
+
|
|
17
|
+
MLX keys are 64-bit, so we XOR-fold the two halves of the 128-bit PCG64
|
|
18
|
+
state to keep all of its entropy.
|
|
19
|
+
"""
|
|
20
|
+
state = rng.bit_generator.state
|
|
21
|
+
if state["bit_generator"] not in ("PCG64", "PCG64DXSM"):
|
|
22
|
+
raise NotImplementedError(
|
|
23
|
+
"MLX RNG conversion only supports the PCG64 bit generator, got "
|
|
24
|
+
f"{state['bit_generator']}."
|
|
25
|
+
)
|
|
26
|
+
state_128 = int(state["state"]["state"])
|
|
27
|
+
upper = (state_128 >> 64) & 0xFFFFFFFFFFFFFFFF
|
|
28
|
+
lower = state_128 & 0xFFFFFFFFFFFFFFFF
|
|
29
|
+
return mx.random.key(upper ^ lower)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _shape_from_size(size, *parameters) -> list[int] | tuple[int, ...]:
|
|
33
|
+
"""Sampling shape: ``size`` if given, else the broadcast of the parameters."""
|
|
34
|
+
if size is not None:
|
|
35
|
+
return mlx_to_list_shape(size)
|
|
36
|
+
return tuple(mx.broadcast_shapes(*(p.shape for p in parameters)))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@mlx_typify.register(Generator)
|
|
40
|
+
def mlx_typify_Generator(rng, **kwargs):
|
|
41
|
+
return numpy_generator_to_mlx_key(rng)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@mlx_funcify.register(ptr.RandomVariable)
|
|
45
|
+
def mlx_funcify_RandomVariable(op, node, **kwargs):
|
|
46
|
+
rv = node.outputs[1]
|
|
47
|
+
out_dtype = rv.type.dtype
|
|
48
|
+
|
|
49
|
+
# MLX random primitives reject float64 regardless of device, so sample in
|
|
50
|
+
# float32 and widen the draw to the declared output dtype afterwards.
|
|
51
|
+
mlx_out_dtype = convert_dtype_to_mlx(out_dtype)
|
|
52
|
+
sample_dtype = mx.float32 if mlx_out_dtype == mx.float64 else mlx_out_dtype
|
|
53
|
+
|
|
54
|
+
sample_fn_inner = mlx_sample_fn(op, node)
|
|
55
|
+
|
|
56
|
+
def sample_fn(rng, size, *parameters):
|
|
57
|
+
new_rng, sampling_key = mx.random.split(rng, num=2)
|
|
58
|
+
sample = sample_fn_inner(sampling_key, size, sample_dtype, *parameters)
|
|
59
|
+
if sample.dtype != mlx_out_dtype:
|
|
60
|
+
sample = sample.astype(mlx_out_dtype)
|
|
61
|
+
return (new_rng, sample)
|
|
62
|
+
|
|
63
|
+
return sample_fn
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@singledispatch
|
|
67
|
+
def mlx_sample_fn(op, node):
|
|
68
|
+
raise NotImplementedError(
|
|
69
|
+
f"No MLX implementation for the given distribution: {op.name}"
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@mlx_sample_fn.register(ptr.NormalRV)
|
|
74
|
+
def mlx_sample_fn_normal(op, node):
|
|
75
|
+
def sample_fn(rng_key, size, dtype, loc, scale):
|
|
76
|
+
mlx_dtype = convert_dtype_to_mlx(dtype)
|
|
77
|
+
loc = mx.array(loc, dtype=mlx_dtype)
|
|
78
|
+
scale = mx.array(scale, dtype=mlx_dtype)
|
|
79
|
+
shape = _shape_from_size(size, loc, scale)
|
|
80
|
+
return loc + scale * mx.random.normal(shape=shape, dtype=mlx_dtype, key=rng_key)
|
|
81
|
+
|
|
82
|
+
return sample_fn
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
@mlx_sample_fn.register(ptr.LaplaceRV)
|
|
86
|
+
def mlx_sample_fn_laplace(op, node):
|
|
87
|
+
def sample_fn(rng_key, size, dtype, loc, scale):
|
|
88
|
+
mlx_dtype = convert_dtype_to_mlx(dtype)
|
|
89
|
+
loc = mx.array(loc, dtype=mlx_dtype)
|
|
90
|
+
scale = mx.array(scale, dtype=mlx_dtype)
|
|
91
|
+
shape = _shape_from_size(size, loc, scale)
|
|
92
|
+
return loc + scale * mx.random.laplace(
|
|
93
|
+
shape=shape, dtype=mlx_dtype, key=rng_key
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
return sample_fn
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
@mlx_sample_fn.register(ptr.GumbelRV)
|
|
100
|
+
def mlx_sample_fn_gumbel(op, node):
|
|
101
|
+
def sample_fn(rng_key, size, dtype, loc, scale):
|
|
102
|
+
mlx_dtype = convert_dtype_to_mlx(dtype)
|
|
103
|
+
loc = mx.array(loc, dtype=mlx_dtype)
|
|
104
|
+
scale = mx.array(scale, dtype=mlx_dtype)
|
|
105
|
+
shape = _shape_from_size(size, loc, scale)
|
|
106
|
+
return loc + scale * mx.random.gumbel(shape=shape, dtype=mlx_dtype, key=rng_key)
|
|
107
|
+
|
|
108
|
+
return sample_fn
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@mlx_sample_fn.register(ptr.UniformRV)
|
|
112
|
+
def mlx_sample_fn_uniform(op, node):
|
|
113
|
+
def sample_fn(rng_key, size, dtype, low, high):
|
|
114
|
+
mlx_dtype = convert_dtype_to_mlx(dtype)
|
|
115
|
+
low = mx.array(low, dtype=mlx_dtype)
|
|
116
|
+
high = mx.array(high, dtype=mlx_dtype)
|
|
117
|
+
shape = _shape_from_size(size, low, high)
|
|
118
|
+
return mx.random.uniform(
|
|
119
|
+
low=low, high=high, shape=shape, dtype=mlx_dtype, key=rng_key
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
return sample_fn
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
@mlx_sample_fn.register(ptr.IntegersRV)
|
|
126
|
+
def mlx_sample_fn_integers(op, node):
|
|
127
|
+
def sample_fn(rng_key, size, dtype, low, high):
|
|
128
|
+
low = mx.array(low)
|
|
129
|
+
high = mx.array(high)
|
|
130
|
+
shape = _shape_from_size(size, low, high)
|
|
131
|
+
# Sample at full int64 width and cast the result: PyTensor casts the
|
|
132
|
+
# output, not the bounds, so narrow/wide dtypes don't corrupt the range.
|
|
133
|
+
return mx.random.randint(
|
|
134
|
+
low=low, high=high, shape=shape, dtype=mx.int64, key=rng_key
|
|
135
|
+
).astype(convert_dtype_to_mlx(dtype))
|
|
136
|
+
|
|
137
|
+
return sample_fn
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@mlx_sample_fn.register(ptr.BernoulliRV)
|
|
141
|
+
def mlx_sample_fn_bernoulli(op, node):
|
|
142
|
+
def sample_fn(rng_key, size, dtype, p):
|
|
143
|
+
p = mx.array(p)
|
|
144
|
+
shape = mlx_to_list_shape(size) if size is not None else None
|
|
145
|
+
# MLX draws bool; PyTensor declares an int dtype.
|
|
146
|
+
return mx.random.bernoulli(p=p, shape=shape, key=rng_key).astype(
|
|
147
|
+
convert_dtype_to_mlx(dtype)
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
return sample_fn
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
@mlx_sample_fn.register(ptr.CategoricalRV)
|
|
154
|
+
def mlx_sample_fn_categorical(op, node):
|
|
155
|
+
def sample_fn(rng_key, size, dtype, p):
|
|
156
|
+
logits = mx.log(mx.array(p))
|
|
157
|
+
shape = mlx_to_list_shape(size) if size is not None else None
|
|
158
|
+
# MLX draws uint32; PyTensor declares an int dtype.
|
|
159
|
+
return mx.random.categorical(
|
|
160
|
+
logits=logits, axis=-1, shape=shape, key=rng_key
|
|
161
|
+
).astype(convert_dtype_to_mlx(dtype))
|
|
162
|
+
|
|
163
|
+
return sample_fn
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
@mlx_sample_fn.register(ptr.MvNormalRV)
|
|
167
|
+
def mlx_sample_fn_mvnormal(op, node):
|
|
168
|
+
method = op.method
|
|
169
|
+
|
|
170
|
+
def sample_fn(rng_key, size, dtype, mean, cov):
|
|
171
|
+
mlx_dtype = convert_dtype_to_mlx(dtype)
|
|
172
|
+
mean = mx.array(mean, dtype=mlx_dtype)
|
|
173
|
+
cov = mx.array(cov, dtype=mlx_dtype)
|
|
174
|
+
|
|
175
|
+
n = cov.shape[-1]
|
|
176
|
+
if size is not None:
|
|
177
|
+
batch_shape = mlx_to_list_shape(size)
|
|
178
|
+
else:
|
|
179
|
+
batch_shape = mx.broadcast_shapes(mean.shape[:-1], cov.shape[:-2])
|
|
180
|
+
|
|
181
|
+
if 0 in tuple(batch_shape):
|
|
182
|
+
# Empty batch dim crashes MLX's compiled matmul; the draw is empty anyway.
|
|
183
|
+
return mx.broadcast_to(mean, [*batch_shape, n])
|
|
184
|
+
|
|
185
|
+
# Factor ``cov = A @ A.T`` so that ``mean + A @ z`` has covariance ``cov``.
|
|
186
|
+
if method == "cholesky":
|
|
187
|
+
A = mx.linalg.cholesky(cov, stream=mx.cpu)
|
|
188
|
+
elif method == "svd":
|
|
189
|
+
U, s, _ = mx.linalg.svd(cov, stream=mx.cpu)
|
|
190
|
+
A = U * mx.sqrt(s)[..., None, :]
|
|
191
|
+
else: # eigh
|
|
192
|
+
w, vecs = mx.linalg.eigh(cov, stream=mx.cpu)
|
|
193
|
+
A = vecs * mx.sqrt(w)[..., None, :]
|
|
194
|
+
|
|
195
|
+
z = mx.random.normal(shape=[*batch_shape, n], dtype=mlx_dtype, key=rng_key)
|
|
196
|
+
return mean + (A @ z[..., None])[..., 0]
|
|
197
|
+
|
|
198
|
+
return sample_fn
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
@mlx_sample_fn.register(ptr.PermutationRV)
|
|
202
|
+
def mlx_sample_fn_permutation(op, node):
|
|
203
|
+
if op.batch_ndim(node):
|
|
204
|
+
raise NotImplementedError(
|
|
205
|
+
"MLX random.permutation does not support batch dimensions."
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
def sample_fn(rng_key, size, dtype, x):
|
|
209
|
+
return mx.random.permutation(x, key=rng_key)
|
|
210
|
+
|
|
211
|
+
return sample_fn
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
@mlx_sample_fn.register(ptr.LogNormalRV)
|
|
215
|
+
def mlx_sample_fn_lognormal(op, node):
|
|
216
|
+
def sample_fn(rng_key, size, dtype, mu, sigma):
|
|
217
|
+
mlx_dtype = convert_dtype_to_mlx(dtype)
|
|
218
|
+
mu = mx.array(mu, dtype=mlx_dtype)
|
|
219
|
+
sigma = mx.array(sigma, dtype=mlx_dtype)
|
|
220
|
+
shape = _shape_from_size(size, mu, sigma)
|
|
221
|
+
z = mx.random.normal(shape=shape, dtype=mlx_dtype, key=rng_key)
|
|
222
|
+
return mx.exp(mu + sigma * z)
|
|
223
|
+
|
|
224
|
+
return sample_fn
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
@mlx_sample_fn.register(ptr.HalfNormalRV)
|
|
228
|
+
def mlx_sample_fn_halfnormal(op, node):
|
|
229
|
+
def sample_fn(rng_key, size, dtype, loc, scale):
|
|
230
|
+
mlx_dtype = convert_dtype_to_mlx(dtype)
|
|
231
|
+
loc = mx.array(loc, dtype=mlx_dtype)
|
|
232
|
+
scale = mx.array(scale, dtype=mlx_dtype)
|
|
233
|
+
shape = _shape_from_size(size, loc, scale)
|
|
234
|
+
z = mx.random.normal(shape=shape, dtype=mlx_dtype, key=rng_key)
|
|
235
|
+
return loc + scale * mx.abs(z)
|
|
236
|
+
|
|
237
|
+
return sample_fn
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
@mlx_sample_fn.register(ptr.ExponentialRV)
|
|
241
|
+
def mlx_sample_fn_exponential(op, node):
|
|
242
|
+
def sample_fn(rng_key, size, dtype, scale):
|
|
243
|
+
mlx_dtype = convert_dtype_to_mlx(dtype)
|
|
244
|
+
scale = mx.array(scale, dtype=mlx_dtype)
|
|
245
|
+
shape = _shape_from_size(size, scale)
|
|
246
|
+
u = mx.random.uniform(shape=shape, dtype=mlx_dtype, key=rng_key)
|
|
247
|
+
# log1p(-u) avoids -inf when u=0 (u is in [0, 1))
|
|
248
|
+
return -scale * mx.log1p(-u)
|
|
249
|
+
|
|
250
|
+
return sample_fn
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
@mlx_sample_fn.register(ptr.LogisticRV)
|
|
254
|
+
def mlx_sample_fn_logistic(op, node):
|
|
255
|
+
def sample_fn(rng_key, size, dtype, loc, scale):
|
|
256
|
+
mlx_dtype = convert_dtype_to_mlx(dtype)
|
|
257
|
+
loc = mx.array(loc, dtype=mlx_dtype)
|
|
258
|
+
scale = mx.array(scale, dtype=mlx_dtype)
|
|
259
|
+
shape = _shape_from_size(size, loc, scale)
|
|
260
|
+
u = mx.random.uniform(shape=shape, dtype=mlx_dtype, key=rng_key)
|
|
261
|
+
return loc + scale * mx.log(u / (1 - u))
|
|
262
|
+
|
|
263
|
+
return sample_fn
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
@mlx_sample_fn.register(ptr.CauchyRV)
|
|
267
|
+
def mlx_sample_fn_cauchy(op, node):
|
|
268
|
+
def sample_fn(rng_key, size, dtype, loc, scale):
|
|
269
|
+
mlx_dtype = convert_dtype_to_mlx(dtype)
|
|
270
|
+
loc = mx.array(loc, dtype=mlx_dtype)
|
|
271
|
+
scale = mx.array(scale, dtype=mlx_dtype)
|
|
272
|
+
shape = _shape_from_size(size, loc, scale)
|
|
273
|
+
u = mx.random.uniform(shape=shape, dtype=mlx_dtype, key=rng_key)
|
|
274
|
+
return loc + scale * mx.tan(mx.pi * (u - 0.5))
|
|
275
|
+
|
|
276
|
+
return sample_fn
|
|
@@ -239,6 +239,16 @@ def _coerce_to_int(value):
|
|
|
239
239
|
raise
|
|
240
240
|
|
|
241
241
|
|
|
242
|
+
def mlx_to_list_shape(size) -> list[int]:
|
|
243
|
+
"""Convert a size value (mx.array, np.ndarray, or sequence) to a plain Python list of ints.
|
|
244
|
+
|
|
245
|
+
Used by random variable dispatch to normalise the ``size`` argument, which
|
|
246
|
+
PyTensor may pass as an ``mx.array`` or ``np.ndarray`` rather than a plain
|
|
247
|
+
Python list.
|
|
248
|
+
"""
|
|
249
|
+
return [_coerce_to_int(x) for x in size]
|
|
250
|
+
|
|
251
|
+
|
|
242
252
|
def _rethrow_dynamic_shape_error(exc):
|
|
243
253
|
msg = str(exc)
|
|
244
254
|
if "[eval] Attempting to eval an array during function transformations" in msg:
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import warnings
|
|
2
|
+
|
|
3
|
+
from pytensor.compile.sharedvalue import SharedVariable, shared
|
|
4
|
+
from pytensor.link.basic import JITLinker
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class MLXLinker(JITLinker):
|
|
8
|
+
"""A `Linker` that JIT-compiles NumPy-based operations using Apple's MLX."""
|
|
9
|
+
|
|
10
|
+
required_rewrites = ("minimum_compile",)
|
|
11
|
+
incompatible_rewrites = (
|
|
12
|
+
"cxx_only",
|
|
13
|
+
"BlasOpt",
|
|
14
|
+
"local_careduce_fusion",
|
|
15
|
+
"inplace",
|
|
16
|
+
"scan_reduce_trace_prealloc",
|
|
17
|
+
"inline_einsum",
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
def __init__(self, use_compile=True, *args, **kwargs):
|
|
21
|
+
super().__init__(*args, **kwargs)
|
|
22
|
+
self.gen_functors = []
|
|
23
|
+
self.use_compile = use_compile
|
|
24
|
+
|
|
25
|
+
def fgraph_convert(self, fgraph, input_storage, storage_map, **kwargs):
|
|
26
|
+
"""Convert a PyTensor FunctionGraph to an MLX-compatible function.
|
|
27
|
+
|
|
28
|
+
Parameters
|
|
29
|
+
----------
|
|
30
|
+
fgraph : FunctionGraph
|
|
31
|
+
The function graph to convert
|
|
32
|
+
|
|
33
|
+
Returns
|
|
34
|
+
-------
|
|
35
|
+
callable
|
|
36
|
+
An MLX-compatible function
|
|
37
|
+
"""
|
|
38
|
+
from pytensor.link.mlx.dispatch import mlx_funcify
|
|
39
|
+
from pytensor.tensor.random.type import RandomType
|
|
40
|
+
|
|
41
|
+
shared_rng_inputs = [
|
|
42
|
+
inp
|
|
43
|
+
for inp in fgraph.inputs
|
|
44
|
+
if (isinstance(inp, SharedVariable) and isinstance(inp.type, RandomType))
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
# Replace any shared RNG inputs so that their values can be updated in place
|
|
48
|
+
# without affecting the original RNG container. This is necessary because
|
|
49
|
+
# MLX does not accept Generators as inputs, and they will have to
|
|
50
|
+
# be typified
|
|
51
|
+
if shared_rng_inputs:
|
|
52
|
+
warnings.warn(
|
|
53
|
+
f"The RandomType SharedVariables {shared_rng_inputs} will not be used "
|
|
54
|
+
f"in the compiled MLX graph. Instead a copy will be used.",
|
|
55
|
+
UserWarning,
|
|
56
|
+
)
|
|
57
|
+
new_shared_rng_inputs = [
|
|
58
|
+
shared(inp.get_value(borrow=False)) for inp in shared_rng_inputs
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
fgraph.replace_all(
|
|
62
|
+
zip(shared_rng_inputs, new_shared_rng_inputs, strict=True),
|
|
63
|
+
import_missing=True,
|
|
64
|
+
reason="MLXLinker.fgraph_convert",
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
for old_inp, new_inp in zip(
|
|
68
|
+
shared_rng_inputs, new_shared_rng_inputs, strict=True
|
|
69
|
+
):
|
|
70
|
+
new_inp_storage = [new_inp.get_value(borrow=True)]
|
|
71
|
+
storage_map[new_inp] = new_inp_storage
|
|
72
|
+
old_inp_storage = storage_map.pop(old_inp)
|
|
73
|
+
# Find index of old_inp_storage in input_storage
|
|
74
|
+
for input_storage_idx, input_storage_item in enumerate(input_storage):
|
|
75
|
+
# We have to establish equality based on identity because input_storage may contain numpy arrays
|
|
76
|
+
if input_storage_item is old_inp_storage:
|
|
77
|
+
break
|
|
78
|
+
else: # no break
|
|
79
|
+
raise ValueError()
|
|
80
|
+
input_storage[input_storage_idx] = new_inp_storage
|
|
81
|
+
# We need to change the order of the inputs of the FunctionGraph
|
|
82
|
+
# so that the new input is in the same position as to old one,
|
|
83
|
+
# to align with the storage_map. We hope this is safe!
|
|
84
|
+
old_inp_fgraph_index = fgraph.inputs.index(old_inp)
|
|
85
|
+
fgraph.remove_input(
|
|
86
|
+
old_inp_fgraph_index,
|
|
87
|
+
reason="MLXLinker.fgraph_convert",
|
|
88
|
+
)
|
|
89
|
+
fgraph.inputs.remove(new_inp)
|
|
90
|
+
fgraph.inputs.insert(old_inp_fgraph_index, new_inp)
|
|
91
|
+
|
|
92
|
+
return mlx_funcify(
|
|
93
|
+
fgraph,
|
|
94
|
+
input_storage=input_storage,
|
|
95
|
+
storage_map=storage_map,
|
|
96
|
+
**kwargs,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
def jit_compile(self, fn):
|
|
100
|
+
import mlx.core as mx
|
|
101
|
+
|
|
102
|
+
from pytensor.link.mlx.dispatch import mlx_typify
|
|
103
|
+
|
|
104
|
+
if not self.use_compile:
|
|
105
|
+
# Skip compilation and just return the function with MLX typification
|
|
106
|
+
def fn_no_compile(*inputs):
|
|
107
|
+
return fn(*(mlx_typify(inp) for inp in inputs))
|
|
108
|
+
|
|
109
|
+
return fn_no_compile
|
|
110
|
+
|
|
111
|
+
inner_fn = mx.compile(fn)
|
|
112
|
+
|
|
113
|
+
def fn(*inputs, inner_fn=inner_fn):
|
|
114
|
+
return inner_fn(*(mlx_typify(inp) for inp in inputs))
|
|
115
|
+
|
|
116
|
+
return fn
|
|
117
|
+
|
|
118
|
+
def create_thunk_inputs(self, storage_map):
|
|
119
|
+
"""Create inputs for the MLX thunk.
|
|
120
|
+
|
|
121
|
+
Parameters
|
|
122
|
+
----------
|
|
123
|
+
storage_map : dict
|
|
124
|
+
Map from variables to their storage
|
|
125
|
+
|
|
126
|
+
Returns
|
|
127
|
+
-------
|
|
128
|
+
list
|
|
129
|
+
The inputs for the thunk
|
|
130
|
+
"""
|
|
131
|
+
from numpy.random import Generator
|
|
132
|
+
|
|
133
|
+
from pytensor.link.mlx.dispatch import mlx_typify
|
|
134
|
+
|
|
135
|
+
thunk_inputs = []
|
|
136
|
+
for n in self.fgraph.inputs:
|
|
137
|
+
sinput = storage_map[n]
|
|
138
|
+
if isinstance(sinput[0], Generator):
|
|
139
|
+
# Convert Generator into MLX PRNG key
|
|
140
|
+
sinput[0] = mlx_typify(sinput[0])
|
|
141
|
+
thunk_inputs.append(sinput)
|
|
142
|
+
|
|
143
|
+
return thunk_inputs
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import importlib
|
|
2
2
|
import re
|
|
3
|
-
from collections.abc import Callable
|
|
3
|
+
from collections.abc import Callable
|
|
4
4
|
from dataclasses import dataclass
|
|
5
|
-
from typing import Any, cast
|
|
6
5
|
|
|
7
6
|
import numba
|
|
8
7
|
import numpy as np
|
|
@@ -33,9 +32,7 @@ _C_TO_NUMPY: dict[str, DTypeLike] = {
|
|
|
33
32
|
@dataclass
|
|
34
33
|
class Signature:
|
|
35
34
|
res_dtype: DTypeLike
|
|
36
|
-
res_c_type: str
|
|
37
35
|
arg_dtypes: list[DTypeLike]
|
|
38
|
-
arg_c_types: list[str]
|
|
39
36
|
arg_names: list[str | None]
|
|
40
37
|
|
|
41
38
|
@property
|
|
@@ -92,7 +89,6 @@ class Signature:
|
|
|
92
89
|
|
|
93
90
|
arg_dtypes = []
|
|
94
91
|
arg_names: list[str | None] = []
|
|
95
|
-
arg_c_types = []
|
|
96
92
|
for raw_arg in raw_args.split(b","):
|
|
97
93
|
re_match = re.fullmatch(decl_expr, raw_arg)
|
|
98
94
|
if re_match is None:
|
|
@@ -104,7 +100,6 @@ class Signature:
|
|
|
104
100
|
except KeyError:
|
|
105
101
|
raise ValueError(f"Unknown C type: {arg_c_type}")
|
|
106
102
|
|
|
107
|
-
arg_c_types.append(arg_c_type)
|
|
108
103
|
arg_dtypes.append(arg_dtype)
|
|
109
104
|
name = groups["name"]
|
|
110
105
|
if not name:
|
|
@@ -112,36 +107,38 @@ class Signature:
|
|
|
112
107
|
else:
|
|
113
108
|
arg_names.append(name.decode())
|
|
114
109
|
|
|
115
|
-
return Signature(res_dtype,
|
|
110
|
+
return Signature(res_dtype, arg_dtypes, arg_names)
|
|
116
111
|
|
|
117
112
|
|
|
118
|
-
def _available_impls(func: Callable) -> list[tuple[Signature,
|
|
113
|
+
def _available_impls(func: Callable) -> list[tuple[Signature, str]]:
|
|
119
114
|
"""Find all available implementations for a fused cython function.
|
|
120
115
|
|
|
121
|
-
Each entry is ``(signature,
|
|
116
|
+
Each entry is ``(signature, capi_name)``, where ``capi_name`` is the key under
|
|
122
117
|
which the implementation is exported in the module's ``__pyx_capi__`` table. That name is a
|
|
123
118
|
stable, picklable handle for the C function, used to re-resolve its address at runtime.
|
|
124
119
|
"""
|
|
125
120
|
impls = []
|
|
126
121
|
mod = importlib.import_module(func.__module__)
|
|
127
122
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
#
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
123
|
+
if getattr(func, "__signatures__", None) is not None:
|
|
124
|
+
# Cython 3.3 exports typed names and retains the numbered names as aliases.
|
|
125
|
+
# Python specialization names need not match either C API name.
|
|
126
|
+
names = [
|
|
127
|
+
name for name in mod.__pyx_capi__ if name.startswith(f"{func.__name__}[")
|
|
128
|
+
]
|
|
129
|
+
if not names:
|
|
130
|
+
pattern = re.compile(rf"__pyx_fuse_[0-9_]+{re.escape(func.__name__)}")
|
|
131
|
+
names = [name for name in mod.__pyx_capi__ if pattern.fullmatch(name)]
|
|
134
132
|
else:
|
|
135
|
-
|
|
136
|
-
for
|
|
137
|
-
name = candidate.__name__
|
|
133
|
+
names = [func.__name__]
|
|
134
|
+
for name in names:
|
|
138
135
|
capsule = mod.__pyx_capi__[name]
|
|
139
136
|
llc = LowLevelCallable(capsule)
|
|
140
137
|
try:
|
|
141
138
|
signature = Signature.from_c_types(llc.signature.encode())
|
|
142
139
|
except KeyError:
|
|
143
140
|
continue
|
|
144
|
-
impls.append((signature,
|
|
141
|
+
impls.append((signature, name))
|
|
145
142
|
return impls
|
|
146
143
|
|
|
147
144
|
|
|
@@ -178,7 +175,7 @@ class _CythonFunctionSpec:
|
|
|
178
175
|
def wrap_cython_function(func, restype, arg_types):
|
|
179
176
|
impls = _available_impls(func)
|
|
180
177
|
compatible = []
|
|
181
|
-
for sig,
|
|
178
|
+
for sig, capi_name in impls:
|
|
182
179
|
if sig.provides(restype, arg_types):
|
|
183
180
|
compatible.append((sig, capi_name))
|
|
184
181
|
|
|
@@ -34,7 +34,6 @@ def _qr_full_pivot(
|
|
|
34
34
|
pivoting=pivoting,
|
|
35
35
|
overwrite_a=overwrite_a,
|
|
36
36
|
check_finite=False,
|
|
37
|
-
lwork=lwork,
|
|
38
37
|
)
|
|
39
38
|
|
|
40
39
|
|
|
@@ -57,7 +56,6 @@ def _qr_full_no_pivot(
|
|
|
57
56
|
pivoting=pivoting,
|
|
58
57
|
overwrite_a=overwrite_a,
|
|
59
58
|
check_finite=False,
|
|
60
|
-
lwork=lwork,
|
|
61
59
|
)
|
|
62
60
|
|
|
63
61
|
|
|
@@ -80,7 +78,6 @@ def _qr_r_pivot(
|
|
|
80
78
|
pivoting=pivoting,
|
|
81
79
|
overwrite_a=overwrite_a,
|
|
82
80
|
check_finite=False,
|
|
83
|
-
lwork=lwork,
|
|
84
81
|
)
|
|
85
82
|
|
|
86
83
|
|
|
@@ -103,7 +100,6 @@ def _qr_r_no_pivot(
|
|
|
103
100
|
pivoting=pivoting,
|
|
104
101
|
overwrite_a=overwrite_a,
|
|
105
102
|
check_finite=False,
|
|
106
|
-
lwork=lwork,
|
|
107
103
|
)
|
|
108
104
|
|
|
109
105
|
|
|
@@ -126,7 +122,6 @@ def _qr_raw_no_pivot(
|
|
|
126
122
|
pivoting=pivoting,
|
|
127
123
|
overwrite_a=overwrite_a,
|
|
128
124
|
check_finite=False,
|
|
129
|
-
lwork=lwork,
|
|
130
125
|
)
|
|
131
126
|
|
|
132
127
|
return H, tau, R
|
|
@@ -151,7 +146,6 @@ def _qr_raw_pivot(
|
|
|
151
146
|
pivoting=pivoting,
|
|
152
147
|
overwrite_a=overwrite_a,
|
|
153
148
|
check_finite=False,
|
|
154
|
-
lwork=lwork,
|
|
155
149
|
)
|
|
156
150
|
|
|
157
151
|
return H, tau, R, P
|