pytensor 3.2.2__tar.gz → 3.2.4__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.2/pytensor.egg-info → pytensor-3.2.4}/PKG-INFO +3 -3
- {pytensor-3.2.2 → pytensor-3.2.4}/pyproject.toml +2 -2
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/_version.py +3 -3
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/rewriting.py +9 -9
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/features.py +4 -4
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/rewriting/unify.py +2 -1
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/scalar.py +17 -2
- pytensor-3.2.4/pytensor/link/mlx/dispatch/blockwise.py +64 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/linalg/decomposition.py +9 -8
- pytensor-3.2.4/pytensor/link/mlx/dispatch/linalg/summary.py +38 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/elemwise.py +1 -1
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/random.py +1 -1
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/vectorize_codegen.py +14 -4
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/math.py +3 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/__init__.py +4 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/math.py +0 -49
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/math.py +0 -86
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/ofg.py +2 -2
- pytensor-3.2.4/pytensor/tensor/rewriting/special.py +184 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/subtensor.py +52 -1
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/subtensor_lift.py +106 -8
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/special.py +103 -5
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/utils.py +9 -3
- {pytensor-3.2.2 → pytensor-3.2.4/pytensor.egg-info}/PKG-INFO +3 -3
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor.egg-info/requires.txt +2 -2
- pytensor-3.2.2/pytensor/link/mlx/dispatch/blockwise.py +0 -42
- pytensor-3.2.2/pytensor/link/mlx/dispatch/linalg/summary.py +0 -46
- pytensor-3.2.2/pytensor/tensor/rewriting/special.py +0 -97
- {pytensor-3.2.2 → pytensor-3.2.4}/LICENSE.txt +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/MANIFEST.in +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/README.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/.templates/layout.html +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/.templates/nb-badges.html +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/LICENSE.txt +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/README.md +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/acknowledgement.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/bcast.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/bcast.svg +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/blog.md +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/conf.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/core_development_guide.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/css.inc +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/dev_start_guide.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/environment.yml +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/apply.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/apply.svg +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/apply2.svg +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/ctype.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/extending_faq.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/graphstructures.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/index.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/inplace.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/op.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/other_ops.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/pipeline.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/scan.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/tips.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/type.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/unification_kanren.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/unittest.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/extending/using_params.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/faq.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/gallery/applications/tiny_transformer_llm.ipynb +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/gallery/optimize/root.ipynb +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/gallery/page_footer.md +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/glossary.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/Elman_srnn.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/PyTensor.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/binder.svg +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/blocksparse.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/colab.svg +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/github.svg +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/lstm.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/talk2010.gif +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/images/talk2010.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/index.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/install.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/internal/how_to_release.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/internal/index.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/introduction.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/function.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/index.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/io.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/mode.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/ops.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/compile/shared.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/config.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/index.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/graph/features.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/graph/graph.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/graph/index.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/graph/op.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/graph/replace.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/graph/type.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/graph/utils.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/index.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/printing.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/scalar/index.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/scan.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/sparse/index.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/basic.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/bcast.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/fft.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/functional.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/index.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/io.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/linalg.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/optimize.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/random.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/tensor/utils.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/typed_list.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/xtensor/index.md +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/xtensor/linalg.md +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/xtensor/math.md +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/xtensor/module_functions.md +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/xtensor/random.md +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/xtensor/signal.md +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/library/xtensor/type.md +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/links.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/optimizations.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/pylintrc +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/robots.txt +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/troubleshooting.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/adding.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/apply.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/apply.svg +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/bcast.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/conditions.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/examples.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/gradients.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/index.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/logistic.gp +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/logistic.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/loop.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/modes.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/prng.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/profiling.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/sparse.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/doc/user_guide.rst +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/_sparse_lazy.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/alloc.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/blockwise.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/core.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/diagonal.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/dimshuffle.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/dot.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/elemwise.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/orthogonal.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/permutation.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/positive_definite.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/reshape.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/selection.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/shape.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/specify.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/subtensor.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/symmetric.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/assumptions/triangular.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/bin/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/breakpoint.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/aliasing.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/builders.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/compiledir.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/compilelock.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/debug/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/debug/debugmode.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/debug/dump.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/debug/monitormode.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/debug/nanguardmode.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/debug/profiling.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/executor.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/inner_function.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/io.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/maker.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/mode.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/ops.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/rebuild.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/configdefaults.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/configparser.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/html/template.html +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/gradient.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/fg.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/null_type.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/op.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/replace.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/rewriting/reachability.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/traversal.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/type.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/graph/utils.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/ifelse.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/ipython.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/cutils.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/cvm.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/interface.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/op.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/params_type.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/c/type.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/linalg/constructors.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/linalg/products.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/linalg/solvers.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/linalg/summary.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/scan.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/linker.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/jax/ops.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/blas.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/einsum.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/linalg/products.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/linalg/solvers.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/math.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/pad.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/scalar.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/shape.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/sort.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/dispatch/tensor_basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/mlx/linker.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/cache.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/_llvmlite_self_ref.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/_patch_pointer_add.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/blockwise.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/compile_ops.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/constructors.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/dispatch.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/eigen.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/decomposition/svd.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/products.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/cholesky.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/dispatch.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/general.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/hermitian.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/linear_control.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/lu_solve.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/posdef.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/symmetric.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/tridiagonal.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/solvers/utils.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/summary.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/scalar.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/scan.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/shape.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/sort.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/sparse/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/sparse/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/sparse/math.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/sparse/variable.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/subtensor.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/dispatch/typed_list.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/numba/linker.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/linalg/products.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/linalg/summary.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/shape.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/utils.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/link/vm.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/check_blas.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/frozendict.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/npy_2_compat.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/printing.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/py.typed +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/raise_op.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/loop.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/op.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/db.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/inner_graph.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/inplace.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/io.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/merge.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/push_out.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/trace.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/rewriting/utils.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/utils.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/scan/views.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/linalg.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/math.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/type.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/utils.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/sparse/variable.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/_core.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/batched.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/blas_c.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/c_code/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/c_code/alt_blas_common.h +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/c_code/alt_blas_template.c +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/c_code/blas_headers.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/c_code/codegen.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/gemm.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/gemv.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blas/ger.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/blockwise.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/einsum.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/elemwise.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/extra_ops.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/fft.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/fourier.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/functional.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/_lazy.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/constructors.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/decomposition/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/decomposition/cholesky.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/decomposition/eigen.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/decomposition/lu.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/decomposition/qr.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/decomposition/schur.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/decomposition/svd.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/dtype_utils.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/inverse.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/products.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/solvers/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/solvers/core.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/solvers/general.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/solvers/linear_control.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/solvers/lstsq.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/solvers/psd.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/solvers/triangular.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/solvers/tridiagonal.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/linalg/summary.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/nlinalg.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/optimize.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/pad.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/op.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/type.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/random/variable.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/reshape.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/assumptions.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/blas.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/elemwise.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/fused_elemwise.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/linalg/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/linalg/decomposition.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/linalg/inverse.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/linalg/products.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/linalg/solvers.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/linalg/summary.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/linalg/utils.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/optimize.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/reshape.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/shape.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/shape.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/signal/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/signal/conv.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/slinalg.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/sort.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/subtensor.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/symbolic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/type.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/type_other.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/var.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/variable.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/typed_list/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/typed_list/type.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/utils.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/indexing.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/linalg.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/math.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/random/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/random/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/random/type.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/random/variable.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/reduction.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/rewriting/__init__.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/rewriting/basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/rewriting/indexing.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/rewriting/math.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/rewriting/reduction.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/rewriting/shape.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/rewriting/utils.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/rewriting/vectorization.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/shape.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/signal.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/type.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor/xtensor/vectorization.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor.egg-info/SOURCES.txt +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/scripts/mypy-failing.txt +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/setup.cfg +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/setup.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/tests/test_basic.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/tests/test_breakpoint.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/tests/test_config.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/tests/test_gradient.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/tests/test_ifelse.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/tests/test_printing.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/tests/test_raise_op.py +0 -0
- {pytensor-3.2.2 → pytensor-3.2.4}/tests/test_rop.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pytensor
|
|
3
|
-
Version: 3.2.
|
|
3
|
+
Version: 3.2.4
|
|
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
|
|
@@ -30,7 +30,7 @@ License-File: LICENSE.txt
|
|
|
30
30
|
Requires-Dist: setuptools>=59.0.0
|
|
31
31
|
Requires-Dist: scipy<2,>=1
|
|
32
32
|
Requires-Dist: numpy>=2.0
|
|
33
|
-
Requires-Dist: numba<=0.
|
|
33
|
+
Requires-Dist: numba<=0.66.0,>=0.58
|
|
34
34
|
Requires-Dist: filelock>=3.15
|
|
35
35
|
Provides-Extra: complete
|
|
36
36
|
Requires-Dist: pytensor[jax]; extra == "complete"
|
|
@@ -56,7 +56,7 @@ Provides-Extra: jax
|
|
|
56
56
|
Requires-Dist: jax; extra == "jax"
|
|
57
57
|
Requires-Dist: jaxlib; extra == "jax"
|
|
58
58
|
Provides-Extra: numba
|
|
59
|
-
Requires-Dist: numba<=0.
|
|
59
|
+
Requires-Dist: numba<=0.66.0,>=0.58; extra == "numba"
|
|
60
60
|
Requires-Dist: llvmlite; extra == "numba"
|
|
61
61
|
Provides-Extra: kanren
|
|
62
62
|
Requires-Dist: etuples; extra == "kanren"
|
|
@@ -49,7 +49,7 @@ dependencies = [
|
|
|
49
49
|
"setuptools>=59.0.0",
|
|
50
50
|
"scipy>=1,<2",
|
|
51
51
|
"numpy>=2.0",
|
|
52
|
-
"numba>=0.58,<=0.
|
|
52
|
+
"numba>=0.58,<=0.66.0",
|
|
53
53
|
"filelock>=3.15",
|
|
54
54
|
]
|
|
55
55
|
|
|
@@ -77,7 +77,7 @@ tests = [
|
|
|
77
77
|
]
|
|
78
78
|
rtd = ["sphinx>=5.1.0,<6", "pygments", "pydot"]
|
|
79
79
|
jax = ["jax", "jaxlib"]
|
|
80
|
-
numba = ["numba>=0.58,<=0.
|
|
80
|
+
numba = ["numba>=0.58,<=0.66.0", "llvmlite"]
|
|
81
81
|
kanren = [
|
|
82
82
|
"etuples",
|
|
83
83
|
"logical-unification",
|
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2026-
|
|
11
|
+
"date": "2026-08-02T00:12:33+0200",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "3.2.
|
|
14
|
+
"full-revisionid": "7175f7cadf3934a03f63e6e7b187fa1519e6d85f",
|
|
15
|
+
"version": "3.2.4"
|
|
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):
|
|
@@ -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
|
|
@@ -137,7 +137,7 @@ def numba_core_HalfNormalRV(op, node):
|
|
|
137
137
|
def numba_core_CauchyRV(op, node):
|
|
138
138
|
@numba_basic.numba_njit
|
|
139
139
|
def random(rng, loc, scale):
|
|
140
|
-
return
|
|
140
|
+
return loc + scale * rng.standard_cauchy()
|
|
141
141
|
|
|
142
142
|
return random
|
|
143
143
|
|
|
@@ -167,10 +167,20 @@ def _compute_idx_load_axes(indexed_inputs, indexed_outputs, idx_ndims):
|
|
|
167
167
|
_, out_axis, _ = entry
|
|
168
168
|
group_min_axis[root] = min(group_min_axis.get(root, out_axis), out_axis)
|
|
169
169
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
170
|
+
# Indices in a group broadcast together right-aligned (NumPy semantics), so
|
|
171
|
+
# a lower-ndim index occupies the trailing loop dims of the group's span,
|
|
172
|
+
# whose width is the max ndim across the group.
|
|
173
|
+
group_max_ndim: dict[int, int] = {}
|
|
174
|
+
for k in range(n_indices):
|
|
175
|
+
root = find(k)
|
|
176
|
+
group_max_ndim[root] = max(group_max_ndim.get(root, 0), idx_ndims[k])
|
|
177
|
+
|
|
178
|
+
load_axes = []
|
|
179
|
+
for k in range(n_indices):
|
|
180
|
+
root = find(k)
|
|
181
|
+
end = group_min_axis[root] + group_max_ndim[root]
|
|
182
|
+
load_axes.append(tuple(range(end - idx_ndims[k], end)))
|
|
183
|
+
return tuple(load_axes)
|
|
174
184
|
|
|
175
185
|
|
|
176
186
|
def _core_slice_layout(full_layout, batch_bc_pattern):
|
|
@@ -298,6 +298,9 @@ class NdtriExp(UnaryScalarOp):
|
|
|
298
298
|
cst = np.asarray(np.sqrt(2 * np.pi), dtype=gz.type.dtype)
|
|
299
299
|
return (gz * cst * exp(x + z**2 / 2),)
|
|
300
300
|
|
|
301
|
+
def c_code(self, *args, **kwargs):
|
|
302
|
+
raise NotImplementedError()
|
|
303
|
+
|
|
301
304
|
|
|
302
305
|
ndtri_exp = NdtriExp(upgrade_to_float_no_complex, name="ndtri_exp")
|
|
303
306
|
|
|
@@ -126,6 +126,10 @@ from pytensor.tensor.interpolate import interp, interpolate1d
|
|
|
126
126
|
from pytensor.tensor.math import *
|
|
127
127
|
from pytensor.tensor.pad import pad
|
|
128
128
|
|
|
129
|
+
# Kept in the top-level namespace for backwards compatibility; the rest of
|
|
130
|
+
# `pytensor.tensor.special` is only reachable as `pt.special.*`
|
|
131
|
+
from pytensor.tensor.special import logaddexp, logsumexp
|
|
132
|
+
|
|
129
133
|
|
|
130
134
|
# isort: off
|
|
131
135
|
# reshape needs to be imported before shape.reshape, otherwise the tensor.reshape imports fail
|
|
@@ -3891,53 +3891,6 @@ def power(x, y):
|
|
|
3891
3891
|
return x**y
|
|
3892
3892
|
|
|
3893
3893
|
|
|
3894
|
-
def logaddexp(*xs):
|
|
3895
|
-
"""Logarithm of the sum of exponentiations of the inputs.
|
|
3896
|
-
|
|
3897
|
-
See ``numpy.logaddexp``.
|
|
3898
|
-
|
|
3899
|
-
Parameters
|
|
3900
|
-
----------
|
|
3901
|
-
xs : symbolic tensors
|
|
3902
|
-
Input
|
|
3903
|
-
|
|
3904
|
-
Returns
|
|
3905
|
-
-------
|
|
3906
|
-
TensorVariable
|
|
3907
|
-
|
|
3908
|
-
"""
|
|
3909
|
-
|
|
3910
|
-
return log(add(*[exp(x) for x in xs]))
|
|
3911
|
-
|
|
3912
|
-
|
|
3913
|
-
def logsumexp(x, axis=None, keepdims=False):
|
|
3914
|
-
"""Compute the log of the sum of exponentials of input elements.
|
|
3915
|
-
|
|
3916
|
-
See ``scipy.special.logsumexp``.
|
|
3917
|
-
|
|
3918
|
-
Parameters
|
|
3919
|
-
----------
|
|
3920
|
-
x : symbolic tensor
|
|
3921
|
-
Input
|
|
3922
|
-
|
|
3923
|
-
axis : None or int or tuple of ints, optional
|
|
3924
|
-
Axis or axes over which the sum is taken. By default axis is None,
|
|
3925
|
-
and all elements are summed.
|
|
3926
|
-
|
|
3927
|
-
keepdims : bool, optional
|
|
3928
|
-
If this is set to True, the axes which are reduced are left in the
|
|
3929
|
-
result as dimensions with size one. With this option, the result will
|
|
3930
|
-
broadcast correctly against the original array.
|
|
3931
|
-
|
|
3932
|
-
Returns
|
|
3933
|
-
-------
|
|
3934
|
-
TensorVariable
|
|
3935
|
-
|
|
3936
|
-
"""
|
|
3937
|
-
|
|
3938
|
-
return log(sum(exp(x), axis=axis, keepdims=keepdims))
|
|
3939
|
-
|
|
3940
|
-
|
|
3941
3894
|
_matmul = Blockwise(_dot, name="Matmul")
|
|
3942
3895
|
|
|
3943
3896
|
|
|
@@ -4321,8 +4274,6 @@ __all__ = [
|
|
|
4321
4274
|
"log1pexp",
|
|
4322
4275
|
"log2",
|
|
4323
4276
|
"log10",
|
|
4324
|
-
"logaddexp",
|
|
4325
|
-
"logsumexp",
|
|
4326
4277
|
"lt",
|
|
4327
4278
|
"matmul",
|
|
4328
4279
|
"matvec",
|
|
@@ -71,7 +71,6 @@ from pytensor.tensor.math import (
|
|
|
71
71
|
expm1,
|
|
72
72
|
ge,
|
|
73
73
|
int_div,
|
|
74
|
-
isinf,
|
|
75
74
|
ive,
|
|
76
75
|
kve,
|
|
77
76
|
le,
|
|
@@ -79,8 +78,6 @@ from pytensor.tensor.math import (
|
|
|
79
78
|
log1mexp,
|
|
80
79
|
log1p,
|
|
81
80
|
log1pexp,
|
|
82
|
-
makeKeepDims,
|
|
83
|
-
maximum,
|
|
84
81
|
mul,
|
|
85
82
|
neg,
|
|
86
83
|
polygamma,
|
|
@@ -100,9 +97,7 @@ from pytensor.tensor.math import (
|
|
|
100
97
|
variadic_mul,
|
|
101
98
|
)
|
|
102
99
|
from pytensor.tensor.math import abs as pt_abs
|
|
103
|
-
from pytensor.tensor.math import max as pt_max
|
|
104
100
|
from pytensor.tensor.math import pow as pt_pow
|
|
105
|
-
from pytensor.tensor.math import sum as pt_sum
|
|
106
101
|
from pytensor.tensor.rewriting.basic import (
|
|
107
102
|
broadcast_like_elemwise,
|
|
108
103
|
local_second_sink,
|
|
@@ -2813,87 +2808,6 @@ def local_log1p(fgraph, node):
|
|
|
2813
2808
|
return [broadcast_like_elemwise(new_out, node, fgraph=fgraph, stack_trace=True)]
|
|
2814
2809
|
|
|
2815
2810
|
|
|
2816
|
-
@register_stabilize("fast_compile")
|
|
2817
|
-
@register_specialize
|
|
2818
|
-
@node_rewriter([log])
|
|
2819
|
-
def local_log_add_exp(fgraph, node):
|
|
2820
|
-
"""
|
|
2821
|
-
``log(exp(x)+exp(y)+exp(z)) = max + log(x-max, y-max, z-max)``
|
|
2822
|
-
|
|
2823
|
-
TODO: in canonicalize, change log10 and log2 -> log
|
|
2824
|
-
"""
|
|
2825
|
-
|
|
2826
|
-
z = node.inputs[0]
|
|
2827
|
-
if z.owner and z.owner.op == add:
|
|
2828
|
-
zi = z.owner.inputs
|
|
2829
|
-
pre_exp = [x.owner.inputs[0] for x in zi if x.owner and x.owner.op == exp]
|
|
2830
|
-
# all arguments to add are exp(<something>)
|
|
2831
|
-
if len(pre_exp) == len(zi):
|
|
2832
|
-
# Do not offset when max_pre = -np.inf, to avoid nan in the output
|
|
2833
|
-
# Switch statement is placed directly inside add to break the self-symmetry
|
|
2834
|
-
# of the returned output (otherwise the rewrite would not stabilize)
|
|
2835
|
-
max_pre = reduce(maximum, pre_exp)
|
|
2836
|
-
ret = max_pre + log(
|
|
2837
|
-
add(
|
|
2838
|
-
*[
|
|
2839
|
-
switch(isinf(max_pre), exp(max_pre), exp(p - max_pre))
|
|
2840
|
-
for p in pre_exp
|
|
2841
|
-
]
|
|
2842
|
-
)
|
|
2843
|
-
)
|
|
2844
|
-
return [ret]
|
|
2845
|
-
|
|
2846
|
-
|
|
2847
|
-
@register_stabilize("fast_compile")
|
|
2848
|
-
@register_specialize
|
|
2849
|
-
@node_rewriter([log])
|
|
2850
|
-
def local_log_sum_exp(fgraph, node):
|
|
2851
|
-
# log(sum_i(exp(x_i))) = x_max + log(sum_i(exp(x_i - x_max)))
|
|
2852
|
-
|
|
2853
|
-
sum_node = node.inputs[0].owner
|
|
2854
|
-
# If the sum has keepdims=True, there might be a dimshuffle
|
|
2855
|
-
if sum_node and isinstance(sum_node.op, DimShuffle):
|
|
2856
|
-
dimshuffle_op = sum_node.op
|
|
2857
|
-
sum_node = sum_node.inputs[0].owner
|
|
2858
|
-
else:
|
|
2859
|
-
dimshuffle_op = None
|
|
2860
|
-
|
|
2861
|
-
if not (sum_node and isinstance(sum_node.op, Sum)):
|
|
2862
|
-
return
|
|
2863
|
-
|
|
2864
|
-
exp_node, axis = sum_node.inputs[0].owner, sum_node.op.axis
|
|
2865
|
-
if not (
|
|
2866
|
-
exp_node
|
|
2867
|
-
and isinstance(exp_node.op, Elemwise)
|
|
2868
|
-
and isinstance(exp_node.op.scalar_op, ps.Exp)
|
|
2869
|
-
):
|
|
2870
|
-
return
|
|
2871
|
-
|
|
2872
|
-
pre_exp = exp_node.inputs[0]
|
|
2873
|
-
max_pre_exp = pt_max(pre_exp, axis=axis)
|
|
2874
|
-
max_pre_exp_keepdims = makeKeepDims(pre_exp, max_pre_exp, axis)
|
|
2875
|
-
|
|
2876
|
-
# Do not offset when max_pre = -np.inf, to avoid nan in the output
|
|
2877
|
-
# Switch statement is placed directly inside sum to break the self-symmetry
|
|
2878
|
-
# of the returned output (otherwise the rewrite would not stabilize)
|
|
2879
|
-
ret = max_pre_exp + log(
|
|
2880
|
-
pt_sum(
|
|
2881
|
-
switch(
|
|
2882
|
-
isinf(max_pre_exp_keepdims),
|
|
2883
|
-
exp(max_pre_exp_keepdims),
|
|
2884
|
-
exp(pre_exp - max_pre_exp_keepdims),
|
|
2885
|
-
),
|
|
2886
|
-
axis=axis,
|
|
2887
|
-
),
|
|
2888
|
-
)
|
|
2889
|
-
|
|
2890
|
-
# Restore the dimshuffle op, if any.
|
|
2891
|
-
if dimshuffle_op:
|
|
2892
|
-
ret = dimshuffle_op(ret)
|
|
2893
|
-
|
|
2894
|
-
return [ret]
|
|
2895
|
-
|
|
2896
|
-
|
|
2897
2811
|
def add_calculate(num, denum, aslist=False, out_type=None):
|
|
2898
2812
|
# TODO: make sure that this function and mul_calculate are similar
|
|
2899
2813
|
if out_type is None:
|
|
@@ -2,11 +2,11 @@ from pytensor.compile.rewriting import inline_ofg_node
|
|
|
2
2
|
from pytensor.graph import node_rewriter
|
|
3
3
|
from pytensor.tensor.basic import AllocDiag
|
|
4
4
|
from pytensor.tensor.rewriting.basic import register_specialize
|
|
5
|
-
from pytensor.tensor.special import XLog1PY, XLogY
|
|
5
|
+
from pytensor.tensor.special import LogAddExp, LogSumExp, XLog1PY, XLogY
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
@register_specialize("inline_ofg")
|
|
9
|
-
@node_rewriter([AllocDiag, XLogY, XLog1PY])
|
|
9
|
+
@node_rewriter([AllocDiag, XLogY, XLog1PY, LogSumExp, LogAddExp])
|
|
10
10
|
def late_inline_OpFromGraph(fgraph, node):
|
|
11
11
|
"""
|
|
12
12
|
Inline `OpFromGraph` nodes.
|