pytensor 3.3.1__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.1/pytensor.egg-info → pytensor-3.3.3}/PKG-INFO +1 -1
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/gallery/introduction/pytensor_intro.ipynb +2 -2
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/prng.rst +1 -1
- {pytensor-3.3.1 → pytensor-3.3.3}/pyproject.toml +1 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/_version.py +3 -3
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/d3viz.py +1 -1
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/fg.py +1 -1
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/traversal.py +2 -2
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/tensor_basic.py +8 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/linker.py +2 -2
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/ops.py +37 -7
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/__init__.py +1 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/basic.py +3 -1
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/blockwise.py +24 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/decomposition.py +10 -4
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/inverse.py +2 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/solvers.py +36 -7
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/summary.py +6 -4
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/pad.py +20 -2
- pytensor-3.3.3/pytensor/link/mlx/dispatch/random.py +276 -0
- {pytensor-3.3.1 → 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.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/subtensor.py +21 -3
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/tensor_basic.py +25 -14
- pytensor-3.3.3/pytensor/link/mlx/linker.py +143 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/cython_support.py +17 -20
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -6
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/scalar.py +2 -8
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/basic.py +7 -1
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/linker.py +2 -2
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/rewriting/numba.py +2 -2
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/variable.py +2 -1
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/summary.py +1 -1
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/random/variable.py +1 -1
- {pytensor-3.3.1 → pytensor-3.3.3/pytensor.egg-info}/PKG-INFO +1 -1
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor.egg-info/SOURCES.txt +1 -0
- pytensor-3.3.1/pytensor/link/mlx/dispatch/sort.py +0 -38
- pytensor-3.3.1/pytensor/link/mlx/linker.py +0 -79
- {pytensor-3.3.1 → pytensor-3.3.3}/LICENSE.txt +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/MANIFEST.in +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/README.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/.templates/layout.html +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/.templates/nb-badges.html +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/LICENSE.txt +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/README.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/acknowledgement.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/bcast.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/bcast.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/blog.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/conf.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/core_development_guide.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/css.inc +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/dev_start_guide.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/environment.yml +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/apply.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/apply.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/apply2.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/ctype.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/extending_faq.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/graphstructures.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/inplace.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/op.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/other_ops.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/pipeline.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/scan.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/tips.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/type.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/unification_kanren.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/unittest.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/extending/using_params.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/faq.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/gallery/applications/tiny_transformer_llm.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/gallery/optimize/root.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/gallery/page_footer.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/glossary.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/Elman_srnn.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/PyTensor.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/binder.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/blocksparse.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/colab.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/github.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/lstm.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/talk2010.gif +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/images/talk2010.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/install.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/internal/how_to_release.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/internal/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/introduction.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/function.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/io.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/mode.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/ops.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/compile/shared.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/config.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/features.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/graph.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/op.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/replace.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/traversal.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/type.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/graph/utils.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/printing.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/scalar/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/scan.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/sparse/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/basic.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/bcast.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/fft.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/functional.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/io.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/linalg.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/optimize.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/random.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/tensor/utils.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/typed_list.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/xtensor/index.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/xtensor/linalg.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/xtensor/math.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/xtensor/module_functions.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/xtensor/random.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/xtensor/signal.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/library/xtensor/type.md +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/links.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/optimizations.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/pylintrc +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/robots.txt +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/troubleshooting.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/adding.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/apply.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/apply.svg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/bcast.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/conditions.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/examples.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/gradients.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/index.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/logistic.gp +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/logistic.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/loop.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/modes.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/profiling.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/sparse.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/doc/user_guide.rst +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/_sparse_lazy.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/alloc.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/blockwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/core.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/diagonal.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/dimshuffle.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/dot.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/elemwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/orthogonal.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/permutation.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/positive_definite.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/reshape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/selection.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/specify.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/subtensor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/symmetric.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/assumptions/triangular.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/bin/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/breakpoint.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/aliasing.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/builders.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/compiledir.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/compilelock.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/debug/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/debug/debugmode.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/debug/dump.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/debug/monitormode.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/debug/nanguardmode.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/debug/profiling.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/executor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/inner_function.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/io.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/maker.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/mode.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/rebuild.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/rewriting.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/configdefaults.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/configparser.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/html/template.html +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/gradient.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/features.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/null_type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/op.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/replace.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/rewriting/reachability.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/graph/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/ifelse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/ipython.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/cutils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/cvm.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/interface.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/op.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/params_type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/c/type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/constructors.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/products.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/solvers.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/linalg/summary.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/scan.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/blas.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/einsum.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/linalg/products.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/bessel.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/beta.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/erf.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/erfcinv.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/gamma.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/gammainc.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/helpers.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/scalar/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/cache.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/_llvmlite_self_ref.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/_patch_list_to_tuple.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/_patch_pointer_add.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/blockwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/compile_ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/elemwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/_BLAS.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/constructors.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/dispatch.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/eigen.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/decomposition/svd.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/products.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/cholesky.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/dispatch.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/general.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/hermitian.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/linear_control.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/lu_solve.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/posdef.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/symmetric.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/tridiagonal.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/solvers/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/summary.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/random.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/scan.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sort.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sparse/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sparse/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sparse/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/sparse/variable.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/subtensor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/typed_list.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/numba/linker.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/products.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/linalg/summary.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/link/vm.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/check_blas.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/frozendict.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/npy_2_compat.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/printing.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/py.typed +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/raise_op.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/loop.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/op.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/db.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/inner_graph.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/inplace.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/io.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/merge.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/push_out.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/trace.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/rewriting/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/scan/views.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/linalg.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/sparse/variable.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/_core.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/batched.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/blas_c.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/alt_blas_common.h +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/alt_blas_template.c +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/blas_headers.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/c_code/codegen.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/gemm.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/gemv.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blas/ger.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/blockwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/einsum.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/elemwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/extra_ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/fft.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/fourier.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/functional.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/_lazy.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/constructors.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/cholesky.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/eigen.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/lu.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/qr.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/schur.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/decomposition/svd.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/dtype_utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/inverse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/products.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/core.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/general.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/linear_control.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/lstsq.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/psd.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/triangular.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/solvers/tridiagonal.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/linalg/summary.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/nlinalg.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/optimize.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/pad.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/op.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/reshape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/assumptions.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/blas.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/elemwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/fused_elemwise.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/decomposition.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/inverse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/products.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/solvers.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/linalg/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/optimize.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/reshape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/subtensor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/signal/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/signal/conv.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/slinalg.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/sort.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/special.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/subtensor.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/symbolic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/type_other.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/var.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/variable.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/typed_list/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/typed_list/type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/indexing.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/linalg.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/random/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/random/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/random/type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/reduction.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/rewriting/__init__.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/rewriting/basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/rewriting/indexing.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/rewriting/math.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/rewriting/reduction.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/rewriting/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/rewriting/utils.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/rewriting/vectorization.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/shape.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/signal.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/type.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor/xtensor/vectorization.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor.egg-info/requires.txt +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/scripts/mypy-failing.txt +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/setup.cfg +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/setup.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/tests/test_basic.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/tests/test_breakpoint.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/tests/test_config.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/tests/test_gradient.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/tests/test_ifelse.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/tests/test_printing.py +0 -0
- {pytensor-3.3.1 → pytensor-3.3.3}/tests/test_raise_op.py +0 -0
- {pytensor-3.3.1 → 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
|
|
|
@@ -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
|
|
|
@@ -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):
|
|
@@ -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)
|
|
@@ -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,30 +29,47 @@ 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
|
|
|
33
46
|
@mlx_funcify.register(SolveTriangular)
|
|
34
47
|
def mlx_funcify_SolveTriangular(op, node, **kwargs):
|
|
35
48
|
lower = op.lower
|
|
49
|
+
unit_diagonal = op.unit_diagonal
|
|
36
50
|
A_dtype = getattr(mx, node.inputs[0].dtype)
|
|
37
51
|
b_dtype = getattr(mx, node.inputs[1].dtype)
|
|
52
|
+
b_ndim = op.b_ndim
|
|
38
53
|
|
|
39
54
|
def solve_triangular(A, b):
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
55
|
+
A = A.astype(stream=mx.cpu, dtype=A_dtype)
|
|
56
|
+
|
|
57
|
+
if unit_diagonal:
|
|
58
|
+
# MLX's `solve_triangular` has no `unit_diagonal`. LAPACK's `trtrs`
|
|
59
|
+
# never reads the diagonal in that mode, so overwriting it with ones
|
|
60
|
+
# gives the same answer.
|
|
61
|
+
diagonal_mask = mx.eye(A.shape[-1], dtype=mx.bool_, stream=mx.cpu)
|
|
62
|
+
A = mx.where(diagonal_mask, mx.array(1, dtype=A_dtype), A, stream=mx.cpu)
|
|
63
|
+
|
|
64
|
+
out = mx.linalg.solve_triangular(
|
|
65
|
+
A,
|
|
66
|
+
_as_column(b.astype(stream=mx.cpu, dtype=b_dtype), b_ndim),
|
|
43
67
|
upper=not lower,
|
|
44
68
|
stream=mx.cpu,
|
|
45
69
|
)
|
|
70
|
+
return _from_column(out, b_ndim)
|
|
46
71
|
|
|
72
|
+
solve_triangular.natively_batched = True
|
|
47
73
|
return solve_triangular
|
|
48
74
|
|
|
49
75
|
|
|
@@ -52,15 +78,18 @@ def mlx_funcify_CholeskySolve(op, node, **kwargs):
|
|
|
52
78
|
lower = op.lower
|
|
53
79
|
c_dtype = getattr(mx, node.inputs[0].dtype)
|
|
54
80
|
b_dtype = getattr(mx, node.inputs[1].dtype)
|
|
81
|
+
b_ndim = op.b_ndim
|
|
55
82
|
|
|
56
83
|
# MLX has no cho_solve, so with A = L L.T we solve L y = b then L.T x = y.
|
|
57
84
|
def cho_solve(c, b):
|
|
58
85
|
c = c.astype(stream=mx.cpu, dtype=c_dtype)
|
|
59
|
-
b = b.astype(stream=mx.cpu, dtype=b_dtype)
|
|
86
|
+
b = _as_column(b.astype(stream=mx.cpu, dtype=b_dtype), b_ndim)
|
|
60
87
|
c_T = mx.swapaxes(c, -1, -2, stream=mx.cpu)
|
|
61
88
|
L, L_T = (c, c_T) if lower else (c_T, c)
|
|
62
89
|
|
|
63
90
|
y = mx.linalg.solve_triangular(L, b, upper=False, stream=mx.cpu)
|
|
64
|
-
|
|
91
|
+
out = mx.linalg.solve_triangular(L_T, y, upper=True, stream=mx.cpu)
|
|
92
|
+
return _from_column(out, b_ndim)
|
|
65
93
|
|
|
94
|
+
cho_solve.natively_batched = True
|
|
66
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
|
|