pytensor 3.2.3__tar.gz → 3.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pytensor-3.2.3/pytensor.egg-info → pytensor-3.3.0}/PKG-INFO +4 -3
- {pytensor-3.2.3 → pytensor-3.3.0}/pyproject.toml +13 -5
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/_version.py +3 -3
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/rewriting.py +9 -9
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/features.py +4 -4
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/rewriting/unify.py +2 -1
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/scalar.py +17 -2
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/subtensor.py +7 -1
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/basic.py +23 -7
- pytensor-3.3.0/pytensor/link/mlx/dispatch/blockwise.py +64 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/linalg/decomposition.py +9 -8
- pytensor-3.3.0/pytensor/link/mlx/dispatch/linalg/summary.py +38 -0
- pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/__init__.py +1 -0
- pytensor-3.2.3/pytensor/link/mlx/dispatch/scalar.py → pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/basic.py +9 -51
- pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/bessel.py +525 -0
- pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/erf.py +333 -0
- pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/erfcinv.py +150 -0
- pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/gamma.py +56 -0
- pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/helpers.py +62 -0
- pytensor-3.3.0/pytensor/link/mlx/dispatch/scalar/math.py +174 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/random.py +1 -1
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/vectorize_codegen.py +6 -11
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/basic.py +6 -6
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/math.py +8 -1
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/__init__.py +4 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/extra_ops.py +4 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/math.py +0 -49
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/pad.py +214 -226
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/math.py +31 -99
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/ofg.py +2 -2
- pytensor-3.3.0/pytensor/tensor/rewriting/special.py +184 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/subtensor.py +52 -1
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/subtensor_lift.py +106 -8
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/special.py +103 -5
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/utils.py +9 -3
- {pytensor-3.2.3 → pytensor-3.3.0/pytensor.egg-info}/PKG-INFO +4 -3
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor.egg-info/SOURCES.txt +8 -1
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor.egg-info/requires.txt +2 -2
- pytensor-3.2.3/pytensor/link/mlx/dispatch/blockwise.py +0 -42
- pytensor-3.2.3/pytensor/link/mlx/dispatch/linalg/summary.py +0 -46
- pytensor-3.2.3/pytensor/tensor/rewriting/special.py +0 -97
- {pytensor-3.2.3 → pytensor-3.3.0}/LICENSE.txt +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/MANIFEST.in +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/README.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/.templates/layout.html +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/.templates/nb-badges.html +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/LICENSE.txt +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/README.md +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/acknowledgement.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/bcast.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/bcast.svg +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/blog.md +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/conf.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/core_development_guide.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/css.inc +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/dev_start_guide.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/environment.yml +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/apply.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/apply.svg +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/apply2.svg +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/ctype.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/extending_faq.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/graphstructures.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/index.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/inplace.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/op.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/other_ops.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/pipeline.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/scan.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/tips.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/type.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/unification_kanren.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/unittest.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/extending/using_params.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/faq.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/gallery/applications/tiny_transformer_llm.ipynb +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/gallery/optimize/root.ipynb +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/gallery/page_footer.md +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/glossary.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/Elman_srnn.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/PyTensor.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/binder.svg +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/blocksparse.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/colab.svg +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/github.svg +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/lstm.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/talk2010.gif +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/images/talk2010.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/index.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/install.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/internal/how_to_release.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/internal/index.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/introduction.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/function.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/index.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/io.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/mode.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/ops.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/compile/shared.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/config.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/index.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/graph/features.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/graph/graph.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/graph/index.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/graph/op.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/graph/replace.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/graph/type.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/graph/utils.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/index.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/printing.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/scalar/index.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/scan.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/sparse/index.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/basic.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/bcast.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/fft.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/functional.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/index.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/io.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/linalg.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/optimize.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/random.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/tensor/utils.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/typed_list.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/xtensor/index.md +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/xtensor/linalg.md +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/xtensor/math.md +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/xtensor/module_functions.md +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/xtensor/random.md +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/xtensor/signal.md +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/library/xtensor/type.md +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/links.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/optimizations.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/pylintrc +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/robots.txt +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/troubleshooting.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/adding.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/apply.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/apply.svg +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/bcast.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/conditions.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/examples.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/gradients.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/index.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/logistic.gp +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/logistic.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/loop.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/modes.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/prng.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/profiling.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/sparse.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/doc/user_guide.rst +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/_sparse_lazy.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/alloc.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/blockwise.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/core.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/diagonal.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/dimshuffle.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/dot.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/elemwise.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/orthogonal.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/permutation.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/positive_definite.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/reshape.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/selection.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/shape.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/specify.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/subtensor.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/symmetric.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/assumptions/triangular.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/bin/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/breakpoint.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/aliasing.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/builders.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/compiledir.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/compilelock.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/debug/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/debug/debugmode.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/debug/dump.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/debug/monitormode.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/debug/nanguardmode.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/debug/profiling.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/executor.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/inner_function.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/io.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/maker.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/mode.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/ops.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/rebuild.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/configdefaults.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/configparser.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/html/template.html +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/gradient.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/fg.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/null_type.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/op.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/replace.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/rewriting/reachability.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/traversal.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/type.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/graph/utils.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/ifelse.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/ipython.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/cutils.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/cvm.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/interface.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/op.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/params_type.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/c/type.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/linalg/constructors.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/linalg/products.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/linalg/solvers.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/linalg/summary.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/scan.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/linker.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/jax/ops.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/blas.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/einsum.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/linalg/products.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/linalg/solvers.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/math.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/pad.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/shape.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/sort.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/dispatch/tensor_basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/mlx/linker.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/cache.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/_llvmlite_self_ref.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/_patch_pointer_add.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/blockwise.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/compile_ops.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/elemwise.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/constructors.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/dispatch.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/eigen.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/decomposition/svd.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/products.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/cholesky.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/dispatch.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/general.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/hermitian.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/linear_control.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/lu_solve.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/posdef.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/symmetric.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/tridiagonal.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/solvers/utils.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/summary.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/scalar.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/scan.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/shape.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/sort.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/sparse/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/sparse/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/sparse/math.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/sparse/variable.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/subtensor.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/dispatch/typed_list.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/numba/linker.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/linalg/products.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/linalg/summary.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/shape.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/utils.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/link/vm.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/check_blas.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/frozendict.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/npy_2_compat.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/printing.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/py.typed +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/raise_op.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/loop.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/math.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/op.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/db.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/inner_graph.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/inplace.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/io.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/merge.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/push_out.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/trace.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/rewriting/utils.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/utils.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/scan/views.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/linalg.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/type.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/utils.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/sparse/variable.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/_core.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/batched.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/blas_c.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/c_code/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/c_code/alt_blas_common.h +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/c_code/alt_blas_template.c +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/c_code/blas_headers.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/c_code/codegen.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/gemm.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/gemv.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blas/ger.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/blockwise.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/einsum.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/elemwise.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/fft.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/fourier.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/functional.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/_lazy.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/constructors.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/decomposition/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/decomposition/cholesky.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/decomposition/eigen.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/decomposition/lu.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/decomposition/qr.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/decomposition/schur.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/decomposition/svd.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/dtype_utils.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/inverse.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/products.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/solvers/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/solvers/core.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/solvers/general.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/solvers/linear_control.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/solvers/lstsq.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/solvers/psd.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/solvers/triangular.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/solvers/tridiagonal.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/linalg/summary.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/nlinalg.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/optimize.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/op.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/type.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/random/variable.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/reshape.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/assumptions.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/blas.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/elemwise.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/fused_elemwise.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/linalg/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/linalg/decomposition.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/linalg/inverse.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/linalg/products.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/linalg/solvers.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/linalg/summary.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/linalg/utils.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/optimize.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/reshape.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/shape.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/shape.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/signal/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/signal/conv.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/slinalg.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/sort.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/subtensor.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/symbolic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/type.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/type_other.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/var.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/variable.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/typed_list/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/typed_list/type.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/utils.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/indexing.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/linalg.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/math.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/random/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/random/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/random/type.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/random/variable.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/reduction.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/rewriting/__init__.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/rewriting/basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/rewriting/indexing.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/rewriting/math.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/rewriting/reduction.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/rewriting/shape.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/rewriting/utils.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/rewriting/vectorization.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/shape.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/signal.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/type.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor/xtensor/vectorization.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/scripts/mypy-failing.txt +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/setup.cfg +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/setup.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/tests/test_basic.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/tests/test_breakpoint.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/tests/test_config.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/tests/test_gradient.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/tests/test_ifelse.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/tests/test_printing.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/tests/test_raise_op.py +0 -0
- {pytensor-3.2.3 → pytensor-3.3.0}/tests/test_rop.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pytensor
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.3.0
|
|
4
4
|
Summary: Optimizing compiler for evaluating mathematical expressions on CPUs and GPUs.
|
|
5
5
|
Author-email: pymc-devs <pymc.devs@gmail.com>
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -24,13 +24,14 @@ Classifier: Programming Language :: Python :: 3
|
|
|
24
24
|
Classifier: Programming Language :: Python :: 3.12
|
|
25
25
|
Classifier: Programming Language :: Python :: 3.13
|
|
26
26
|
Classifier: Programming Language :: Python :: 3.14
|
|
27
|
+
Classifier: Programming Language :: Python :: Free Threading :: 1 - Unstable
|
|
27
28
|
Requires-Python: <3.15,>=3.12
|
|
28
29
|
Description-Content-Type: text/x-rst
|
|
29
30
|
License-File: LICENSE.txt
|
|
30
31
|
Requires-Dist: setuptools>=59.0.0
|
|
31
32
|
Requires-Dist: scipy<2,>=1
|
|
32
33
|
Requires-Dist: numpy>=2.0
|
|
33
|
-
Requires-Dist: numba<=0.
|
|
34
|
+
Requires-Dist: numba<=0.66.0,>=0.58
|
|
34
35
|
Requires-Dist: filelock>=3.15
|
|
35
36
|
Provides-Extra: complete
|
|
36
37
|
Requires-Dist: pytensor[jax]; extra == "complete"
|
|
@@ -56,7 +57,7 @@ Provides-Extra: jax
|
|
|
56
57
|
Requires-Dist: jax; extra == "jax"
|
|
57
58
|
Requires-Dist: jaxlib; extra == "jax"
|
|
58
59
|
Provides-Extra: numba
|
|
59
|
-
Requires-Dist: numba<=0.
|
|
60
|
+
Requires-Dist: numba<=0.66.0,>=0.58; extra == "numba"
|
|
60
61
|
Requires-Dist: llvmlite; extra == "numba"
|
|
61
62
|
Provides-Extra: kanren
|
|
62
63
|
Requires-Dist: etuples; extra == "kanren"
|
|
@@ -33,6 +33,7 @@ classifiers = [
|
|
|
33
33
|
"Programming Language :: Python :: 3.12",
|
|
34
34
|
"Programming Language :: Python :: 3.13",
|
|
35
35
|
"Programming Language :: Python :: 3.14",
|
|
36
|
+
"Programming Language :: Python :: Free Threading :: 1 - Unstable",
|
|
36
37
|
]
|
|
37
38
|
|
|
38
39
|
keywords = [
|
|
@@ -49,7 +50,7 @@ dependencies = [
|
|
|
49
50
|
"setuptools>=59.0.0",
|
|
50
51
|
"scipy>=1,<2",
|
|
51
52
|
"numpy>=2.0",
|
|
52
|
-
"numba>=0.58,<=0.
|
|
53
|
+
"numba>=0.58,<=0.66.0",
|
|
53
54
|
"filelock>=3.15",
|
|
54
55
|
]
|
|
55
56
|
|
|
@@ -77,7 +78,7 @@ tests = [
|
|
|
77
78
|
]
|
|
78
79
|
rtd = ["sphinx>=5.1.0,<6", "pygments", "pydot"]
|
|
79
80
|
jax = ["jax", "jaxlib"]
|
|
80
|
-
numba = ["numba>=0.58,<=0.
|
|
81
|
+
numba = ["numba>=0.58,<=0.66.0", "llvmlite"]
|
|
81
82
|
kanren = [
|
|
82
83
|
"etuples",
|
|
83
84
|
"logical-unification",
|
|
@@ -185,11 +186,18 @@ files = ["pytensor", "tests"]
|
|
|
185
186
|
build = "*"
|
|
186
187
|
# Uncomment to skip builds that compile but fail when trying to test (maybe due to incompatibility with runner)
|
|
187
188
|
# archs = ["auto64"]
|
|
188
|
-
# Disable any-platform (pp*)
|
|
189
|
+
# Disable any-platform (pp*) and 32-bit builds
|
|
189
190
|
# Additional options to consider: "*musllinux*"
|
|
190
|
-
skip = ["pp*", "*-win32", "*-manylinux_i686"
|
|
191
|
+
skip = ["pp*", "*-win32", "*-manylinux_i686"]
|
|
192
|
+
# Free-threaded (cp*t-*) wheels are built by default. The compiled extensions
|
|
193
|
+
# are not marked free-threading-safe, so importing them re-enables the GIL
|
|
194
|
+
# (with a warning). That's fine: they're no longer loaded by default.
|
|
191
195
|
build-frontend = "build"
|
|
192
|
-
|
|
196
|
+
# Import the compiled extensions and evaluate a function to check the wheel loads and
|
|
197
|
+
# runs everywhere, including free-threaded builds. cxx="" disables the C backend (the
|
|
198
|
+
# minimal wheel-test env has no libpython to link a runtime-compiled thunk against) and
|
|
199
|
+
# FAST_COMPILE avoids numba, which crashes on free-threaded Windows.
|
|
200
|
+
test-command = '''python -c "import pytensor; pytensor.config.cxx = ''; import pytensor.tensor as pt; print(pytensor.__version__); from pytensor.scan import scan_perform; print(scan_perform.get_version()); x = pt.vector(); f = pytensor.function([x], (x * 2).sum(), mode='FAST_COMPILE'); assert float(f([1.0, 2.0, 3.0])) == 12.0"'''
|
|
193
201
|
test-skip = ["*musllinux*", "*i686*"]
|
|
194
202
|
|
|
195
203
|
# Testing seems to be running into issues locating libs where expected
|
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2026-
|
|
11
|
+
"date": "2026-08-12T10:16:27+0200",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "3.
|
|
14
|
+
"full-revisionid": "aa1bc7772eb11ed8def2814374aeb5da03da590c",
|
|
15
|
+
"version": "3.3.0"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -7,7 +7,7 @@ from pytensor.compile.aliasing import (
|
|
|
7
7
|
add_supervisor_to_fgraph,
|
|
8
8
|
insert_deepcopy,
|
|
9
9
|
)
|
|
10
|
-
from pytensor.compile.builders import OpFromGraph
|
|
10
|
+
from pytensor.compile.builders import OpFromGraph, SymbolicOp
|
|
11
11
|
from pytensor.compile.io import In, Out
|
|
12
12
|
from pytensor.compile.mode import optdb
|
|
13
13
|
from pytensor.graph.basic import Apply, Variable
|
|
@@ -134,12 +134,12 @@ def rewrite_ofg_inner_graph(linker, op, node, inner, *, mode):
|
|
|
134
134
|
)
|
|
135
135
|
|
|
136
136
|
|
|
137
|
-
def _ofg_inner_optimizer(mode):
|
|
138
|
-
# Recognition
|
|
139
|
-
#
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
return mode.
|
|
137
|
+
def _ofg_inner_optimizer(mode, op):
|
|
138
|
+
# Recognition would re-create a `SymbolicOp` inside its own inner graph and never
|
|
139
|
+
# terminate. Any other `OpFromGraph` must keep it, or wrapping destabilizes the body.
|
|
140
|
+
if isinstance(op, SymbolicOp):
|
|
141
|
+
return mode.excluding("symbolic_op_recognition").optimizer
|
|
142
|
+
return mode.optimizer
|
|
143
143
|
|
|
144
144
|
|
|
145
145
|
@rewrite_ofg_inner_graph.register(VMLinker)
|
|
@@ -152,7 +152,7 @@ def destructive_rewrite_ofg_inner_graph(linker, op, node, inner, *, mode):
|
|
|
152
152
|
# still be baked between purely internal buffers.
|
|
153
153
|
input_specs = [In(x, borrow=True, mutable=False) for x in inner.inputs]
|
|
154
154
|
add_supervisor_to_fgraph(fgraph=inner, input_specs=input_specs, accept_inplace=True)
|
|
155
|
-
_ofg_inner_optimizer(mode).rewrite(inner)
|
|
155
|
+
_ofg_inner_optimizer(mode, op).rewrite(inner)
|
|
156
156
|
# The op's outputs must not alias its inputs or each other (it declares no
|
|
157
157
|
# view_map, so the outer graph cannot see such aliases); deepcopies break any
|
|
158
158
|
# boundary alias the optimized graph ends up with.
|
|
@@ -165,7 +165,7 @@ def destructive_rewrite_ofg_inner_graph(linker, op, node, inner, *, mode):
|
|
|
165
165
|
@rewrite_ofg_inner_graph.register(MLXLinker)
|
|
166
166
|
def functional_rewrite_ofg_inner_graph(linker, op, node, inner, *, mode):
|
|
167
167
|
"""Structurally optimize the inner graph for the functional JIT backends."""
|
|
168
|
-
_ofg_inner_optimizer(mode).rewrite(inner)
|
|
168
|
+
_ofg_inner_optimizer(mode, op).rewrite(inner)
|
|
169
169
|
|
|
170
170
|
|
|
171
171
|
@graph_rewriter
|
|
@@ -546,10 +546,10 @@ class FullHistory(Feature):
|
|
|
546
546
|
└─ ···
|
|
547
547
|
>> local_softmax_stabilize
|
|
548
548
|
Log [id A] 1
|
|
549
|
-
└─ Softmax{axis=
|
|
549
|
+
└─ Softmax{axis=(0,)} [id B] 0
|
|
550
550
|
└─ x [id C]
|
|
551
551
|
>> local_logsoftmax
|
|
552
|
-
LogSoftmax{axis=
|
|
552
|
+
LogSoftmax{axis=(0,)} [id A] 0
|
|
553
553
|
└─ x [id B]
|
|
554
554
|
|
|
555
555
|
|
|
@@ -563,7 +563,7 @@ class FullHistory(Feature):
|
|
|
563
563
|
.. testoutput::
|
|
564
564
|
>> local_logsoftmax
|
|
565
565
|
Log [id A] 1
|
|
566
|
-
└─ Softmax{axis=
|
|
566
|
+
└─ Softmax{axis=(0,)} [id B] 0
|
|
567
567
|
└─ x [id C]
|
|
568
568
|
>> local_softmax_stabilize
|
|
569
569
|
Log [id A] 4
|
|
@@ -591,7 +591,7 @@ class FullHistory(Feature):
|
|
|
591
591
|
|
|
592
592
|
.. testoutput::
|
|
593
593
|
Log [id A] 1
|
|
594
|
-
└─ Softmax{axis=
|
|
594
|
+
└─ Softmax{axis=(0,)} [id B] 0
|
|
595
595
|
└─ x [id C]
|
|
596
596
|
|
|
597
597
|
|
|
@@ -572,7 +572,8 @@ def reify_pattern(pattern, subs: Mapping[PatternVar | Asterisk, Any]):
|
|
|
572
572
|
inputs.extend(captured)
|
|
573
573
|
else:
|
|
574
574
|
inputs.append(reify_pattern(p, subs))
|
|
575
|
-
|
|
575
|
+
# Call the Op, so those that build state lazily (SymbolicOp) are constructed
|
|
576
|
+
return op(*inputs)
|
|
576
577
|
|
|
577
578
|
if isinstance(pattern, OpPattern):
|
|
578
579
|
op_type = pattern.op_type
|
|
@@ -263,14 +263,29 @@ def jax_funcify_Erfinv(op, **kwargs):
|
|
|
263
263
|
|
|
264
264
|
|
|
265
265
|
@jax_funcify.register(BetaIncInv)
|
|
266
|
-
@jax_funcify.register(Erfcx)
|
|
267
|
-
@jax_funcify.register(Erfcinv)
|
|
268
266
|
def jax_funcify_from_tfp(op, **kwargs):
|
|
269
267
|
tfp_jax_op = try_import_tfp_jax_op(op)
|
|
270
268
|
|
|
271
269
|
return tfp_jax_op
|
|
272
270
|
|
|
273
271
|
|
|
272
|
+
@jax_funcify.register(Erfcx)
|
|
273
|
+
def jax_funcify_Erfcx(op, **kwargs):
|
|
274
|
+
if hasattr(jax.scipy.special, "erfcx"):
|
|
275
|
+
return jax.scipy.special.erfcx
|
|
276
|
+
# jax < 0.11 has no native erfcx
|
|
277
|
+
return try_import_tfp_jax_op(op)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
@jax_funcify.register(Erfcinv)
|
|
281
|
+
def jax_funcify_Erfcinv(op, **kwargs):
|
|
282
|
+
def erfcinv(x):
|
|
283
|
+
# erfc(z) = 2 ndtr(-z * sqrt(2)), so z = -ndtri(x / 2) / sqrt(2)
|
|
284
|
+
return -jax.scipy.special.ndtri(x / 2) / jnp.sqrt(2)
|
|
285
|
+
|
|
286
|
+
return erfcinv
|
|
287
|
+
|
|
288
|
+
|
|
274
289
|
@jax_funcify.register(NdtriExp)
|
|
275
290
|
def jax_funcify_NdtriExp(op, **kwargs):
|
|
276
291
|
def ndtri_exp(x):
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import jax.numpy as jnp
|
|
2
|
+
|
|
1
3
|
from pytensor.link.jax.dispatch.basic import jax_funcify
|
|
2
4
|
from pytensor.tensor.subtensor import (
|
|
3
5
|
AdvancedIncSubtensor,
|
|
@@ -60,7 +62,11 @@ def jax_funcify_IncSubtensor(op, node, **kwargs):
|
|
|
60
62
|
indices = indices[0]
|
|
61
63
|
|
|
62
64
|
if isinstance(op, AdvancedIncSubtensor):
|
|
63
|
-
|
|
65
|
+
# jax_typify downgrades 0d arrays to Python scalars, which have no .shape,
|
|
66
|
+
# so re-arrayify y for a check that is written against array values.
|
|
67
|
+
op._check_runtime_broadcast_of_vector_index(
|
|
68
|
+
node, x, jnp.asarray(y), indices
|
|
69
|
+
)
|
|
64
70
|
|
|
65
71
|
return jax_fn(x, indices, y)
|
|
66
72
|
|
|
@@ -15,25 +15,36 @@ from pytensor.link.utils import fgraph_to_python
|
|
|
15
15
|
from pytensor.raise_op import Assert, CheckAndRaise
|
|
16
16
|
|
|
17
17
|
|
|
18
|
+
def float64_supported():
|
|
19
|
+
"""Return whether the current default device can operate on float64.
|
|
20
|
+
|
|
21
|
+
MLX implements float64 on the CPU only; the Metal backend rejects it outright.
|
|
22
|
+
"""
|
|
23
|
+
return mx.default_device() == mx.cpu
|
|
24
|
+
|
|
25
|
+
|
|
18
26
|
def convert_dtype_to_mlx(dtype_str, auto_cast_unsupported=True):
|
|
19
27
|
"""Convert PyTensor dtype strings to MLX dtype objects.
|
|
20
28
|
|
|
21
29
|
MLX expects dtype objects rather than string literals for type conversion.
|
|
22
30
|
This function maps common dtype strings to their MLX equivalents.
|
|
23
31
|
|
|
32
|
+
float64 survives when the default device supports it and is narrowed to float32
|
|
33
|
+
otherwise. complex128 is always narrowed, MLX having no wider complex type.
|
|
34
|
+
|
|
24
35
|
Parameters
|
|
25
36
|
----------
|
|
26
37
|
dtype_str : str or MLX dtype
|
|
27
38
|
The dtype to convert
|
|
28
|
-
auto_cast_unsupported : bool
|
|
29
|
-
If True,
|
|
39
|
+
auto_cast_unsupported : bool, optional
|
|
40
|
+
If True, narrow dtypes the current device cannot handle, warning as it does so.
|
|
41
|
+
If False, return the requested dtype and let any later failure surface. Default
|
|
42
|
+
True.
|
|
30
43
|
|
|
31
44
|
Returns
|
|
32
45
|
-------
|
|
33
46
|
MLX dtype object
|
|
34
47
|
"""
|
|
35
|
-
import warnings
|
|
36
|
-
|
|
37
48
|
if isinstance(dtype_str, str):
|
|
38
49
|
if dtype_str == "bool":
|
|
39
50
|
return mx.bool_
|
|
@@ -58,11 +69,12 @@ def convert_dtype_to_mlx(dtype_str, auto_cast_unsupported=True):
|
|
|
58
69
|
elif dtype_str == "float32":
|
|
59
70
|
return mx.float32
|
|
60
71
|
elif dtype_str == "float64":
|
|
61
|
-
if auto_cast_unsupported:
|
|
72
|
+
if auto_cast_unsupported and not float64_supported():
|
|
62
73
|
warnings.warn(
|
|
63
74
|
"MLX does not support float64 on GPU. Automatically casting to float32. "
|
|
64
|
-
"This may result in reduced precision. To
|
|
65
|
-
"
|
|
75
|
+
"This may result in reduced precision. To keep float64, run on the CPU "
|
|
76
|
+
"device with mx.set_default_device(mx.cpu); to avoid this warning, use "
|
|
77
|
+
"float32 or set floatX='float32' in PyTensor config.",
|
|
66
78
|
UserWarning,
|
|
67
79
|
stacklevel=3,
|
|
68
80
|
)
|
|
@@ -116,6 +128,10 @@ def mlx_typify(data, **kwargs):
|
|
|
116
128
|
|
|
117
129
|
@mlx_typify.register(np.ndarray)
|
|
118
130
|
def mlx_typify_tensor(data, dtype=None, **kwargs):
|
|
131
|
+
# mx.array narrows float64 input to float32 unless the dtype is named explicitly,
|
|
132
|
+
# and it does so on the CPU too, where float64 is perfectly usable
|
|
133
|
+
if dtype is None and data.dtype == np.float64 and float64_supported():
|
|
134
|
+
dtype = mx.float64
|
|
119
135
|
return _nan_safe_constant(data, dtype=dtype)
|
|
120
136
|
|
|
121
137
|
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import mlx.core as mx
|
|
2
|
+
|
|
3
|
+
from pytensor.link.mlx.dispatch import mlx_funcify
|
|
4
|
+
from pytensor.tensor.blockwise import Blockwise, _check_runtime_broadcast_core
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@mlx_funcify.register(Blockwise)
|
|
8
|
+
def funcify_Blockwise(op: Blockwise, node, **kwargs):
|
|
9
|
+
core_node = op._create_dummy_core_node(node.inputs)
|
|
10
|
+
core_f = mlx_funcify(op.core_op, node=core_node)
|
|
11
|
+
|
|
12
|
+
batch_ndim = op.batch_ndim(node)
|
|
13
|
+
if batch_ndim == 0:
|
|
14
|
+
return core_f
|
|
15
|
+
|
|
16
|
+
multi_output = len(node.outputs) > 1
|
|
17
|
+
core_ndims = [len(sig) for sig in op.inputs_sig]
|
|
18
|
+
|
|
19
|
+
# Hoisted out of the per-call path, unlike Blockwise._check_runtime_broadcast.
|
|
20
|
+
batch_bcast = [inp.type.broadcastable[:batch_ndim] for inp in node.inputs]
|
|
21
|
+
|
|
22
|
+
# Decide batching purely from static shapes so a graph batches identically
|
|
23
|
+
# here and in every other backend: a batch axis broadcasts (is never mapped)
|
|
24
|
+
# only when its static size is exactly 1, or the input lacks it entirely.
|
|
25
|
+
squeeze_axes, padded_batch = [], []
|
|
26
|
+
for inp, n_core_dims in zip(node.inputs, core_ndims):
|
|
27
|
+
batch_shape = inp.type.shape[: inp.type.ndim - n_core_dims]
|
|
28
|
+
squeeze_axes.append(tuple(i for i, s in enumerate(batch_shape) if s == 1))
|
|
29
|
+
padded_batch.append((1,) * (batch_ndim - len(batch_shape)) + tuple(batch_shape))
|
|
30
|
+
|
|
31
|
+
# Nest one mx.vmap per mapped batch axis (innermost first, so array axis 0
|
|
32
|
+
# tracks the outermost batch dim). All-broadcast axes are squeezed out of
|
|
33
|
+
# every input above and re-inserted as size-1 dims after the mapped call.
|
|
34
|
+
fn, expand_axes = core_f, []
|
|
35
|
+
for axis in reversed(range(batch_ndim)):
|
|
36
|
+
in_axes = tuple(None if shape[axis] == 1 else 0 for shape in padded_batch)
|
|
37
|
+
if all(ax is None for ax in in_axes):
|
|
38
|
+
expand_axes.append(axis)
|
|
39
|
+
else:
|
|
40
|
+
fn = mx.vmap(fn, in_axes=in_axes)
|
|
41
|
+
|
|
42
|
+
expand_axes.sort()
|
|
43
|
+
|
|
44
|
+
def blockwise(*args):
|
|
45
|
+
# Other backends reject a runtime size-1 batch dim that is not statically
|
|
46
|
+
# broadcastable; match them rather than silently broadcasting here.
|
|
47
|
+
_check_runtime_broadcast_core(args, batch_bcast, batch_ndim)
|
|
48
|
+
|
|
49
|
+
squeezed = [
|
|
50
|
+
mx.squeeze(arg, axes) if axes else arg
|
|
51
|
+
for arg, axes in zip(args, squeeze_axes)
|
|
52
|
+
]
|
|
53
|
+
out = fn(*squeezed)
|
|
54
|
+
if not expand_axes:
|
|
55
|
+
return tuple(out) if multi_output else out
|
|
56
|
+
|
|
57
|
+
# Re-insert the never-mapped all-broadcast axes as size-1 dims, in
|
|
58
|
+
# ascending order so each insertion's index stays valid for the next.
|
|
59
|
+
outs = out if multi_output else (out,)
|
|
60
|
+
for ax in expand_axes:
|
|
61
|
+
outs = [mx.expand_dims(o, ax) for o in outs]
|
|
62
|
+
return tuple(outs) if multi_output else outs[0]
|
|
63
|
+
|
|
64
|
+
return blockwise
|
|
@@ -139,14 +139,15 @@ def mlx_funcify_PivotToPermutations(op, **kwargs):
|
|
|
139
139
|
inverse = op.inverse
|
|
140
140
|
|
|
141
141
|
def pivot_to_permutations(pivots):
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
142
|
+
with mx.stream(mx.cpu):
|
|
143
|
+
pivots = mx.array(pivots)
|
|
144
|
+
n = pivots.shape[0]
|
|
145
|
+
p_inv = mx.arange(n, dtype=mx.int32)
|
|
146
|
+
for i in range(n):
|
|
147
|
+
p_inv[i], p_inv[pivots[i]] = p_inv[pivots[i]], p_inv[i]
|
|
148
|
+
if inverse:
|
|
149
|
+
return p_inv
|
|
150
|
+
return mx.argsort(p_inv)
|
|
150
151
|
|
|
151
152
|
return pivot_to_permutations
|
|
152
153
|
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import mlx.core as mx
|
|
2
|
+
|
|
3
|
+
from pytensor.link.mlx.dispatch.basic import mlx_funcify
|
|
4
|
+
from pytensor.tensor.linalg.summary import Det, SLogDet
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def _lu_det_parts(x):
|
|
8
|
+
"""Compute sign and logdet via LU factorization. Call within a CPU stream context."""
|
|
9
|
+
lu, pivots = mx.linalg.lu_factor(x)
|
|
10
|
+
diag_u = mx.diagonal(lu)
|
|
11
|
+
n_swaps = mx.sum(pivots != mx.arange(pivots.shape[0], dtype=pivots.dtype))
|
|
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)))
|
|
15
|
+
return sign, logabsdet
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@mlx_funcify.register(Det)
|
|
19
|
+
def mlx_funcify_Det(op, node, **kwargs):
|
|
20
|
+
X_dtype = getattr(mx, node.inputs[0].dtype)
|
|
21
|
+
|
|
22
|
+
def det(x):
|
|
23
|
+
with mx.stream(mx.cpu):
|
|
24
|
+
sign, logabsdet = _lu_det_parts(x.astype(dtype=X_dtype))
|
|
25
|
+
return sign * mx.exp(logabsdet)
|
|
26
|
+
|
|
27
|
+
return det
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@mlx_funcify.register(SLogDet)
|
|
31
|
+
def mlx_funcify_SLogDet(op, node, **kwargs):
|
|
32
|
+
X_dtype = getattr(mx, node.inputs[0].dtype)
|
|
33
|
+
|
|
34
|
+
def slogdet(x):
|
|
35
|
+
with mx.stream(mx.cpu):
|
|
36
|
+
return _lu_det_parts(x.astype(dtype=X_dtype))
|
|
37
|
+
|
|
38
|
+
return slogdet
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from pytensor.link.mlx.dispatch.scalar import basic, bessel, erf, erfcinv, gamma, math
|
|
@@ -5,16 +5,15 @@ import mlx.core as mx
|
|
|
5
5
|
from pytensor.link.mlx.dispatch.basic import convert_dtype_to_mlx, mlx_funcify
|
|
6
6
|
from pytensor.scalar.basic import (
|
|
7
7
|
Cast,
|
|
8
|
+
Clip,
|
|
8
9
|
Composite,
|
|
9
10
|
Identity,
|
|
10
11
|
Mod,
|
|
11
12
|
ScalarOp,
|
|
12
13
|
Second,
|
|
13
14
|
)
|
|
14
|
-
from pytensor.scalar.math import Erfc, Erfcx, Log1mexp, Sigmoid, Softplus
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
# MLX name overrides for nfunc_spec names that don't match mlx.core
|
|
18
17
|
MLX_NFUNC_OVERRIDES = {
|
|
19
18
|
"true_divide": "divide",
|
|
20
19
|
"invert": "bitwise_invert",
|
|
@@ -96,6 +95,14 @@ def mlx_funcify_Mod(op, **kwargs):
|
|
|
96
95
|
return mlx_mod
|
|
97
96
|
|
|
98
97
|
|
|
98
|
+
@mlx_funcify.register(Clip)
|
|
99
|
+
def mlx_funcify_Clip(op, **kwargs):
|
|
100
|
+
def clip(x, min, max):
|
|
101
|
+
return mx.where(x < min, min, mx.where(x > max, max, x))
|
|
102
|
+
|
|
103
|
+
return clip
|
|
104
|
+
|
|
105
|
+
|
|
99
106
|
@mlx_funcify.register(Identity)
|
|
100
107
|
def mlx_funcify_Identity(op, **kwargs):
|
|
101
108
|
def identity(x):
|
|
@@ -115,55 +122,6 @@ def mlx_funcify_Second(op, **kwargs):
|
|
|
115
122
|
return second
|
|
116
123
|
|
|
117
124
|
|
|
118
|
-
@mlx_funcify.register(Sigmoid)
|
|
119
|
-
def mlx_funcify_Sigmoid(op, **kwargs):
|
|
120
|
-
return mx.sigmoid
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
@mlx_funcify.register(Erfc)
|
|
124
|
-
def mlx_funcify_Erfc(op, **kwargs):
|
|
125
|
-
def erfc(x):
|
|
126
|
-
return 1.0 - mx.erf(x)
|
|
127
|
-
|
|
128
|
-
return erfc
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
@mlx_funcify.register(Erfcx)
|
|
132
|
-
def mlx_funcify_Erfcx(op, **kwargs):
|
|
133
|
-
def erfcx(x):
|
|
134
|
-
return mx.exp(x * x) * (1.0 - mx.erf(x))
|
|
135
|
-
|
|
136
|
-
return erfcx
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
@mlx_funcify.register(Softplus)
|
|
140
|
-
def mlx_funcify_Softplus(op, **kwargs):
|
|
141
|
-
def softplus(x):
|
|
142
|
-
return mx.where(
|
|
143
|
-
x < -37.0,
|
|
144
|
-
mx.exp(x),
|
|
145
|
-
mx.where(
|
|
146
|
-
x < 18.0,
|
|
147
|
-
mx.log1p(mx.exp(x)),
|
|
148
|
-
mx.where(
|
|
149
|
-
x < 33.3,
|
|
150
|
-
x + mx.exp(-x),
|
|
151
|
-
x,
|
|
152
|
-
),
|
|
153
|
-
),
|
|
154
|
-
)
|
|
155
|
-
|
|
156
|
-
return softplus
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
@mlx_funcify.register(Log1mexp)
|
|
160
|
-
def mlx_funcify_Log1mexp(op, node, **kwargs):
|
|
161
|
-
def log1mexp(x):
|
|
162
|
-
return mx.where(x < mx.log(0.5), mx.log1p(-mx.exp(x)), mx.log(-mx.expm1(x)))
|
|
163
|
-
|
|
164
|
-
return log1mexp
|
|
165
|
-
|
|
166
|
-
|
|
167
125
|
@mlx_funcify.register(Composite)
|
|
168
126
|
def mlx_funcify_Composite(op, node=None, **kwargs):
|
|
169
127
|
return mlx_funcify(op.fgraph, squeeze_output=True)
|