pytensor 2.36.0__tar.gz → 2.36.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pytensor-2.36.0/pytensor.egg-info → pytensor-2.36.2}/PKG-INFO +1 -1
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/_version.py +3 -3
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/builders.py +1 -1
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/fg.py +6 -2
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/cache.py +1 -1
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/basic.py +1 -1
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/compile_ops.py +26 -19
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/random.py +30 -15
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/subtensor.py +0 -1
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/scalar.py +9 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/basic.py +2 -90
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/loop.py +1 -1
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/basic.py +17 -57
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/op.py +1 -1
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/math.py +21 -70
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/__init__.py +7 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/optimize.py +1 -1
- pytensor-2.36.2/pytensor/tensor/reshape.py +524 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/__init__.py +1 -0
- pytensor-2.36.2/pytensor/tensor/rewriting/reshape.py +49 -0
- {pytensor-2.36.0 → pytensor-2.36.2/pytensor.egg-info}/PKG-INFO +1 -1
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor.egg-info/SOURCES.txt +2 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/LICENSE.txt +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/MANIFEST.in +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/README.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/.templates/layout.html +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/.templates/nb-badges.html +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/LICENSE.txt +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/README.md +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/acknowledgement.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/bcast.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/bcast.svg +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/blog.md +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/conf.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/core_development_guide.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/css.inc +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/dev_start_guide.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/environment.yml +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/apply.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/apply.svg +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/apply2.svg +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/ctype.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/extending_faq.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/graphstructures.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/index.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/inplace.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/op.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/other_ops.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/pipeline.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/scan.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/tips.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/type.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/unittest.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/extending/using_params.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/faq.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/gallery/optimize/root.ipynb +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/gallery/page_footer.md +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/glossary.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/Elman_srnn.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/PyTensor.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/binder.svg +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/blocksparse.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/colab.svg +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/github.svg +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/lstm.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/talk2010.gif +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/images/talk2010.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/index.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/install.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/internal/how_to_release.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/internal/index.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/introduction.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/function.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/index.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/io.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/mode.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/ops.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/compile/shared.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/config.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/index.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/graph/features.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/graph/graph.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/graph/index.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/graph/op.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/graph/replace.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/graph/type.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/graph/utils.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/index.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/printing.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/scalar/index.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/scan.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/sparse/index.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/basic.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/bcast.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/conv.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/fft.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/functional.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/index.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/io.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/optimize.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/random/distributions.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/random/index.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/tensor/utils.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/typed_list.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/xtensor/index.md +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/xtensor/linalg.md +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/xtensor/math.md +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/xtensor/module_functions.md +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/xtensor/random.md +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/library/xtensor/type.md +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/links.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/optimizations.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/pylintrc +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/robots.txt +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/troubleshooting.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/adding.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/apply.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/apply.svg +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/bcast.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/conditions.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/examples.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/gradients.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/index.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/logistic.gp +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/logistic.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/loop.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/modes.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/prng.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/profiling.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/sparse.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/doc/user_guide.rst +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pyproject.toml +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/bin/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/breakpoint.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/compiledir.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/compilelock.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/debugmode.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/function/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/function/pfunc.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/function/types.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/io.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/mode.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/monitormode.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/nanguardmode.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/ops.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/profiling.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/configdefaults.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/configparser.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/html/template.html +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/gradient.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/features.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/null_type.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/op.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/replace.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/traversal.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/type.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/graph/utils.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/ifelse.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/ipython.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/cutils.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/cvm.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/interface.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/op.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/params_type.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/c/type.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/scan.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/slinalg.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/linker.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/jax/ops.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/blockwise.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/core.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/math.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/nlinalg.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/shape.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/slinalg.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/sort.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/mlx/linker.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/blockwise.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/elemwise.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/general.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/norm.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/posdef.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/scalar.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/scan.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/shape.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/slinalg.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/sort.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/sparse.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/typed_list.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/numba/linker.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/shape.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/slinalg.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/utils.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/link/vm.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/check_blas.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/frozendict.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/npy_2_compat.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/printing.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/py.typed +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/raise_op.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/math.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/rewriting.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/utils.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/scan/views.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/linalg.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/type.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/utils.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/sparse/variable.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/_linalg/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/_linalg/solve/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/_linalg/solve/rewriting.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/_linalg/solve/tridiagonal.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/blas.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/blas_c.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/blas_headers.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/blockwise.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/c_code/dimshuffle.c +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/conv/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/conv/abstract_conv.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/einsum.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/elemwise.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/extra_ops.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/fft.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/fourier.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/functional.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/linalg.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/math.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/nlinalg.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/pad.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/op.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/type.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/random/var.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/blas.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/elemwise.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/linalg.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/math.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/shape.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/subtensor.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/subtensor_lift.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/shape.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/signal/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/signal/conv.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/slinalg.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/sort.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/special.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/subtensor.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/type.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/type_other.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/utils.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/var.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/variable.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/typed_list/basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/typed_list/type.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/updates.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/utils.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/indexing.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/linalg.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/math.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/random.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/reduction.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/rewriting/__init__.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/rewriting/basic.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/rewriting/indexing.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/rewriting/math.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/rewriting/reduction.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/rewriting/shape.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/rewriting/utils.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/rewriting/vectorization.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/shape.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/type.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor/xtensor/vectorization.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor.egg-info/requires.txt +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/scripts/mypy-failing.txt +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/setup.cfg +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/setup.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/tests/test_breakpoint.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/tests/test_config.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/tests/test_gradient.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/tests/test_ifelse.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/tests/test_printing.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/tests/test_raise_op.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/tests/test_rop.py +0 -0
- {pytensor-2.36.0 → pytensor-2.36.2}/tests/test_updates.py +0 -0
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "
|
|
11
|
+
"date": "2026-01-02T17:20:52+0100",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.36.
|
|
14
|
+
"full-revisionid": "0f864a33958e68e5110d043c4b5ef549cd1d6074",
|
|
15
|
+
"version": "2.36.2"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -838,9 +838,13 @@ class FunctionGraph(MetaObject):
|
|
|
838
838
|
def __repr__(self):
|
|
839
839
|
return f"FunctionGraph({', '.join(graph_as_string(self.inputs, self.outputs))})"
|
|
840
840
|
|
|
841
|
-
def clone(
|
|
841
|
+
def clone(
|
|
842
|
+
self, check_integrity=True, clone_inner_graphs: bool = False
|
|
843
|
+
) -> "FunctionGraph":
|
|
842
844
|
"""Clone the graph."""
|
|
843
|
-
return self.clone_get_equiv(
|
|
845
|
+
return self.clone_get_equiv(
|
|
846
|
+
check_integrity, clone_inner_graphs=clone_inner_graphs
|
|
847
|
+
)[0]
|
|
844
848
|
|
|
845
849
|
def clone_get_equiv(
|
|
846
850
|
self, check_integrity: bool = True, attach_feature: bool = True, **kwargs
|
|
@@ -11,7 +11,7 @@ from pytensor.configdefaults import config
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
NUMBA_CACHE_PATH = config.base_compiledir / "numba"
|
|
14
|
-
NUMBA_CACHE_PATH.mkdir(exist_ok=True)
|
|
14
|
+
NUMBA_CACHE_PATH.mkdir(parents=True, exist_ok=True)
|
|
15
15
|
CACHED_SRC_FUNCTIONS: WeakKeyDictionary[Callable, str] = WeakKeyDictionary()
|
|
16
16
|
|
|
17
17
|
|
|
@@ -478,7 +478,7 @@ def numba_funcify_ensure_cache(op, *args, **kwargs) -> tuple[Callable, str | Non
|
|
|
478
478
|
src=f"def {op_name}(*args): return jitable_func(*args)",
|
|
479
479
|
function_name=op_name,
|
|
480
480
|
global_env=globals() | {"jitable_func": jitable_func},
|
|
481
|
-
cache_key=cache_key,
|
|
481
|
+
cache_key=f"{cache_key}_fastmath{int(config.numba__fastmath)}",
|
|
482
482
|
)
|
|
483
483
|
return numba_njit(cached_func, cache=True), cache_key
|
|
484
484
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from copy import deepcopy
|
|
2
2
|
from hashlib import sha256
|
|
3
|
+
from textwrap import dedent
|
|
3
4
|
|
|
4
5
|
import numba
|
|
5
6
|
import numpy as np
|
|
@@ -10,6 +11,7 @@ from pytensor.compile.io import In, Out
|
|
|
10
11
|
from pytensor.compile.mode import NUMBA
|
|
11
12
|
from pytensor.compile.ops import DeepCopyOp, TypeCastingOp
|
|
12
13
|
from pytensor.ifelse import IfElse
|
|
14
|
+
from pytensor.link.numba.cache import compile_numba_function_src
|
|
13
15
|
from pytensor.link.numba.dispatch import basic as numba_basic
|
|
14
16
|
from pytensor.link.numba.dispatch.basic import (
|
|
15
17
|
numba_funcify_and_cache_key,
|
|
@@ -106,30 +108,35 @@ def numba_funcify_DeepCopyOp(op, node, **kwargs):
|
|
|
106
108
|
@register_funcify_default_op_cache_key(IfElse)
|
|
107
109
|
def numba_funcify_IfElse(op, **kwargs):
|
|
108
110
|
n_outs = op.n_outs
|
|
111
|
+
as_view = op.as_view
|
|
109
112
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
def ifelse(cond, *args):
|
|
114
|
-
if cond:
|
|
115
|
-
res = args[:n_outs]
|
|
116
|
-
else:
|
|
117
|
-
res = args[n_outs:]
|
|
118
|
-
|
|
119
|
-
return res
|
|
113
|
+
true_names = [f"t{i}" for i in range(n_outs)]
|
|
114
|
+
false_names = [f"f{i}" for i in range(n_outs)]
|
|
115
|
+
arg_list = ", ".join((*true_names, *false_names))
|
|
120
116
|
|
|
117
|
+
if as_view:
|
|
118
|
+
true_returns = ", ".join(true_names)
|
|
121
119
|
else:
|
|
120
|
+
true_returns = ", ".join(f"{name}.copy()" for name in true_names)
|
|
121
|
+
# We only ever view (alias) variables from the true branch. False branch variables must always be copied.
|
|
122
|
+
false_returns = ", ".join(f"{name}.copy()" for name in false_names)
|
|
123
|
+
|
|
124
|
+
func_src = dedent(
|
|
125
|
+
f"""
|
|
126
|
+
def ifelse(cond, {arg_list}):
|
|
127
|
+
if cond:
|
|
128
|
+
return {true_returns}
|
|
129
|
+
else:
|
|
130
|
+
return {false_returns}
|
|
131
|
+
"""
|
|
132
|
+
)
|
|
122
133
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
res = args[:n_outs]
|
|
127
|
-
else:
|
|
128
|
-
res = args[n_outs:]
|
|
129
|
-
|
|
130
|
-
return res[0]
|
|
134
|
+
ifelse_func = numba_basic.numba_njit(
|
|
135
|
+
compile_numba_function_src(func_src, "ifelse", globals())
|
|
136
|
+
)
|
|
131
137
|
|
|
132
|
-
|
|
138
|
+
cache_version = 1
|
|
139
|
+
return ifelse_func, cache_version
|
|
133
140
|
|
|
134
141
|
|
|
135
142
|
@register_funcify_and_cache_key(CheckAndRaise)
|
|
@@ -216,14 +216,16 @@ def core_MvNormalRV(op, node):
|
|
|
216
216
|
|
|
217
217
|
@numba_core_rv_funcify.register(ptr.DirichletRV)
|
|
218
218
|
def core_DirichletRV(op, node):
|
|
219
|
+
dtype = op.dtype
|
|
220
|
+
|
|
219
221
|
@numba_basic.numba_njit
|
|
220
222
|
def random_fn(rng, alpha):
|
|
221
|
-
y = np.empty_like(alpha)
|
|
223
|
+
y = np.empty_like(alpha, dtype=dtype)
|
|
222
224
|
for i in range(len(alpha)):
|
|
223
225
|
y[i] = rng.gamma(alpha[i], 1.0)
|
|
224
226
|
return y / y.sum()
|
|
225
227
|
|
|
226
|
-
return random_fn
|
|
228
|
+
return random_fn, 1
|
|
227
229
|
|
|
228
230
|
|
|
229
231
|
@numba_core_rv_funcify.register(ptr.GumbelRV)
|
|
@@ -410,7 +412,7 @@ def numba_funcify_RandomVariable(op: RandomVariableWithCoreShape, node, **kwargs
|
|
|
410
412
|
rv_op: RandomVariable = rv_node.op
|
|
411
413
|
|
|
412
414
|
try:
|
|
413
|
-
|
|
415
|
+
core_rv_fn_and_cache_key = numba_core_rv_funcify(rv_op, rv_node)
|
|
414
416
|
except NotImplementedError:
|
|
415
417
|
py_impl = generate_fallback_impl(rv_op, node=rv_node, **kwargs)
|
|
416
418
|
|
|
@@ -420,6 +422,16 @@ def numba_funcify_RandomVariable(op: RandomVariableWithCoreShape, node, **kwargs
|
|
|
420
422
|
|
|
421
423
|
return fallback_rv, None
|
|
422
424
|
|
|
425
|
+
match core_rv_fn_and_cache_key:
|
|
426
|
+
case (core_rv_fn, (int() | None) as core_cache_key):
|
|
427
|
+
pass
|
|
428
|
+
case (_core_rv_fn, invalid_core_cache_key):
|
|
429
|
+
raise ValueError(
|
|
430
|
+
f"Invalid core_cache_key returned from numba_core_rv_funcify: {invalid_core_cache_key}. Must be int or None."
|
|
431
|
+
)
|
|
432
|
+
case core_rv_fn:
|
|
433
|
+
core_cache_key = "__None__"
|
|
434
|
+
|
|
423
435
|
size = rv_op.size_param(rv_node)
|
|
424
436
|
dist_params = rv_op.dist_params(rv_node)
|
|
425
437
|
size_len = None if isinstance(size.type, NoneTypeT) else get_vector_length(size)
|
|
@@ -469,16 +481,19 @@ def numba_funcify_RandomVariable(op: RandomVariableWithCoreShape, node, **kwargs
|
|
|
469
481
|
|
|
470
482
|
return impl
|
|
471
483
|
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
type
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
+
if core_cache_key is None:
|
|
485
|
+
# If the core RV can't be cached, then the whole RV can't be cached
|
|
486
|
+
random_rv_key = None # type: ignore[unreachable]
|
|
487
|
+
else:
|
|
488
|
+
random_rv_key_contents = (
|
|
489
|
+
type(op),
|
|
490
|
+
type(rv_op),
|
|
491
|
+
tuple(rv_op._props_dict().items()), # type: ignore[attr-defined]
|
|
492
|
+
size_len,
|
|
493
|
+
core_shape_len,
|
|
494
|
+
input_bc_patterns,
|
|
495
|
+
output_bc_patterns,
|
|
496
|
+
core_cache_key,
|
|
497
|
+
)
|
|
498
|
+
random_rv_key = sha256(str(random_rv_key_contents).encode()).hexdigest()
|
|
484
499
|
return random, random_rv_key
|
|
@@ -5,6 +5,7 @@ import torch
|
|
|
5
5
|
from pytensor.link.pytorch.dispatch.basic import pytorch_funcify
|
|
6
6
|
from pytensor.scalar.basic import (
|
|
7
7
|
Cast,
|
|
8
|
+
Clip,
|
|
8
9
|
Invert,
|
|
9
10
|
ScalarOp,
|
|
10
11
|
)
|
|
@@ -71,6 +72,14 @@ def pytorch_funcify_Softplus(op, node, **kwargs):
|
|
|
71
72
|
return torch.nn.Softplus()
|
|
72
73
|
|
|
73
74
|
|
|
75
|
+
@pytorch_funcify.register(Clip)
|
|
76
|
+
def pytorch_funcify_Clip(op, node, **kwargs):
|
|
77
|
+
def clip(x, min_val, max_val):
|
|
78
|
+
return torch.where(x < min_val, min_val, torch.where(x > max_val, max_val, x))
|
|
79
|
+
|
|
80
|
+
return clip
|
|
81
|
+
|
|
82
|
+
|
|
74
83
|
@pytorch_funcify.register(ScalarLoop)
|
|
75
84
|
def pytorch_funicify_ScalarLoop(op, node, **kwargs):
|
|
76
85
|
update = pytorch_funcify(op.fgraph, **kwargs)
|
|
@@ -4300,14 +4300,8 @@ class Composite(ScalarInnerGraphOp):
|
|
|
4300
4300
|
self._fgraph = fgraph
|
|
4301
4301
|
return self._fgraph
|
|
4302
4302
|
|
|
4303
|
-
def clone_float32(self):
|
|
4304
|
-
# This will not modify the fgraph or the nodes
|
|
4305
|
-
new_ins, new_outs = composite_f32.apply(self.fgraph)
|
|
4306
|
-
return Composite(new_ins, new_outs)
|
|
4307
|
-
|
|
4308
4303
|
def clone(self):
|
|
4309
|
-
|
|
4310
|
-
return Composite(new_ins, new_outs)
|
|
4304
|
+
return self.__class__(self.fgraph.inputs, self.fgraph.outputs)
|
|
4311
4305
|
|
|
4312
4306
|
def output_types(self, input_types):
|
|
4313
4307
|
if tuple(input_types) != self.inputs_type:
|
|
@@ -4423,86 +4417,4 @@ class Composite(ScalarInnerGraphOp):
|
|
|
4423
4417
|
return self.c_code_template % d
|
|
4424
4418
|
|
|
4425
4419
|
def c_code_cache_version_outer(self) -> tuple[int, ...]:
|
|
4426
|
-
return (
|
|
4427
|
-
|
|
4428
|
-
|
|
4429
|
-
class Compositef32:
|
|
4430
|
-
# This is a dict of scalar op classes that need special handling
|
|
4431
|
-
special: dict = {}
|
|
4432
|
-
|
|
4433
|
-
def apply(self, fgraph):
|
|
4434
|
-
mapping = {}
|
|
4435
|
-
topo = fgraph.toposort()
|
|
4436
|
-
for i in fgraph.inputs:
|
|
4437
|
-
if i.dtype == "float16":
|
|
4438
|
-
mapping[i] = get_scalar_type("float32")()
|
|
4439
|
-
if hasattr(i.tag, "test_value"):
|
|
4440
|
-
mapping[i].tag.test_value = i.tag.test_value
|
|
4441
|
-
else:
|
|
4442
|
-
mapping[i] = i
|
|
4443
|
-
for node in topo:
|
|
4444
|
-
# Patch up for constants
|
|
4445
|
-
for i in node.inputs:
|
|
4446
|
-
if i not in mapping:
|
|
4447
|
-
assert type(i) is ScalarConstant
|
|
4448
|
-
if i.type == float16:
|
|
4449
|
-
ni = ScalarConstant(float32, i.data)
|
|
4450
|
-
else:
|
|
4451
|
-
ni = i
|
|
4452
|
-
mapping[i] = ni
|
|
4453
|
-
if isinstance(node.op, tuple(self.special)):
|
|
4454
|
-
self.special[type(node.op)](node, mapping)
|
|
4455
|
-
continue
|
|
4456
|
-
new_node = node.clone_with_new_inputs(
|
|
4457
|
-
[mapping[inp] for inp in node.inputs], strict=False
|
|
4458
|
-
)
|
|
4459
|
-
# make sure we don't produce any float16.
|
|
4460
|
-
assert not any(o.dtype == "float16" for o in new_node.outputs)
|
|
4461
|
-
mapping.update(zip(node.outputs, new_node.outputs, strict=True))
|
|
4462
|
-
|
|
4463
|
-
new_ins = [mapping[inp] for inp in fgraph.inputs]
|
|
4464
|
-
new_outs = [mapping[out] for out in fgraph.outputs]
|
|
4465
|
-
return new_ins, new_outs
|
|
4466
|
-
|
|
4467
|
-
|
|
4468
|
-
composite_f32 = Compositef32()
|
|
4469
|
-
|
|
4470
|
-
|
|
4471
|
-
def handle_cast(node, mapping):
|
|
4472
|
-
inp = mapping[node.inputs[0]]
|
|
4473
|
-
out = node.outputs[0]
|
|
4474
|
-
node_ok = False
|
|
4475
|
-
if node.op.o_type == float16:
|
|
4476
|
-
if node.inputs[0].type == float32:
|
|
4477
|
-
# cast f32 -> f16, remove
|
|
4478
|
-
mapping[out] = inp
|
|
4479
|
-
return
|
|
4480
|
-
else:
|
|
4481
|
-
# cast to f16, convert to f32
|
|
4482
|
-
new_out = cast(inp, "float32")
|
|
4483
|
-
# change the node for the following if
|
|
4484
|
-
node = new_out.owner
|
|
4485
|
-
mapping[out] = new_out
|
|
4486
|
-
node_ok = True
|
|
4487
|
-
if node.inputs[0].type == float16:
|
|
4488
|
-
if node.op.o_type == inp.type:
|
|
4489
|
-
# cast f16 to new input type, remove
|
|
4490
|
-
mapping[out] = inp
|
|
4491
|
-
return
|
|
4492
|
-
if not node_ok:
|
|
4493
|
-
new_node = node.clone_with_new_inputs([inp], strict=False)
|
|
4494
|
-
mapping[out] = new_node.outputs[0]
|
|
4495
|
-
|
|
4496
|
-
|
|
4497
|
-
Compositef32.special[Cast] = handle_cast
|
|
4498
|
-
|
|
4499
|
-
|
|
4500
|
-
def handle_composite(node, mapping):
|
|
4501
|
-
new_op = node.op.clone_float32()
|
|
4502
|
-
new_outs = new_op(*[mapping[i] for i in node.inputs], return_list=True)
|
|
4503
|
-
assert len(new_outs) == len(node.outputs)
|
|
4504
|
-
for o, no in zip(node.outputs, new_outs, strict=True):
|
|
4505
|
-
mapping[o] = no
|
|
4506
|
-
|
|
4507
|
-
|
|
4508
|
-
Compositef32.special[Composite] = handle_composite
|
|
4420
|
+
return (7,)
|
|
@@ -123,7 +123,7 @@ class ScalarLoop(ScalarInnerGraphOp):
|
|
|
123
123
|
update, until = self.outputs, None
|
|
124
124
|
init = self.inputs[: len(update)]
|
|
125
125
|
constant = self.inputs[len(update) :]
|
|
126
|
-
return
|
|
126
|
+
return self.__class__(
|
|
127
127
|
init=init,
|
|
128
128
|
update=update,
|
|
129
129
|
constant=constant,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import typing
|
|
2
2
|
import warnings
|
|
3
|
+
from functools import reduce
|
|
3
4
|
from itertools import chain
|
|
4
5
|
|
|
5
6
|
import numpy as np
|
|
@@ -16,7 +17,6 @@ from pytensor.graph.type import HasShape
|
|
|
16
17
|
from pytensor.graph.utils import MissingInputError, TestValueError
|
|
17
18
|
from pytensor.scan.op import Scan, ScanInfo
|
|
18
19
|
from pytensor.scan.utils import expand_empty, safe_new, until
|
|
19
|
-
from pytensor.tensor.basic import get_underlying_scalar_constant_value
|
|
20
20
|
from pytensor.tensor.exceptions import NotScalarConstantError
|
|
21
21
|
from pytensor.tensor.math import minimum
|
|
22
22
|
from pytensor.tensor.shape import shape_padleft
|
|
@@ -143,31 +143,6 @@ def get_updates_and_outputs(ls):
|
|
|
143
143
|
raise ValueError(error_msg)
|
|
144
144
|
|
|
145
145
|
|
|
146
|
-
def isNaN_or_Inf_or_None(x):
|
|
147
|
-
isNone = x is None
|
|
148
|
-
try:
|
|
149
|
-
isNaN = np.isnan(x)
|
|
150
|
-
isInf = np.isinf(x)
|
|
151
|
-
isStr = isinstance(x, str)
|
|
152
|
-
except Exception:
|
|
153
|
-
isNaN = False
|
|
154
|
-
isInf = False
|
|
155
|
-
isStr = False
|
|
156
|
-
if not isNaN and not isInf:
|
|
157
|
-
try:
|
|
158
|
-
val = get_underlying_scalar_constant_value(x)
|
|
159
|
-
isInf = np.isinf(val)
|
|
160
|
-
isNaN = np.isnan(val)
|
|
161
|
-
except Exception:
|
|
162
|
-
isNaN = False
|
|
163
|
-
isInf = False
|
|
164
|
-
if isinstance(x, Constant) and isinstance(x.data, str):
|
|
165
|
-
isStr = True
|
|
166
|
-
else:
|
|
167
|
-
isStr = False
|
|
168
|
-
return isNone or isNaN or isInf or isStr
|
|
169
|
-
|
|
170
|
-
|
|
171
146
|
def _manage_output_api_change(outputs, updates, return_updates):
|
|
172
147
|
if return_updates:
|
|
173
148
|
warnings.warn(
|
|
@@ -505,7 +480,7 @@ def scan(
|
|
|
505
480
|
|
|
506
481
|
# This helper eagerly skips the Scan if n_steps is known to be 1
|
|
507
482
|
single_step_requested = False
|
|
508
|
-
if isinstance(n_steps,
|
|
483
|
+
if isinstance(n_steps, int | float):
|
|
509
484
|
single_step_requested = n_steps == 1
|
|
510
485
|
else:
|
|
511
486
|
try:
|
|
@@ -676,33 +651,20 @@ def scan(
|
|
|
676
651
|
if nw_name is not None:
|
|
677
652
|
nw_seq.name = nw_name
|
|
678
653
|
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
if len(lengths_vec) == 0:
|
|
688
|
-
# ^ No information about the number of steps
|
|
689
|
-
raise ValueError(
|
|
690
|
-
"No information about the number of steps "
|
|
691
|
-
"provided. Either provide a value for "
|
|
692
|
-
"n_steps argument of scan or provide an input "
|
|
693
|
-
"sequence"
|
|
694
|
-
)
|
|
695
|
-
|
|
696
|
-
# If the user has provided the number of steps, do that regardless ( and
|
|
697
|
-
# raise an error if the sequences are not long enough )
|
|
698
|
-
if isNaN_or_Inf_or_None(n_steps):
|
|
699
|
-
actual_n_steps = lengths_vec[0]
|
|
700
|
-
for contestant in lengths_vec[1:]:
|
|
701
|
-
actual_n_steps = minimum(actual_n_steps, contestant)
|
|
654
|
+
if n_steps is None:
|
|
655
|
+
if not scan_seqs:
|
|
656
|
+
raise ValueError(
|
|
657
|
+
"No information about the number of steps provided. "
|
|
658
|
+
"Either provide a value for n_steps argument of scan or provide an input sequence."
|
|
659
|
+
)
|
|
660
|
+
actual_n_steps = reduce(minimum, [seq.shape[0] for seq in scan_seqs])
|
|
702
661
|
else:
|
|
703
|
-
actual_n_steps = pt.as_tensor(n_steps)
|
|
662
|
+
actual_n_steps = pt.as_tensor(n_steps, dtype="int64", ndim=0)
|
|
704
663
|
|
|
664
|
+
# Since we've added all sequences now we need to level them off based on
|
|
665
|
+
# n_steps or their different shapes
|
|
705
666
|
scan_seqs = [seq[:actual_n_steps] for seq in scan_seqs]
|
|
667
|
+
|
|
706
668
|
# Conventions :
|
|
707
669
|
# mit_mot = multiple input taps, multiple output taps ( only provided
|
|
708
670
|
# by the gradient function )
|
|
@@ -899,10 +861,8 @@ def scan(
|
|
|
899
861
|
raw_inner_outputs = fn(*args)
|
|
900
862
|
|
|
901
863
|
condition, outputs, updates = get_updates_and_outputs(raw_inner_outputs)
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
else:
|
|
905
|
-
as_while = False
|
|
864
|
+
as_while = condition is not None
|
|
865
|
+
|
|
906
866
|
##
|
|
907
867
|
# Step 3. Check if we actually need scan and remove it if we don't
|
|
908
868
|
##
|
|
@@ -934,7 +894,7 @@ def scan(
|
|
|
934
894
|
|
|
935
895
|
# extract still missing inputs (there still might be so) and add them
|
|
936
896
|
# as non sequences at the end of our args
|
|
937
|
-
if
|
|
897
|
+
if as_while:
|
|
938
898
|
outputs.append(condition)
|
|
939
899
|
fake_nonseqs = [x.type() for x in non_seqs]
|
|
940
900
|
fake_outputs = clone_replace(
|
|
@@ -1252,8 +1212,8 @@ def scan(
|
|
|
1252
1212
|
rightOrder = (
|
|
1253
1213
|
mit_sot_rightOrder
|
|
1254
1214
|
+ sit_sot_rightOrder
|
|
1255
|
-
+ untraced_sit_sot_rightOrder
|
|
1256
1215
|
+ nit_sot_rightOrder
|
|
1216
|
+
+ untraced_sit_sot_rightOrder
|
|
1257
1217
|
)
|
|
1258
1218
|
scan_out_list = [None] * len(rightOrder)
|
|
1259
1219
|
for idx, pos in enumerate(rightOrder):
|
|
@@ -1521,7 +1521,7 @@ class Scan(Op, ScanMethodsMixin, HasInnerGraph):
|
|
|
1521
1521
|
|
|
1522
1522
|
def clone(self) -> "Scan":
|
|
1523
1523
|
res = copy(self)
|
|
1524
|
-
res.fgraph = res.fgraph.clone()
|
|
1524
|
+
res.fgraph = res.fgraph.clone(clone_inner_graphs=True)
|
|
1525
1525
|
return res
|
|
1526
1526
|
|
|
1527
1527
|
def make_thunk(self, node, storage_map, compute_map, no_recycling, impl=None):
|