pytensor 2.31.5__tar.gz → 2.31.7__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.31.5/pytensor.egg-info → pytensor-2.31.7}/PKG-INFO +2 -2
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/conf.py +24 -6
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/environment.yml +2 -1
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/index.rst +1 -3
- pytensor-2.31.7/doc/library/xtensor/index.md +101 -0
- pytensor-2.31.7/doc/library/xtensor/linalg.md +7 -0
- pytensor-2.31.7/doc/library/xtensor/math.md +8 -0
- pytensor-2.31.7/doc/library/xtensor/module_functions.md +7 -0
- pytensor-2.31.7/doc/library/xtensor/random.md +7 -0
- pytensor-2.31.7/doc/library/xtensor/type.md +21 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pyproject.toml +1 -1
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/_version.py +3 -3
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/graph/destroyhandler.py +43 -17
- pytensor-2.31.7/pytensor/link/jax/dispatch/blockwise.py +21 -0
- pytensor-2.31.7/pytensor/link/jax/dispatch/signal/conv.py +24 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/blockwise.py +3 -2
- pytensor-2.31.7/pytensor/link/numba/dispatch/signal/conv.py +69 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scalar/math.py +42 -32
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/basic.py +3 -4
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/blockwise.py +96 -29
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/__init__.py +0 -1
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/blockwise.py +64 -73
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/elemwise.py +198 -247
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/linalg.py +6 -1
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/subtensor_lift.py +5 -5
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/signal/conv.py +54 -56
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/__init__.py +2 -2
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/linalg.py +40 -2
- pytensor-2.31.7/pytensor/xtensor/math.py +627 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/random.py +148 -35
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/rewriting/math.py +2 -2
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/rewriting/shape.py +62 -9
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/rewriting/utils.py +12 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/rewriting/vectorization.py +11 -33
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/shape.py +189 -1
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/type.py +48 -2
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/vectorization.py +12 -2
- {pytensor-2.31.5 → pytensor-2.31.7/pytensor.egg-info}/PKG-INFO +2 -2
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor.egg-info/SOURCES.txt +6 -1
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor.egg-info/requires.txt +1 -1
- pytensor-2.31.5/pytensor/link/jax/dispatch/blockwise.py +0 -29
- pytensor-2.31.5/pytensor/link/jax/dispatch/signal/conv.py +0 -14
- pytensor-2.31.5/pytensor/link/numba/dispatch/signal/conv.py +0 -70
- pytensor-2.31.5/pytensor/tensor/rewriting/conv.py +0 -78
- pytensor-2.31.5/pytensor/xtensor/math.py +0 -252
- {pytensor-2.31.5 → pytensor-2.31.7}/LICENSE.txt +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/MANIFEST.in +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/README.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/.templates/layout.html +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/.templates/nb-badges.html +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/LICENSE.txt +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/README.md +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/acknowledgement.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/bcast.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/bcast.svg +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/blog.md +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/core_development_guide.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/css.inc +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/dev_start_guide.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/apply.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/apply.svg +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/apply2.svg +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/ctype.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/extending_faq.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/graphstructures.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/index.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/inplace.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/op.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/other_ops.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/pipeline.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/scan.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/tips.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/type.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/unittest.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/extending/using_params.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/faq.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/gallery/optimize/root.ipynb +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/gallery/page_footer.md +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/glossary.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/images/Elman_srnn.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/images/PyTensor.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/images/binder.svg +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/images/blocksparse.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/images/colab.svg +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/images/github.svg +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/images/lstm.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/images/talk2010.gif +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/images/talk2010.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/index.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/install.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/internal/how_to_release.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/internal/index.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/introduction.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/compile/function.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/compile/index.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/compile/io.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/compile/mode.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/compile/ops.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/compile/shared.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/config.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/index.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/graph/features.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/graph/graph.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/graph/index.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/graph/op.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/graph/replace.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/graph/type.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/graph/utils.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/printing.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/scalar/index.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/scan.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/sparse/index.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/basic.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/bcast.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/conv.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/fft.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/functional.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/index.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/io.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/optimize.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/random/distributions.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/random/index.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/tensor/utils.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/library/typed_list.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/links.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/optimizations.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/pylintrc +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/robots.txt +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/troubleshooting.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/adding.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/apply.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/apply.svg +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/bcast.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/conditions.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/examples.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/gradients.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/index.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/logistic.gp +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/logistic.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/loop.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/modes.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/prng.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/profiling.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/sparse.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/doc/user_guide.rst +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/bin/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/breakpoint.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/compile/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/compile/builders.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/compile/compiledir.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/compile/compilelock.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/compile/debugmode.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/compile/function/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/compile/function/pfunc.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/compile/function/types.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/compile/io.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/compile/mode.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/compile/monitormode.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/compile/nanguardmode.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/compile/ops.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/compile/profiling.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/configdefaults.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/configparser.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/d3viz/html/template.html +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/gradient.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/graph/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/graph/basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/graph/features.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/graph/fg.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/graph/null_type.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/graph/op.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/graph/replace.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/graph/type.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/graph/utils.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/ifelse.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/ipython.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/c/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/c/basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/c/cutils.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/c/cvm.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/c/interface.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/c/op.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/c/params_type.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/c/type.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/nlinalg.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/scan.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/slinalg.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/jax/linker.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/elemwise.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/solve/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/solve/cholesky.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/solve/general.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/solve/lu_solve.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/solve/norm.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/solve/posdef.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/solve/symmetric.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/solve/triangular.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/solve/tridiagonal.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/solve/utils.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/random.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/scalar.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/scan.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/slinalg.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/sparse.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/subtensor.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/numba/linker.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/pytorch/dispatch/basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/pytorch/dispatch/nlinalg.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/pytorch/dispatch/shape.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/utils.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/link/vm.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/misc/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/misc/check_blas.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/misc/frozendict.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/npy_2_compat.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/printing.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/py.typed +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/raise_op.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scalar/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scalar/basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scalar/loop.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scan/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scan/basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scan/op.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scan/rewriting.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scan/utils.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/scan/views.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/sparse/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/sparse/basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/sparse/sandbox/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/sparse/sandbox/sp.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/sparse/sandbox/sp2.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/sparse/type.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/sparse/utils.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/_linalg/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/_linalg/solve/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/_linalg/solve/rewriting.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/_linalg/solve/tridiagonal.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/blas.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/blas_c.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/blas_headers.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/blas_scipy.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/c_code/dimshuffle.c +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/conv/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/conv/abstract_conv.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/einsum.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/elemwise.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/extra_ops.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/fft.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/fourier.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/functional.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/inplace.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/io.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/linalg.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/math.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/nlinalg.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/optimize.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/pad.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/random/op.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/random/type.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/random/var.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/blas.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/math.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/shape.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/subtensor.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/shape.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/signal/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/slinalg.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/sort.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/special.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/subtensor.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/type.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/type_other.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/utils.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/var.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/variable.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/typed_list/basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/typed_list/type.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/updates.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/utils.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/indexing.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/reduction.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/rewriting/__init__.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/rewriting/basic.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/rewriting/indexing.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor/xtensor/rewriting/reduction.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/scripts/mypy-failing.txt +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/setup.cfg +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/setup.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/tests/test_breakpoint.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/tests/test_config.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/tests/test_gradient.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/tests/test_ifelse.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/tests/test_printing.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/tests/test_raise_op.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/tests/test_rop.py +0 -0
- {pytensor-2.31.5 → pytensor-2.31.7}/tests/test_updates.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pytensor
|
|
3
|
-
Version: 2.31.
|
|
3
|
+
Version: 2.31.7
|
|
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
|
|
@@ -34,7 +34,7 @@ Requires-Dist: numpy>=1.17.0
|
|
|
34
34
|
Requires-Dist: filelock>=3.15
|
|
35
35
|
Requires-Dist: etuples
|
|
36
36
|
Requires-Dist: logical-unification
|
|
37
|
-
Requires-Dist: miniKanren
|
|
37
|
+
Requires-Dist: miniKanren
|
|
38
38
|
Requires-Dist: cons
|
|
39
39
|
Provides-Extra: complete
|
|
40
40
|
Requires-Dist: pytensor[jax]; extra == "complete"
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import inspect
|
|
3
3
|
import sys
|
|
4
|
+
|
|
4
5
|
import pytensor
|
|
5
6
|
from pathlib import Path
|
|
6
7
|
|
|
@@ -12,6 +13,7 @@ extensions = [
|
|
|
12
13
|
"sphinx.ext.autodoc",
|
|
13
14
|
"sphinx.ext.todo",
|
|
14
15
|
"sphinx.ext.doctest",
|
|
16
|
+
"sphinx_copybutton",
|
|
15
17
|
"sphinx.ext.napoleon",
|
|
16
18
|
"sphinx.ext.linkcode",
|
|
17
19
|
"sphinx.ext.mathjax",
|
|
@@ -86,8 +88,7 @@ today_fmt = "%B %d, %Y"
|
|
|
86
88
|
|
|
87
89
|
# List of directories, relative to source directories, that shouldn't be
|
|
88
90
|
# searched for source files.
|
|
89
|
-
|
|
90
|
-
exclude_patterns = ['page_footer.md', '**/*.myst.md']
|
|
91
|
+
exclude_patterns = ["README.md", "images/*", "page_footer.md", "**/*.myst.md"]
|
|
91
92
|
|
|
92
93
|
# The reST default role (used for this markup: `text`) to use for all
|
|
93
94
|
# documents.
|
|
@@ -235,24 +236,41 @@ htmlhelp_basename = "pytensor_doc"
|
|
|
235
236
|
# Resolve function
|
|
236
237
|
# This function is used to populate the (source) links in the API
|
|
237
238
|
def linkcode_resolve(domain, info):
|
|
238
|
-
def
|
|
239
|
+
def find_obj() -> object:
|
|
239
240
|
# try to find the file and line number, based on code from numpy:
|
|
240
241
|
# https://github.com/numpy/numpy/blob/master/doc/source/conf.py#L286
|
|
241
242
|
obj = sys.modules[info["module"]]
|
|
242
243
|
for part in info["fullname"].split("."):
|
|
243
244
|
obj = getattr(obj, part)
|
|
245
|
+
return obj
|
|
244
246
|
|
|
247
|
+
def find_source(obj):
|
|
245
248
|
fn = Path(inspect.getsourcefile(obj))
|
|
246
|
-
fn = fn.relative_to(Path(__file__).parent)
|
|
249
|
+
fn = fn.relative_to(Path(pytensor.__file__).parent)
|
|
247
250
|
source, lineno = inspect.getsourcelines(obj)
|
|
248
251
|
return fn, lineno, lineno + len(source) - 1
|
|
249
252
|
|
|
253
|
+
def fallback_source():
|
|
254
|
+
return info["module"].replace(".", "/") + ".py"
|
|
255
|
+
|
|
250
256
|
if domain != "py" or not info["module"]:
|
|
251
257
|
return None
|
|
258
|
+
|
|
252
259
|
try:
|
|
253
|
-
|
|
260
|
+
obj = find_obj()
|
|
254
261
|
except Exception:
|
|
255
|
-
filename =
|
|
262
|
+
filename = fallback_source()
|
|
263
|
+
else:
|
|
264
|
+
try:
|
|
265
|
+
filename = "pytensor/%s#L%d-L%d" % find_source(obj)
|
|
266
|
+
except Exception:
|
|
267
|
+
# warnings.warn(f"Could not find source code for {domain}:{info}")
|
|
268
|
+
try:
|
|
269
|
+
filename = obj.__module__.replace(".", "/") + ".py"
|
|
270
|
+
except AttributeError:
|
|
271
|
+
# Some objects do not have a __module__ attribute (?)
|
|
272
|
+
filename = fallback_source()
|
|
273
|
+
|
|
256
274
|
import subprocess
|
|
257
275
|
|
|
258
276
|
tag = subprocess.Popen(
|
|
@@ -13,7 +13,9 @@ dependencies:
|
|
|
13
13
|
- mock
|
|
14
14
|
- pillow
|
|
15
15
|
- pymc-sphinx-theme
|
|
16
|
+
- sphinx-copybutton
|
|
16
17
|
- sphinx-design
|
|
18
|
+
- sphinx-sitemap
|
|
17
19
|
- pygments
|
|
18
20
|
- pydot
|
|
19
21
|
- ipython
|
|
@@ -23,5 +25,4 @@ dependencies:
|
|
|
23
25
|
- ablog
|
|
24
26
|
- pip
|
|
25
27
|
- pip:
|
|
26
|
-
- sphinx_sitemap
|
|
27
28
|
- -e ..
|
|
@@ -20,14 +20,12 @@ Modules
|
|
|
20
20
|
d3viz/index
|
|
21
21
|
graph/index
|
|
22
22
|
gradient
|
|
23
|
-
misc/pkl_utils
|
|
24
23
|
printing
|
|
25
|
-
scalar/index
|
|
26
24
|
scan
|
|
27
25
|
sparse/index
|
|
28
|
-
sparse/sandbox
|
|
29
26
|
tensor/index
|
|
30
27
|
typed_list
|
|
28
|
+
xtensor/index
|
|
31
29
|
|
|
32
30
|
.. module:: pytensor
|
|
33
31
|
:platform: Unix, Windows
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
(libdoc_xtensor)=
|
|
2
|
+
# `xtensor` -- XTensor operations
|
|
3
|
+
|
|
4
|
+
This module implements as abstraction layer on regular tensor operations, that behaves like Xarray.
|
|
5
|
+
|
|
6
|
+
A new type {class}`pytensor.xtensor.type.XTensorType`, generalizes the {class}`pytensor.tensor.TensorType`
|
|
7
|
+
with the addition of a `dims` attribute, that labels the dimensions of the tensor.
|
|
8
|
+
|
|
9
|
+
Variables of XTensorType (i.e., {class}`pytensor.xtensor.type.XTensorVariable`s) are the symbolic counterpart
|
|
10
|
+
to xarray DataArray objects.
|
|
11
|
+
|
|
12
|
+
The module implements several PyTensor operations {class}`pytensor.xtensor.basic.XOp`s, whose signature mimics that of
|
|
13
|
+
xarray (and xarray_einstats) DataArray operations. These operations, unlike most regular PyTensor operations, cannot
|
|
14
|
+
be directly evaluated, but require a rewrite (lowering) into a regular tensor graph that can itself be evaluated as usual.
|
|
15
|
+
|
|
16
|
+
Like regular PyTensor, we don't need an Op for every possible method or function in the public API of xarray.
|
|
17
|
+
If the existing XOps can be composed to produce the desired result, then we can use them directly.
|
|
18
|
+
|
|
19
|
+
## Coordinates
|
|
20
|
+
For now, there's no analogous of xarray coordinates, so you won't be able to do coordinate operations like `.sel`.
|
|
21
|
+
The graphs produced by an xarray program without coords are much more amenable to the numpy-like backend of PyTensor.
|
|
22
|
+
Coords involve aspects of Pandas/database query and joining that are not trivially expressible in PyTensor.
|
|
23
|
+
|
|
24
|
+
## Example
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
```{testcode}
|
|
28
|
+
|
|
29
|
+
import pytensor.tensor as pt
|
|
30
|
+
import pytensor.xtensor as ptx
|
|
31
|
+
|
|
32
|
+
a = pt.tensor("a", shape=(3,))
|
|
33
|
+
b = pt.tensor("b", shape=(4,))
|
|
34
|
+
|
|
35
|
+
ax = ptx.as_xtensor(a, dims=["x"])
|
|
36
|
+
bx = ptx.as_xtensor(b, dims=["y"])
|
|
37
|
+
|
|
38
|
+
zx = ax + bx
|
|
39
|
+
assert zx.type == ptx.type.XTensorType("float64", dims=["x", "y"], shape=(3, 4))
|
|
40
|
+
|
|
41
|
+
z = zx.values
|
|
42
|
+
z.dprint()
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
```{testoutput}
|
|
47
|
+
|
|
48
|
+
TensorFromXTensor [id A]
|
|
49
|
+
└─ XElemwise{scalar_op=Add()} [id B]
|
|
50
|
+
├─ XTensorFromTensor{dims=('x',)} [id C]
|
|
51
|
+
│ └─ a [id D]
|
|
52
|
+
└─ XTensorFromTensor{dims=('y',)} [id E]
|
|
53
|
+
└─ b [id F]
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Once we compile the graph, no XOps are left.
|
|
57
|
+
|
|
58
|
+
```{testcode}
|
|
59
|
+
|
|
60
|
+
import pytensor
|
|
61
|
+
|
|
62
|
+
with pytensor.config.change_flags(optimizer_verbose=True):
|
|
63
|
+
fn = pytensor.function([a, b], z)
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
```{testoutput}
|
|
68
|
+
|
|
69
|
+
rewriting: rewrite lower_elemwise replaces XElemwise{scalar_op=Add()}.0 of XElemwise{scalar_op=Add()}(XTensorFromTensor{dims=('x',)}.0, XTensorFromTensor{dims=('y',)}.0) with XTensorFromTensor{dims=('x', 'y')}.0 of XTensorFromTensor{dims=('x', 'y')}(Add.0)
|
|
70
|
+
rewriting: rewrite useless_tensor_from_xtensor replaces TensorFromXTensor.0 of TensorFromXTensor(XTensorFromTensor{dims=('x',)}.0) with a of None
|
|
71
|
+
rewriting: rewrite useless_tensor_from_xtensor replaces TensorFromXTensor.0 of TensorFromXTensor(XTensorFromTensor{dims=('y',)}.0) with b of None
|
|
72
|
+
rewriting: rewrite useless_tensor_from_xtensor replaces TensorFromXTensor.0 of TensorFromXTensor(XTensorFromTensor{dims=('x', 'y')}.0) with Add.0 of Add(ExpandDims{axis=1}.0, ExpandDims{axis=0}.0)
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
```{testcode}
|
|
77
|
+
|
|
78
|
+
fn.dprint()
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```{testoutput}
|
|
82
|
+
|
|
83
|
+
Add [id A] 2
|
|
84
|
+
├─ ExpandDims{axis=1} [id B] 1
|
|
85
|
+
│ └─ a [id C]
|
|
86
|
+
└─ ExpandDims{axis=0} [id D] 0
|
|
87
|
+
└─ b [id E]
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
## Index
|
|
92
|
+
|
|
93
|
+
:::{toctree}
|
|
94
|
+
:maxdepth: 1
|
|
95
|
+
|
|
96
|
+
module_functions
|
|
97
|
+
math
|
|
98
|
+
linalg
|
|
99
|
+
random
|
|
100
|
+
type
|
|
101
|
+
:::
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
(libdoc_xtenor_type)=
|
|
2
|
+
|
|
3
|
+
# `xtensor.type` -- Types and Variables
|
|
4
|
+
|
|
5
|
+
## XTensorVariable creation functions
|
|
6
|
+
|
|
7
|
+
```{eval-rst}
|
|
8
|
+
.. automodule:: pytensor.xtensor.type
|
|
9
|
+
:members: xtensor, xtensor_constant, as_xtensor
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## XTensor Type and Variable classes
|
|
14
|
+
|
|
15
|
+
```{eval-rst}
|
|
16
|
+
.. automodule:: pytensor.xtensor.type
|
|
17
|
+
:noindex:
|
|
18
|
+
:members: XTensorType, XTensorVariable, XTensorConstant
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
|
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-
|
|
11
|
+
"date": "2025-07-08T17:42:30+0200",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.31.
|
|
14
|
+
"full-revisionid": "4ce092fe4df857a2bf88a6a367b4a1592e10c0ee",
|
|
15
|
+
"version": "2.31.7"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -7,7 +7,6 @@ and inplace operations.
|
|
|
7
7
|
import itertools
|
|
8
8
|
from collections import deque
|
|
9
9
|
|
|
10
|
-
import pytensor
|
|
11
10
|
from pytensor.configdefaults import config
|
|
12
11
|
from pytensor.graph.basic import Constant
|
|
13
12
|
from pytensor.graph.features import AlreadyThere, Bookkeeper
|
|
@@ -223,7 +222,7 @@ def _build_droot_impact(destroy_handler):
|
|
|
223
222
|
return droot, impact, root_destroyer
|
|
224
223
|
|
|
225
224
|
|
|
226
|
-
def
|
|
225
|
+
def inplace_candidates(fgraph, inputs, protected_inputs=None):
|
|
227
226
|
"""
|
|
228
227
|
Return the variables in inputs that are possible candidate for as inputs of
|
|
229
228
|
inplace operation.
|
|
@@ -234,22 +233,49 @@ def fast_inplace_check(fgraph, inputs):
|
|
|
234
233
|
Inputs Variable that you want to use as inplace destination.
|
|
235
234
|
|
|
236
235
|
"""
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
236
|
+
if protected_inputs is None:
|
|
237
|
+
from pytensor.compile.function.types import Supervisor
|
|
238
|
+
|
|
239
|
+
protected_inputs = set(
|
|
240
|
+
itertools.chain.from_iterable(
|
|
241
|
+
f.protected for f in fgraph._features if isinstance(f, Supervisor)
|
|
242
|
+
)
|
|
241
243
|
)
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
244
|
+
protected_inputs.update(fgraph.outputs)
|
|
245
|
+
|
|
246
|
+
has_destroyers = fgraph.has_destroyers
|
|
247
|
+
view_i = fgraph.destroy_handler.view_i
|
|
248
|
+
candidate_roots = {}
|
|
249
|
+
candidate_inputs = []
|
|
250
|
+
for inp in inputs:
|
|
251
|
+
if isinstance(inp, Constant):
|
|
252
|
+
# Can't inplace on constants.
|
|
253
|
+
continue
|
|
254
|
+
|
|
255
|
+
# Find the root of the view chain, and while traversing check if it passes on any protected inputs.
|
|
256
|
+
view_of_protected = False
|
|
257
|
+
root = inp
|
|
258
|
+
try:
|
|
259
|
+
while True:
|
|
260
|
+
if root in protected_inputs:
|
|
261
|
+
view_of_protected = True
|
|
262
|
+
root = view_i[root]
|
|
263
|
+
except KeyError:
|
|
264
|
+
pass
|
|
265
|
+
|
|
266
|
+
if root in candidate_roots:
|
|
267
|
+
# Another input views on the same root, we can't destroy either
|
|
268
|
+
if (invalid_candidate := candidate_roots[root]) is not None:
|
|
269
|
+
# Invalidate the previous candidate
|
|
270
|
+
candidate_inputs.remove(invalid_candidate)
|
|
271
|
+
candidate_roots[root] = None
|
|
272
|
+
elif not view_of_protected and not has_destroyers([inp]):
|
|
273
|
+
candidate_inputs.append(inp)
|
|
274
|
+
candidate_roots[root] = inp
|
|
275
|
+
else:
|
|
276
|
+
candidate_roots[root] = None
|
|
277
|
+
|
|
278
|
+
return candidate_inputs
|
|
253
279
|
|
|
254
280
|
|
|
255
281
|
class DestroyHandler(Bookkeeper):
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import jax.numpy as jnp
|
|
2
|
+
|
|
3
|
+
from pytensor.link.jax.dispatch import jax_funcify
|
|
4
|
+
from pytensor.tensor.blockwise import Blockwise
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@jax_funcify.register(Blockwise)
|
|
8
|
+
def jax_funcify_Blockwise(op: Blockwise, node, **kwargs):
|
|
9
|
+
signature = op.signature
|
|
10
|
+
core_node = op._create_dummy_core_node(
|
|
11
|
+
node.inputs, propagate_unbatched_core_inputs=True
|
|
12
|
+
)
|
|
13
|
+
core_fn = jax_funcify(core_node.op, node=core_node, **kwargs)
|
|
14
|
+
|
|
15
|
+
vect_fn = jnp.vectorize(core_fn, signature=signature)
|
|
16
|
+
|
|
17
|
+
def blockwise_fn(*inputs):
|
|
18
|
+
op._check_runtime_broadcast(node, inputs)
|
|
19
|
+
return vect_fn(*inputs)
|
|
20
|
+
|
|
21
|
+
return blockwise_fn
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import jax
|
|
2
|
+
|
|
3
|
+
from pytensor.link.jax.dispatch import jax_funcify
|
|
4
|
+
from pytensor.tensor.basic import get_underlying_scalar_constant_value
|
|
5
|
+
from pytensor.tensor.exceptions import NotScalarConstantError
|
|
6
|
+
from pytensor.tensor.signal.conv import Convolve1d
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@jax_funcify.register(Convolve1d)
|
|
10
|
+
def jax_funcify_Convolve1d(op, node, **kwargs):
|
|
11
|
+
_, _, full_mode = node.inputs
|
|
12
|
+
try:
|
|
13
|
+
full_mode = get_underlying_scalar_constant_value(full_mode)
|
|
14
|
+
except NotScalarConstantError:
|
|
15
|
+
raise NotImplementedError(
|
|
16
|
+
"Cannot compile Convolve1D to jax without static mode"
|
|
17
|
+
)
|
|
18
|
+
static_mode = "full" if full_mode else "valid"
|
|
19
|
+
|
|
20
|
+
def conv1d(data, kernel, _runtime_full_mode):
|
|
21
|
+
# _runtime_full_mode is not used, as we only support static mode
|
|
22
|
+
return jax.numpy.convolve(data, kernel, mode=static_mode)
|
|
23
|
+
|
|
24
|
+
return conv1d
|
|
@@ -16,7 +16,7 @@ from pytensor.tensor import TensorVariable, get_vector_length
|
|
|
16
16
|
from pytensor.tensor.blockwise import Blockwise, BlockwiseWithCoreShape
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
@numba_funcify.register
|
|
19
|
+
@numba_funcify.register(BlockwiseWithCoreShape)
|
|
20
20
|
def numba_funcify_Blockwise(op: BlockwiseWithCoreShape, node, **kwargs):
|
|
21
21
|
[blockwise_node] = op.fgraph.apply_nodes
|
|
22
22
|
blockwise_op: Blockwise = blockwise_node.op
|
|
@@ -26,7 +26,8 @@ def numba_funcify_Blockwise(op: BlockwiseWithCoreShape, node, **kwargs):
|
|
|
26
26
|
core_shapes_len = tuple(get_vector_length(sh) for sh in node.inputs[nin:])
|
|
27
27
|
|
|
28
28
|
core_node = blockwise_op._create_dummy_core_node(
|
|
29
|
-
cast(tuple[TensorVariable],
|
|
29
|
+
cast(tuple[TensorVariable], node.inputs[:nin]),
|
|
30
|
+
propagate_unbatched_core_inputs=True,
|
|
30
31
|
)
|
|
31
32
|
core_op_fn = numba_funcify(
|
|
32
33
|
core_op,
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from numba.np.arraymath import _get_inner_prod
|
|
3
|
+
|
|
4
|
+
from pytensor.link.numba.dispatch import numba_funcify
|
|
5
|
+
from pytensor.link.numba.dispatch.basic import numba_njit
|
|
6
|
+
from pytensor.tensor.signal.conv import Convolve1d
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@numba_funcify.register(Convolve1d)
|
|
10
|
+
def numba_funcify_Convolve1d(op, node, **kwargs):
|
|
11
|
+
# This specialized version is faster than the overloaded numba np.convolve
|
|
12
|
+
a_dtype, b_dtype = node.inputs[0].type.dtype, node.inputs[1].type.dtype
|
|
13
|
+
out_dtype = node.outputs[0].type.dtype
|
|
14
|
+
innerprod = _get_inner_prod(a_dtype, b_dtype)
|
|
15
|
+
|
|
16
|
+
@numba_njit
|
|
17
|
+
def valid_convolve1d(x, y):
|
|
18
|
+
nx = len(x)
|
|
19
|
+
ny = len(y)
|
|
20
|
+
if nx < ny:
|
|
21
|
+
x, y = y, x
|
|
22
|
+
nx, ny = ny, nx
|
|
23
|
+
y_flipped = y[::-1]
|
|
24
|
+
|
|
25
|
+
length = nx - ny + 1
|
|
26
|
+
ret = np.empty(length, out_dtype)
|
|
27
|
+
|
|
28
|
+
for i in range(length):
|
|
29
|
+
ret[i] = innerprod(x[i : i + ny], y_flipped)
|
|
30
|
+
|
|
31
|
+
return ret
|
|
32
|
+
|
|
33
|
+
@numba_njit
|
|
34
|
+
def full_convolve1d(x, y):
|
|
35
|
+
nx = len(x)
|
|
36
|
+
ny = len(y)
|
|
37
|
+
if nx < ny:
|
|
38
|
+
x, y = y, x
|
|
39
|
+
nx, ny = ny, nx
|
|
40
|
+
y_flipped = y[::-1]
|
|
41
|
+
|
|
42
|
+
length = nx + ny - 1
|
|
43
|
+
ret = np.empty(length, out_dtype)
|
|
44
|
+
idx = 0
|
|
45
|
+
|
|
46
|
+
for i in range(ny - 1):
|
|
47
|
+
k = i + 1
|
|
48
|
+
ret[idx] = innerprod(x[:k], y_flipped[-k:])
|
|
49
|
+
idx = idx + 1
|
|
50
|
+
|
|
51
|
+
for i in range(nx - ny + 1):
|
|
52
|
+
ret[idx] = innerprod(x[i : i + ny], y_flipped)
|
|
53
|
+
idx = idx + 1
|
|
54
|
+
|
|
55
|
+
for i in range(ny - 1):
|
|
56
|
+
k = ny - i - 1
|
|
57
|
+
ret[idx] = innerprod(x[-k:], y_flipped[:k])
|
|
58
|
+
idx = idx + 1
|
|
59
|
+
|
|
60
|
+
return ret
|
|
61
|
+
|
|
62
|
+
@numba_njit
|
|
63
|
+
def convolve_1d(x, y, mode):
|
|
64
|
+
if mode:
|
|
65
|
+
return full_convolve1d(x, y)
|
|
66
|
+
else:
|
|
67
|
+
return valid_convolve1d(x, y)
|
|
68
|
+
|
|
69
|
+
return convolve_1d
|
|
@@ -385,46 +385,56 @@ class Psi(UnaryScalarOp):
|
|
|
385
385
|
#define DEVICE
|
|
386
386
|
#endif
|
|
387
387
|
|
|
388
|
-
#ifndef
|
|
389
|
-
#define
|
|
388
|
+
#ifndef M_PI
|
|
389
|
+
#define M_PI 3.14159265358979323846
|
|
390
390
|
#endif
|
|
391
391
|
|
|
392
392
|
#ifndef _PSIFUNCDEFINED
|
|
393
393
|
#define _PSIFUNCDEFINED
|
|
394
|
-
DEVICE double _psi(
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
394
|
+
DEVICE double _psi(double x) {
|
|
395
|
+
|
|
396
|
+
/*taken from
|
|
397
|
+
Bernardo, J. M. (1976). Algorithm AS 103:
|
|
398
|
+
Psi (Digamma) Function. Applied Statistics. 25 (3), 315-317.
|
|
399
|
+
http://www.uv.es/~bernardo/1976AppStatist.pdf
|
|
400
|
+
*/
|
|
401
|
+
|
|
402
|
+
double y, R, psi_ = 0;
|
|
403
|
+
double S = 1.0e-5;
|
|
404
|
+
double C = 8.5;
|
|
405
|
+
double S3 = 8.333333333e-2;
|
|
406
|
+
double S4 = 8.333333333e-3;
|
|
407
|
+
double S5 = 3.968253968e-3;
|
|
408
|
+
double D1 = -0.5772156649;
|
|
400
409
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
+
if (x <= 0) {
|
|
411
|
+
// the digamma function approaches infinity from one side and -infinity from the other, around negative integers and zero
|
|
412
|
+
if (x == floor(x)) {
|
|
413
|
+
return INFINITY; // note that scipy returns -INF for 0 and NaN for negative integers
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// Use reflection formula
|
|
417
|
+
double pi_x = M_PI * x;
|
|
418
|
+
double cot_pi_x = cos(pi_x) / sin(pi_x);
|
|
419
|
+
return _psi(1.0 - x) - M_PI * cot_pi_x;
|
|
420
|
+
}
|
|
410
421
|
|
|
411
|
-
|
|
412
|
-
return psi_;
|
|
422
|
+
y = x;
|
|
413
423
|
|
|
414
|
-
|
|
415
|
-
|
|
424
|
+
if (y <= S)
|
|
425
|
+
return D1 - 1.0/y;
|
|
416
426
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
427
|
+
while (y < C) {
|
|
428
|
+
psi_ = psi_ - 1.0 / y;
|
|
429
|
+
y = y + 1;
|
|
430
|
+
}
|
|
421
431
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
432
|
+
R = 1.0 / y;
|
|
433
|
+
psi_ = psi_ + log(y) - .5 * R ;
|
|
434
|
+
R= R*R;
|
|
435
|
+
psi_ = psi_ - R * (S3 - R * (S4 - R * S5));
|
|
426
436
|
|
|
427
|
-
|
|
437
|
+
return psi_;
|
|
428
438
|
}
|
|
429
439
|
#endif
|
|
430
440
|
"""
|
|
@@ -433,8 +443,8 @@ class Psi(UnaryScalarOp):
|
|
|
433
443
|
(x,) = inp
|
|
434
444
|
(z,) = out
|
|
435
445
|
if node.inputs[0].type in float_types:
|
|
436
|
-
|
|
437
|
-
|
|
446
|
+
dtype = "npy_" + node.outputs[0].dtype
|
|
447
|
+
return f"{z} = ({dtype}) _psi({x});"
|
|
438
448
|
raise NotImplementedError("only floating point is implemented")
|
|
439
449
|
|
|
440
450
|
|
|
@@ -678,10 +678,9 @@ class ScalarFromTensor(COp):
|
|
|
678
678
|
self, [t], [ps.get_scalar_type(dtype=t.type.dtype).make_variable()]
|
|
679
679
|
)
|
|
680
680
|
|
|
681
|
-
def perform(self, node,
|
|
682
|
-
(
|
|
683
|
-
|
|
684
|
-
out[0] = s.flatten()[0]
|
|
681
|
+
def perform(self, node, inputs, output_storage):
|
|
682
|
+
# not using .item() because that returns a Python scalar, not a numpy scalar
|
|
683
|
+
output_storage[0][0] = inputs[0][()]
|
|
685
684
|
|
|
686
685
|
def infer_shape(self, fgraph, node, in_shapes):
|
|
687
686
|
return [()]
|