pytensor 3.1.2__tar.gz → 3.1.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pytensor-3.1.2/pytensor.egg-info → pytensor-3.1.3}/PKG-INFO +1 -1
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/internal/how_to_release.rst +0 -4
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/config.rst +0 -33
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/_version.py +3 -3
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/debug/profiling.py +1 -59
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/maker.py +1 -8
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/mode.py +55 -3
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/configdefaults.py +0 -61
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/configparser.py +0 -3
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/gradient.py +1 -1
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/features.py +1 -26
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/rewriting/basic.py +1 -1
- pytensor-3.1.3/pytensor/graph/rewriting/utils.py +116 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/type.py +0 -28
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/basic.py +1 -7
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/c/cmodule.py +1 -40
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/c/op.py +0 -1
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/printing.py +0 -81
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scalar/basic.py +30 -79
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/op.py +2 -12
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/utils.py +0 -32
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/sparse/basic.py +12 -2
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/basic.py +1 -1
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/blas/gemm.py +3 -1
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/elemwise.py +7 -6
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/extra_ops.py +0 -65
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/fourier.py +11 -6
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/inverse.py +3 -1
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/optimize.py +4 -4
- pytensor-3.1.3/pytensor/tensor/rewriting/extra_ops.py +64 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/math.py +0 -15
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/subtensor.py +180 -35
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/subtensor_lift.py +83 -40
- {pytensor-3.1.2 → pytensor-3.1.3/pytensor.egg-info}/PKG-INFO +1 -1
- {pytensor-3.1.2 → pytensor-3.1.3}/tests/test_gradient.py +7 -0
- pytensor-3.1.2/pytensor/graph/rewriting/utils.py +0 -272
- pytensor-3.1.2/pytensor/tensor/rewriting/extra_ops.py +0 -118
- {pytensor-3.1.2 → pytensor-3.1.3}/LICENSE.txt +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/MANIFEST.in +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/README.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/.templates/layout.html +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/.templates/nb-badges.html +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/.templates/rendered_citation.html +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/LICENSE.txt +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/README.md +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/_drafts/benchmark_mlx_v_jax_corrected.ipynb +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/_thumbnails/autodiff/vector_jacobian_product.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/acknowledgement.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/bcast.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/bcast.svg +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/blog.md +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/conf.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/core_development_guide.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/css.inc +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/dev_start_guide.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/environment.yml +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/apply.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/apply.svg +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/apply2.svg +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/ctype.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/extending_faq.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/graphstructures.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/index.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/inplace.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/op.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/other_ops.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/pipeline.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/scan.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/tips.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/type.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/unittest.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/extending/using_params.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/faq.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/gallery/applications/normalizing_flows_in_pytensor.ipynb +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/gallery/applications/tiny_transformer_llm.ipynb +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/gallery/autodiff/vector_jacobian_product.ipynb +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/gallery/introduction/pytensor_intro.ipynb +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/gallery/optimize/root.ipynb +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/gallery/page_footer.md +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/gallery/rewrites/graph_rewrites.ipynb +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/gallery/scan/scan_tutorial.ipynb +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/glossary.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/images/Elman_srnn.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/images/PyTensor.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/images/PyTensor_logo.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/images/binder.svg +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/images/blocksparse.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/images/colab.svg +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/images/github.svg +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/images/lstm.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/images/talk2010.gif +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/images/talk2010.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/index.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/install.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/internal/index.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/introduction.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/compile/function.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/compile/index.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/compile/io.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/compile/mode.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/compile/ops.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/compile/shared.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/index.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/graph/features.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/graph/graph.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/graph/index.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/graph/op.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/graph/replace.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/graph/type.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/graph/utils.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/index.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/printing.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/scalar/index.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/scan.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/sparse/index.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/basic.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/bcast.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/fft.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/functional.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/index.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/io.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/linalg.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/optimize.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/random.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/tensor/utils.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/typed_list.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/xtensor/index.md +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/xtensor/linalg.md +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/xtensor/math.md +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/xtensor/module_functions.md +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/xtensor/random.md +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/xtensor/signal.md +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/library/xtensor/type.md +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/links.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/optimizations.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/pylintrc +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/robots.txt +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/troubleshooting.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/adding.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/apply.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/apply.svg +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/bcast.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/conditions.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/examples.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/gradients.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/index.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/logistic.gp +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/logistic.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/loop.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/modes.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/prng.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/profiling.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/sparse.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/doc/user_guide.rst +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pyproject.toml +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/_sparse_lazy.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/alloc.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/blockwise.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/core.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/diagonal.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/dimshuffle.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/dot.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/elemwise.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/orthogonal.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/permutation.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/positive_definite.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/reshape.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/selection.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/shape.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/specify.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/subtensor.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/symmetric.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/assumptions/triangular.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/bin/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/breakpoint.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/aliasing.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/builders.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/compiledir.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/compilelock.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/debug/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/debug/debugmode.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/debug/dump.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/debug/monitormode.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/debug/nanguardmode.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/executor.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/inner_function.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/io.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/ops.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/rebuild.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/rewriting.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/d3viz/html/template.html +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/fg.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/null_type.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/op.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/replace.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/rewriting/reachability.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/traversal.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/graph/utils.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/ifelse.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/ipython.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/c/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/c/basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/c/cutils.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/c/cvm.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/c/interface.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/c/params_type.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/c/type.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/blas.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/einsum.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/linalg/constructors.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/linalg/products.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/linalg/solvers.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/linalg/summary.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/math.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/pad.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/scan.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/signal/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/signal/conv.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/linker.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/jax/ops.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/blas.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/blockwise.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/einsum.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/elemwise.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/extra_ops.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/linalg/products.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/linalg/solvers.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/linalg/summary.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/math.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/pad.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/scalar.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/shape.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/signal/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/signal/conv.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/sort.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/subtensor.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/dispatch/tensor_basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/mlx/linker.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/cache.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/blockwise.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/compile_ops.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/elemwise.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/_LAPACK.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/constructors.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/decomposition/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/decomposition/cholesky.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/decomposition/dispatch.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/decomposition/eigen.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/decomposition/lu_factor.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/decomposition/qr.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/decomposition/qz.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/decomposition/schur.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/decomposition/svd.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/products.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/solvers/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/solvers/cholesky.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/solvers/dispatch.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/solvers/general.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/solvers/hermitian.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/solvers/linear_control.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/solvers/lu_solve.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/solvers/posdef.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/solvers/symmetric.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/solvers/triangular.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/solvers/tridiagonal.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/solvers/utils.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/summary.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/linalg/utils.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/random.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/scalar.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/scan.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/shape.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/signal/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/signal/conv.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/sort.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/sparse/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/sparse/basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/sparse/math.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/sparse/variable.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/string_codegen.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/subtensor.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/typed_list.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/numba/linker.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/dispatch/basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/dispatch/blas.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/dispatch/blockwise.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/dispatch/linalg/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/dispatch/linalg/decomposition.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/dispatch/linalg/inverse.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/dispatch/linalg/products.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/dispatch/linalg/summary.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/dispatch/math.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/dispatch/shape.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/dispatch/sort.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/dispatch/subtensor.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/utils.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/link/vm.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/misc/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/misc/check_blas.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/misc/frozendict.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/misc/pkl_utils.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/npy_2_compat.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/py.typed +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/raise_op.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scalar/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scalar/c_code/incbet.c +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scalar/loop.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scalar/math.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/rewriting/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/rewriting/db.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/rewriting/inner_graph.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/rewriting/inplace.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/rewriting/io.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/rewriting/merge.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/rewriting/push_out.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/rewriting/trace.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/rewriting/utils.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/scan/views.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/sparse/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/sparse/linalg.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/sparse/math.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/sparse/type.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/sparse/utils.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/sparse/variable.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/blas/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/blas/_core.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/blas/batched.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/blas/blas_c.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/blas/c_code/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/blas/c_code/alt_blas_common.h +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/blas/c_code/alt_blas_template.c +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/blas/c_code/blas_headers.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/blas/c_code/codegen.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/blas/gemv.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/blas/ger.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/blockwise.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/c_code/dimshuffle.c +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/einsum.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/fft.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/functional.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/interpolate.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/_lazy.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/constructors.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/decomposition/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/decomposition/cholesky.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/decomposition/eigen.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/decomposition/lu.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/decomposition/qr.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/decomposition/schur.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/decomposition/svd.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/dtype_utils.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/products.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/solvers/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/solvers/core.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/solvers/general.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/solvers/linear_control.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/solvers/lstsq.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/solvers/psd.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/solvers/triangular.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/solvers/tridiagonal.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/linalg/summary.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/math.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/nlinalg.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/pad.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/random/op.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/random/rewriting/basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/random/type.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/random/utils.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/random/variable.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/reshape.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/assumptions.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/blas.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/einsum.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/elemwise.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/indexed_elemwise.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/linalg/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/linalg/decomposition.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/linalg/inverse.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/linalg/products.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/linalg/solvers.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/linalg/summary.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/linalg/utils.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/numba.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/ofg.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/optimize.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/reshape.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/shape.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/shape.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/signal/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/signal/conv.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/slinalg.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/sort.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/special.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/subtensor.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/symbolic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/type.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/type_other.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/utils.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/var.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/variable.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/typed_list/basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/typed_list/type.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/utils.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/indexing.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/linalg.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/math.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/random/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/random/basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/random/type.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/random/variable.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/reduction.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/rewriting/__init__.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/rewriting/basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/rewriting/indexing.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/rewriting/math.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/rewriting/reduction.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/rewriting/shape.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/rewriting/utils.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/rewriting/vectorization.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/shape.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/signal.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/type.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor/xtensor/vectorization.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor.egg-info/SOURCES.txt +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor.egg-info/requires.txt +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/scripts/mypy-failing.txt +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/scripts/slowest_tests/update-slowest-times-issue.sh +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/setup.cfg +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/setup.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/tests/test_basic.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/tests/test_breakpoint.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/tests/test_config.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/tests/test_ifelse.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/tests/test_printing.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/tests/test_raise_op.py +0 -0
- {pytensor-3.1.2 → pytensor-3.1.3}/tests/test_rop.py +0 -0
|
@@ -13,10 +13,6 @@ Update the version number
|
|
|
13
13
|
|
|
14
14
|
Update the year in the ``PyTensor/LICENSE.txt`` file too, if necessary.
|
|
15
15
|
|
|
16
|
-
Update the code and the documentation for the pytensor flags
|
|
17
|
-
``warn__ignore_bug_before`` to accept the new version. You must modify the
|
|
18
|
-
file ``pytensor/configdefaults.py`` and ``doc/library/config.txt``.
|
|
19
|
-
|
|
20
16
|
Tag the release
|
|
21
17
|
===============
|
|
22
18
|
|
|
@@ -405,31 +405,6 @@ import ``pytensor`` and print the config variable, as in:
|
|
|
405
405
|
raise the exception (i.e. ``'raise'``).
|
|
406
406
|
|
|
407
407
|
|
|
408
|
-
.. attribute:: config.warn__ignore_bug_before
|
|
409
|
-
|
|
410
|
-
String value: ``'None'``, ``'all'``, ``'0.3'``, ``'0.4'``, ``'0.4.1'``,
|
|
411
|
-
``'0.5'``, ``'0.6'``, ``'0.7'``, ``'0.8'``, ``'0.8.1'``, ``'0.8.2'``,
|
|
412
|
-
``'0.9'``, ``'0.10'``, ``'1.0'``, ``'1.0.1'``, ``'1.0.2'``, ``'1.0.3'``,
|
|
413
|
-
``'1.0.4'``,``'1.0.5'``
|
|
414
|
-
|
|
415
|
-
Default: ``'0.9'``
|
|
416
|
-
|
|
417
|
-
When we an PyTensor bug that generated a bad result is fixed, we also make
|
|
418
|
-
PyTensor raise a warning when it encounters the same circumstances again. This
|
|
419
|
-
helps users determine whether or not said bug has affected past runs, since
|
|
420
|
-
one only needs to perform the same runs again with the new version, and one
|
|
421
|
-
does not have to understand the PyTensor internals that triggered the bug.
|
|
422
|
-
|
|
423
|
-
This flag lets users ignore warnings about old bugs that were
|
|
424
|
-
fixed before their first checkout of PyTensor.
|
|
425
|
-
You can set its value to the first version of PyTensor
|
|
426
|
-
that you used (probably 0.3 or higher)
|
|
427
|
-
|
|
428
|
-
``'None'`` means that all warnings will be displayed.
|
|
429
|
-
``'all'`` means all warnings will be ignored.
|
|
430
|
-
|
|
431
|
-
This flag's value cannot be modified during program execution.
|
|
432
|
-
|
|
433
408
|
.. attribute:: base_compiledir
|
|
434
409
|
|
|
435
410
|
Default: On Windows: ``$LOCALAPPDATA\\PyTensor`` if ``$LOCALAPPDATA`` is defined,
|
|
@@ -734,11 +709,3 @@ import ``pytensor`` and print the config variable, as in:
|
|
|
734
709
|
The number of traceback stack levels to keep for variables during PyTensor
|
|
735
710
|
compilation. When this value is greater than zero, it will make PyTensor keep
|
|
736
711
|
internal stack traces.
|
|
737
|
-
|
|
738
|
-
.. attribute:: config.metaopt__verbose
|
|
739
|
-
|
|
740
|
-
Int value, default: 0
|
|
741
|
-
|
|
742
|
-
The verbosity level of the meta-rewriter: ``0`` for silent, ``1`` to only
|
|
743
|
-
warn when PyTensor cannot meta-rewrite an :class:`Op`, ``2`` for full output (e.g.
|
|
744
|
-
timings and the rewrites selected).
|
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2026-07-
|
|
11
|
+
"date": "2026-07-10T22:43:47+0200",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "3.1.
|
|
14
|
+
"full-revisionid": "4c7f21181b616d2e05310a518c87cc661ba1b97e",
|
|
15
|
+
"version": "3.1.3"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -9,7 +9,6 @@ ProfileStats object for runtime and memory profiling.
|
|
|
9
9
|
#
|
|
10
10
|
|
|
11
11
|
import atexit
|
|
12
|
-
import copy
|
|
13
12
|
import logging
|
|
14
13
|
import operator
|
|
15
14
|
import sys
|
|
@@ -54,8 +53,6 @@ _atexit_registered: bool = False
|
|
|
54
53
|
def _atexit_print_fn():
|
|
55
54
|
"""Print `ProfileStat` objects in `_atexit_print_list` to `_atexit_print_file`."""
|
|
56
55
|
if config.profile:
|
|
57
|
-
to_sum = []
|
|
58
|
-
|
|
59
56
|
if config.profiling__destination == "stderr":
|
|
60
57
|
destination_file = "<stderr>"
|
|
61
58
|
elif config.profiling__destination == "stdout":
|
|
@@ -78,64 +75,9 @@ def _atexit_print_fn():
|
|
|
78
75
|
n_ops_to_print=config.profiling__n_ops,
|
|
79
76
|
n_apply_to_print=config.profiling__n_apply,
|
|
80
77
|
)
|
|
81
|
-
|
|
82
|
-
if ps.show_sum:
|
|
83
|
-
to_sum.append(ps)
|
|
84
78
|
else:
|
|
85
79
|
# TODO print the name if there is one!
|
|
86
80
|
print("Skipping empty Profile") # noqa: T201
|
|
87
|
-
if len(to_sum) > 1:
|
|
88
|
-
# Make a global profile
|
|
89
|
-
cum = copy.copy(to_sum[0])
|
|
90
|
-
msg = f"Sum of all({len(to_sum)}) printed profiles at exit."
|
|
91
|
-
cum.message = msg
|
|
92
|
-
for ps in to_sum[1:]:
|
|
93
|
-
for attr in [
|
|
94
|
-
"compile_time",
|
|
95
|
-
"fct_call_time",
|
|
96
|
-
"fct_callcount",
|
|
97
|
-
"vm_call_time",
|
|
98
|
-
"rewriter_time",
|
|
99
|
-
"linker_time",
|
|
100
|
-
"validate_time",
|
|
101
|
-
"import_time",
|
|
102
|
-
"linker_node_make_thunks",
|
|
103
|
-
]:
|
|
104
|
-
setattr(cum, attr, getattr(cum, attr) + getattr(ps, attr))
|
|
105
|
-
|
|
106
|
-
# merge dictionary
|
|
107
|
-
for attr in [
|
|
108
|
-
"apply_time",
|
|
109
|
-
"apply_callcount",
|
|
110
|
-
"apply_cimpl",
|
|
111
|
-
"variable_shape",
|
|
112
|
-
"variable_strides",
|
|
113
|
-
"variable_offset",
|
|
114
|
-
"linker_make_thunk_time",
|
|
115
|
-
]:
|
|
116
|
-
cum_attr = getattr(cum, attr)
|
|
117
|
-
for key, val in getattr(ps, attr.items()):
|
|
118
|
-
assert key not in cum_attr, (key, cum_attr)
|
|
119
|
-
cum_attr[key] = val
|
|
120
|
-
|
|
121
|
-
if cum.rewriter_profile and ps.rewriter_profile:
|
|
122
|
-
try:
|
|
123
|
-
merge = cum.rewriter_profile[0].merge_profile(
|
|
124
|
-
cum.rewriter_profile[1], ps.rewriter_profile[1]
|
|
125
|
-
)
|
|
126
|
-
assert len(merge) == len(cum.rewriter_profile[1])
|
|
127
|
-
cum.rewriter_profile = (cum.rewriter_profile[0], merge)
|
|
128
|
-
except Exception as e:
|
|
129
|
-
print(e) # noqa: T201
|
|
130
|
-
cum.rewriter_profile = None
|
|
131
|
-
else:
|
|
132
|
-
cum.rewriter_profile = None
|
|
133
|
-
|
|
134
|
-
cum.summary(
|
|
135
|
-
file=f,
|
|
136
|
-
n_ops_to_print=config.profiling__n_ops,
|
|
137
|
-
n_apply_to_print=config.profiling__n_apply,
|
|
138
|
-
)
|
|
139
81
|
|
|
140
82
|
if config.print_global_stats:
|
|
141
83
|
print_global_stats()
|
|
@@ -159,7 +101,7 @@ def print_global_stats():
|
|
|
159
101
|
destination_file = config.profiling__destination
|
|
160
102
|
|
|
161
103
|
with extended_open(destination_file, mode="w") as f:
|
|
162
|
-
print("=" * 50, file=
|
|
104
|
+
print("=" * 50, file=f)
|
|
163
105
|
print(
|
|
164
106
|
(
|
|
165
107
|
"Global stats: ",
|
|
@@ -469,14 +469,7 @@ class FunctionMaker:
|
|
|
469
469
|
mode=mode,
|
|
470
470
|
traceback__limit=config.traceback__compile_limit,
|
|
471
471
|
):
|
|
472
|
-
|
|
473
|
-
# the active linker's required/incompatible rewrites reliably
|
|
474
|
-
# (``config.mode`` is unreliable across nested compilations).
|
|
475
|
-
fgraph._compile_mode = mode
|
|
476
|
-
try:
|
|
477
|
-
rewriter_profile = rewriter(fgraph)
|
|
478
|
-
finally:
|
|
479
|
-
del fgraph._compile_mode
|
|
472
|
+
rewriter_profile = rewriter(fgraph)
|
|
480
473
|
|
|
481
474
|
end_rewriter = time.perf_counter()
|
|
482
475
|
rewrite_time = end_rewriter - start_rewriter
|
|
@@ -4,6 +4,7 @@ WRITEME
|
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
import logging
|
|
7
|
+
import sys
|
|
7
8
|
import warnings
|
|
8
9
|
from typing import Any
|
|
9
10
|
|
|
@@ -279,6 +280,53 @@ optdb.register("CheckStackTrace", CheckStackTraceRewriter(), *_tags, position=-1
|
|
|
279
280
|
del _tags
|
|
280
281
|
|
|
281
282
|
|
|
283
|
+
class _ActiveModeGraphRewriter(GraphRewriter):
|
|
284
|
+
"""Wrap a mode's optimizer so applying it records the active compile mode.
|
|
285
|
+
|
|
286
|
+
Exposes the compile mode as ``fgraph._compile_mode`` (see ``get_active_mode``)
|
|
287
|
+
so rewrites can make decisions based on the compile target (fusion split rules,
|
|
288
|
+
inner graph specialization, ...). Stamps the mode when the fgraph does not already carry one, and
|
|
289
|
+
restores the previous state after.
|
|
290
|
+
"""
|
|
291
|
+
|
|
292
|
+
def __init__(self, rewriter: GraphRewriter, mode: "Mode"):
|
|
293
|
+
self._rewriter = rewriter
|
|
294
|
+
self._mode = mode
|
|
295
|
+
|
|
296
|
+
def add_requirements(self, fgraph):
|
|
297
|
+
return self._rewriter.add_requirements(fgraph)
|
|
298
|
+
|
|
299
|
+
def apply(self, fgraph, *args, **kwargs):
|
|
300
|
+
# Only stamp when unset, so a mode already established by an outer
|
|
301
|
+
# optimizer run (the outermost compilation, or a nested inner-graph
|
|
302
|
+
# rewrite) wins.
|
|
303
|
+
stamped = getattr(fgraph, "_compile_mode", None) is None
|
|
304
|
+
if stamped:
|
|
305
|
+
fgraph._compile_mode = self._mode
|
|
306
|
+
try:
|
|
307
|
+
return self._rewriter.apply(fgraph, *args, **kwargs)
|
|
308
|
+
finally:
|
|
309
|
+
if stamped:
|
|
310
|
+
del fgraph._compile_mode
|
|
311
|
+
|
|
312
|
+
def print_summary(self, stream=sys.stdout, level=0, depth=-1):
|
|
313
|
+
return self._rewriter.print_summary(stream=stream, level=level, depth=depth)
|
|
314
|
+
|
|
315
|
+
def print_profile(self, stream, prof, level=0):
|
|
316
|
+
# ``GraphRewriter.print_profile`` is a classmethod that raises unless
|
|
317
|
+
# overridden, so delegate to the wrapped rewriter's implementation.
|
|
318
|
+
return self._rewriter.print_profile(stream, prof, level=level)
|
|
319
|
+
|
|
320
|
+
def __getattr__(self, name):
|
|
321
|
+
# Delegate everything else (profiling helpers, query metadata, ...) to the
|
|
322
|
+
# wrapped rewriter. ``__getattr__`` only fires for names not found normally,
|
|
323
|
+
# so the overrides above take precedence. Guard ``_rewriter`` itself to avoid
|
|
324
|
+
# infinite recursion before ``__init__`` has run.
|
|
325
|
+
if name == "_rewriter":
|
|
326
|
+
raise AttributeError(name)
|
|
327
|
+
return getattr(self._rewriter, name)
|
|
328
|
+
|
|
329
|
+
|
|
282
330
|
class Mode:
|
|
283
331
|
"""A class that specifies the rewrites/optimizations used during function compilation.
|
|
284
332
|
|
|
@@ -377,9 +425,13 @@ class Mode:
|
|
|
377
425
|
@property
|
|
378
426
|
def optimizer(self):
|
|
379
427
|
if isinstance(self._optimizer, RewriteDatabaseQuery):
|
|
380
|
-
|
|
428
|
+
rewriter = self.optdb.query(self._optimizer)
|
|
381
429
|
else:
|
|
382
|
-
|
|
430
|
+
rewriter = self._optimizer
|
|
431
|
+
# Stamp this mode as the fgraph's active compile mode while rewriting, so
|
|
432
|
+
# inner-graph rewrites can recover the right linker even when the optimizer
|
|
433
|
+
# is run directly (outside ``FunctionMaker``, e.g. ``mode.optimizer.rewrite(fgraph)``).
|
|
434
|
+
return _ActiveModeGraphRewriter(rewriter, self)
|
|
383
435
|
|
|
384
436
|
def get_linker_optimizer(self, linker, optimizer):
|
|
385
437
|
if isinstance(linker, str) or linker is None:
|
|
@@ -455,7 +507,7 @@ class Mode:
|
|
|
455
507
|
|
|
456
508
|
C = Mode("c", "fast_run")
|
|
457
509
|
CVM = Mode("cvm", "fast_run")
|
|
458
|
-
VM =
|
|
510
|
+
VM = Mode("vm", "fast_run")
|
|
459
511
|
|
|
460
512
|
NUMBA = Mode(
|
|
461
513
|
NumbaLinker(),
|
|
@@ -65,26 +65,6 @@ def _filter_mode(val):
|
|
|
65
65
|
)
|
|
66
66
|
|
|
67
67
|
|
|
68
|
-
def _split_version(version):
|
|
69
|
-
"""
|
|
70
|
-
Take version as a dot-separated string, return a tuple of int
|
|
71
|
-
"""
|
|
72
|
-
return tuple(int(i) for i in version.split("."))
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
def _warn_default(version):
|
|
76
|
-
"""
|
|
77
|
-
Return True iff we should warn about bugs fixed after a given version.
|
|
78
|
-
"""
|
|
79
|
-
if config.warn__ignore_bug_before == "None":
|
|
80
|
-
return True
|
|
81
|
-
if config.warn__ignore_bug_before == "all":
|
|
82
|
-
return False
|
|
83
|
-
if _split_version(config.warn__ignore_bug_before) >= _split_version(version):
|
|
84
|
-
return False
|
|
85
|
-
return True
|
|
86
|
-
|
|
87
|
-
|
|
88
68
|
def _is_valid_check_preallocated_output_param(param):
|
|
89
69
|
if not isinstance(param, str):
|
|
90
70
|
return False
|
|
@@ -591,47 +571,6 @@ def add_traceback_configvars():
|
|
|
591
571
|
|
|
592
572
|
|
|
593
573
|
def add_error_and_warning_configvars():
|
|
594
|
-
###
|
|
595
|
-
# To disable some warning about old bug that are fixed now.
|
|
596
|
-
###
|
|
597
|
-
config.add(
|
|
598
|
-
"warn__ignore_bug_before",
|
|
599
|
-
(
|
|
600
|
-
"If 'None', we warn about all PyTensor bugs found by default. "
|
|
601
|
-
"If 'all', we don't warn about PyTensor bugs found by default. "
|
|
602
|
-
"If a version, we print only the warnings relative to PyTensor "
|
|
603
|
-
"bugs found after that version. "
|
|
604
|
-
"Warning for specific bugs can be configured with specific "
|
|
605
|
-
"[warn] flags."
|
|
606
|
-
),
|
|
607
|
-
EnumStr(
|
|
608
|
-
"0.9",
|
|
609
|
-
[
|
|
610
|
-
"None",
|
|
611
|
-
"all",
|
|
612
|
-
"0.3",
|
|
613
|
-
"0.4",
|
|
614
|
-
"0.4.1",
|
|
615
|
-
"0.5",
|
|
616
|
-
"0.6",
|
|
617
|
-
"0.7",
|
|
618
|
-
"0.8",
|
|
619
|
-
"0.8.1",
|
|
620
|
-
"0.8.2",
|
|
621
|
-
"0.9",
|
|
622
|
-
"0.10",
|
|
623
|
-
"1.0",
|
|
624
|
-
"1.0.1",
|
|
625
|
-
"1.0.2",
|
|
626
|
-
"1.0.3",
|
|
627
|
-
"1.0.4",
|
|
628
|
-
"1.0.5",
|
|
629
|
-
],
|
|
630
|
-
mutable=False,
|
|
631
|
-
),
|
|
632
|
-
in_c_key=False,
|
|
633
|
-
)
|
|
634
|
-
|
|
635
574
|
# Note to developers:
|
|
636
575
|
# Generally your exceptions should use an apply node's __str__
|
|
637
576
|
# method when exception_verbosity == 'low'. When exception_verbosity
|
|
@@ -101,7 +101,6 @@ class PyTensorConfigParser:
|
|
|
101
101
|
traceback__limit: int
|
|
102
102
|
traceback__compile_limit: int
|
|
103
103
|
# add_error_and_warning_configvars
|
|
104
|
-
warn__ignore_bug_before: int
|
|
105
104
|
exception_verbosity: str
|
|
106
105
|
# add_testvalue_and_checking_configvars
|
|
107
106
|
check_input: bool
|
|
@@ -138,8 +137,6 @@ class PyTensorConfigParser:
|
|
|
138
137
|
optdb__max_use_ratio: float
|
|
139
138
|
cycle_detection: str
|
|
140
139
|
check_stack_trace: str
|
|
141
|
-
# add_metaopt_configvars
|
|
142
|
-
metaopt__verbose: int
|
|
143
140
|
# add_vm_configvars
|
|
144
141
|
profile: bool
|
|
145
142
|
profile_optimizer: bool
|
|
@@ -139,7 +139,7 @@ class DisconnectedType(Type):
|
|
|
139
139
|
" a symbolic placeholder."
|
|
140
140
|
)
|
|
141
141
|
|
|
142
|
-
def
|
|
142
|
+
def filter_variable(self, other):
|
|
143
143
|
raise AssertionError(
|
|
144
144
|
"If you're assigning to a DisconnectedType you're"
|
|
145
145
|
" doing something wrong. It should only be used as"
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import inspect
|
|
2
1
|
import sys
|
|
3
2
|
import time
|
|
4
3
|
import warnings
|
|
@@ -693,32 +692,8 @@ class Validator(Feature):
|
|
|
693
692
|
)
|
|
694
693
|
|
|
695
694
|
def validate(self, fgraph):
|
|
696
|
-
"""
|
|
697
|
-
If the caller is replace_all_validate, just raise the
|
|
698
|
-
exception. replace_all_validate will print out the
|
|
699
|
-
verbose output. Or it has to be done here before raise.
|
|
700
|
-
"""
|
|
701
695
|
t0 = time.perf_counter()
|
|
702
|
-
|
|
703
|
-
ret = fgraph.execute_callbacks("on_validate")
|
|
704
|
-
except Exception as e:
|
|
705
|
-
cf = inspect.currentframe()
|
|
706
|
-
uf = cf.f_back
|
|
707
|
-
uf_info = inspect.getframeinfo(uf)
|
|
708
|
-
|
|
709
|
-
# If the caller is replace_all_validate, just raise the
|
|
710
|
-
# exception. replace_all_validate will print out the
|
|
711
|
-
# verbose output.
|
|
712
|
-
# Or it has to be done here before raise.
|
|
713
|
-
if uf_info.function == "replace_all_validate":
|
|
714
|
-
raise
|
|
715
|
-
else:
|
|
716
|
-
verbose = uf.f_locals.get("verbose", False)
|
|
717
|
-
if verbose:
|
|
718
|
-
r = uf.f_locals.get("r", "")
|
|
719
|
-
reason = uf_info.function
|
|
720
|
-
print(f"validate failed on node {r}.\n Reason: {reason}, {e}") # noqa: T201
|
|
721
|
-
raise
|
|
696
|
+
ret = fgraph.execute_callbacks("on_validate")
|
|
722
697
|
t1 = time.perf_counter()
|
|
723
698
|
if fgraph.profile:
|
|
724
699
|
fgraph.profile.validate_time += t1 - t0
|
|
@@ -1119,7 +1119,7 @@ class OpToRewriterTracker:
|
|
|
1119
1119
|
else:
|
|
1120
1120
|
# An OpPattern without parameters behaves like a regular tracked_type
|
|
1121
1121
|
self.tracked_types[c.op_type].append(rw)
|
|
1122
|
-
|
|
1122
|
+
elif isinstance(c, type):
|
|
1123
1123
|
self.tracked_types[c].append(rw)
|
|
1124
1124
|
else:
|
|
1125
1125
|
self.tracked_instances[c].append(rw)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
from collections.abc import Generator, Iterable, Sequence
|
|
2
|
+
from typing import TYPE_CHECKING, Optional, cast
|
|
3
|
+
|
|
4
|
+
from pytensor.graph.basic import (
|
|
5
|
+
Apply,
|
|
6
|
+
Variable,
|
|
7
|
+
)
|
|
8
|
+
from pytensor.graph.fg import FunctionGraph, Output
|
|
9
|
+
from pytensor.graph.rewriting.db import RewriteDatabaseQuery
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from pytensor.graph.rewriting.basic import GraphRewriter
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def rewrite_graph(
|
|
17
|
+
graph: Variable | Sequence[Variable] | FunctionGraph,
|
|
18
|
+
include: Sequence[str] = ("canonicalize",),
|
|
19
|
+
custom_rewrite: Optional["GraphRewriter"] = None,
|
|
20
|
+
clone: bool = False,
|
|
21
|
+
**kwargs,
|
|
22
|
+
) -> Variable | Sequence[Variable] | FunctionGraph:
|
|
23
|
+
"""Easily apply rewrites to a graph.
|
|
24
|
+
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
graph
|
|
28
|
+
A `FunctionGraph` or `Variable` to be rewritten.
|
|
29
|
+
include
|
|
30
|
+
String names of the rewrites to be queried, via a
|
|
31
|
+
`RewriteDatabaseQuery` instance, and applied. The default rewrite
|
|
32
|
+
query string is ``"canonicalization"``.
|
|
33
|
+
custom_rewrite
|
|
34
|
+
A custom `Rewriter` to also be applied.
|
|
35
|
+
clone
|
|
36
|
+
Whether or not to clone the input graph before rewriting.
|
|
37
|
+
**kwargs
|
|
38
|
+
Keyword arguments passed to a `RewriteDatabaseQuery` object.
|
|
39
|
+
"""
|
|
40
|
+
from pytensor.compile import optdb
|
|
41
|
+
|
|
42
|
+
if isinstance(graph, FunctionGraph):
|
|
43
|
+
fgraph = graph
|
|
44
|
+
else:
|
|
45
|
+
outputs = [graph] if isinstance(graph, Variable) else graph
|
|
46
|
+
fgraph = FunctionGraph(outputs=outputs, clone=clone, copy_inputs=False)
|
|
47
|
+
|
|
48
|
+
query_rewrites = optdb.query(RewriteDatabaseQuery(include=include, **kwargs))
|
|
49
|
+
query_rewrites.rewrite(fgraph)
|
|
50
|
+
|
|
51
|
+
if custom_rewrite is not None:
|
|
52
|
+
custom_rewrite.rewrite(fgraph)
|
|
53
|
+
|
|
54
|
+
if isinstance(graph, FunctionGraph):
|
|
55
|
+
return fgraph
|
|
56
|
+
if isinstance(graph, Variable):
|
|
57
|
+
return fgraph.outputs[0]
|
|
58
|
+
return fgraph.outputs
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def rewrite_subgraph(
|
|
62
|
+
outputs: Sequence[Variable],
|
|
63
|
+
frontier: Iterable[Variable],
|
|
64
|
+
include: Sequence[str] = ("canonicalize",),
|
|
65
|
+
**kwargs,
|
|
66
|
+
) -> list[Variable]:
|
|
67
|
+
"""Rewrite the subgraph between ``frontier`` and ``outputs`` in isolation.
|
|
68
|
+
|
|
69
|
+
The ``frontier`` variables are temporarily detached from their owners, so
|
|
70
|
+
they act as inputs of the subgraph: rewrites can neither reach past them
|
|
71
|
+
nor modify the graph they belong to. This allows simplifying fresh
|
|
72
|
+
expressions that hang off the variables of an existing `FunctionGraph`
|
|
73
|
+
without mutating it behind its (and its features') back.
|
|
74
|
+
|
|
75
|
+
The rewrite is in place: ``outputs`` must not belong to a `FunctionGraph`.
|
|
76
|
+
|
|
77
|
+
Parameters
|
|
78
|
+
----------
|
|
79
|
+
outputs
|
|
80
|
+
The outputs of the subgraph to rewrite.
|
|
81
|
+
frontier
|
|
82
|
+
Variables at which the subgraph stops; every path from ``outputs``
|
|
83
|
+
into the surrounding graph must go through one of them.
|
|
84
|
+
include
|
|
85
|
+
Rewrite query names, as in `rewrite_graph`.
|
|
86
|
+
**kwargs
|
|
87
|
+
Keyword arguments passed to `rewrite_graph`.
|
|
88
|
+
"""
|
|
89
|
+
saved_owners = [(v, v.owner, v.index) for v in frontier]
|
|
90
|
+
for v, _, _ in saved_owners:
|
|
91
|
+
v.owner = None
|
|
92
|
+
try:
|
|
93
|
+
rewritten = cast(
|
|
94
|
+
Sequence[Variable],
|
|
95
|
+
rewrite_graph(list(outputs), include=include, clone=False, **kwargs),
|
|
96
|
+
)
|
|
97
|
+
return list(rewritten)
|
|
98
|
+
finally:
|
|
99
|
+
for v, owner, idx in saved_owners:
|
|
100
|
+
v.owner = owner
|
|
101
|
+
v.index = idx
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def get_clients_at_depth(
|
|
105
|
+
fgraph: FunctionGraph, node: Apply, depth: int
|
|
106
|
+
) -> Generator[Apply, None, None]:
|
|
107
|
+
"""Yields node clients at given depth."""
|
|
108
|
+
for var in node.outputs:
|
|
109
|
+
if depth > 0:
|
|
110
|
+
for out_node, _ in fgraph.clients[var]:
|
|
111
|
+
if isinstance(out_node.op, Output):
|
|
112
|
+
continue
|
|
113
|
+
yield from get_clients_at_depth(fgraph, out_node, depth - 1)
|
|
114
|
+
else:
|
|
115
|
+
assert var.owner is not None
|
|
116
|
+
yield var.owner
|
|
@@ -96,34 +96,6 @@ class Type(MetaObject, Generic[D]): # noqa: UP046
|
|
|
96
96
|
|
|
97
97
|
"""
|
|
98
98
|
|
|
99
|
-
def filter_inplace(
|
|
100
|
-
self,
|
|
101
|
-
value: Any,
|
|
102
|
-
storage: Any,
|
|
103
|
-
strict: bool = False,
|
|
104
|
-
allow_downcast: bool | None = None,
|
|
105
|
-
):
|
|
106
|
-
"""Return data or an appropriately wrapped/converted data by converting it in-place.
|
|
107
|
-
|
|
108
|
-
This method allows one to reuse old allocated memory. If this method
|
|
109
|
-
is implemented, it will be called instead of `Type.filter`.
|
|
110
|
-
|
|
111
|
-
As of now, this method is not implemented and was previously used for transferring memory to and from GPU.
|
|
112
|
-
|
|
113
|
-
Parameters
|
|
114
|
-
----------
|
|
115
|
-
value: array-like
|
|
116
|
-
storage: array-like
|
|
117
|
-
The old value (e.g. the old NumPy array)
|
|
118
|
-
strict: bool
|
|
119
|
-
allow_downcast: bool (optional)
|
|
120
|
-
|
|
121
|
-
Raises
|
|
122
|
-
------
|
|
123
|
-
NotImplementedError
|
|
124
|
-
"""
|
|
125
|
-
raise NotImplementedError()
|
|
126
|
-
|
|
127
99
|
def filter_variable(
|
|
128
100
|
self, other: Variable | D, allow_convert: bool = True
|
|
129
101
|
) -> variable_type:
|
|
@@ -97,13 +97,7 @@ class Container:
|
|
|
97
97
|
if self.allow_downcast is not None:
|
|
98
98
|
kwargs["allow_downcast"] = self.allow_downcast
|
|
99
99
|
|
|
100
|
-
|
|
101
|
-
# Use in-place filtering when/if possible
|
|
102
|
-
self.storage[0] = self.type.filter_inplace(
|
|
103
|
-
value, self.storage[0], **kwargs
|
|
104
|
-
)
|
|
105
|
-
except NotImplementedError:
|
|
106
|
-
self.storage[0] = self.type.filter(value, **kwargs)
|
|
100
|
+
self.storage[0] = self.type.filter(value, **kwargs)
|
|
107
101
|
|
|
108
102
|
except Exception as e:
|
|
109
103
|
e.args = (*e.args, f'Container name "{self.name}"')
|
|
@@ -58,15 +58,6 @@ def is_StdLibDirsAndLibsType(
|
|
|
58
58
|
return cast(StdLibDirsAndLibsType, fn)
|
|
59
59
|
|
|
60
60
|
|
|
61
|
-
class GCCLLVMType(Protocol):
|
|
62
|
-
is_llvm: bool | None
|
|
63
|
-
__call__: Callable[[], bool | None]
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def is_GCCLLVMType(fn: Callable[[], bool | None]) -> GCCLLVMType:
|
|
67
|
-
return cast(GCCLLVMType, fn)
|
|
68
|
-
|
|
69
|
-
|
|
70
61
|
_logger = logging.getLogger("pytensor.link.c.cmodule")
|
|
71
62
|
|
|
72
63
|
METH_VARARGS = "METH_VARARGS"
|
|
@@ -262,10 +253,7 @@ def _get_ext_suffix():
|
|
|
262
253
|
"""Get the suffix for compiled extensions"""
|
|
263
254
|
from setuptools._distutils.sysconfig import get_config_var
|
|
264
255
|
|
|
265
|
-
|
|
266
|
-
if dist_suffix is None:
|
|
267
|
-
dist_suffix = get_config_var("SO")
|
|
268
|
-
return dist_suffix
|
|
256
|
+
return get_config_var("EXT_SUFFIX")
|
|
269
257
|
|
|
270
258
|
|
|
271
259
|
def add_gcc_dll_directory() -> AbstractContextManager[None]:
|
|
@@ -1817,33 +1805,6 @@ def std_lib_dirs():
|
|
|
1817
1805
|
return std_lib_dirs_and_libs()[1]
|
|
1818
1806
|
|
|
1819
1807
|
|
|
1820
|
-
@is_GCCLLVMType
|
|
1821
|
-
def gcc_llvm() -> bool | None:
|
|
1822
|
-
"""
|
|
1823
|
-
Detect if the g++ version used is the llvm one or not.
|
|
1824
|
-
|
|
1825
|
-
It don't support all g++ parameters even if it support many of them.
|
|
1826
|
-
|
|
1827
|
-
"""
|
|
1828
|
-
if gcc_llvm.is_llvm is None:
|
|
1829
|
-
try:
|
|
1830
|
-
p_out = output_subprocess_Popen([config.cxx, "--version"])
|
|
1831
|
-
output = p_out[0] + p_out[1]
|
|
1832
|
-
except OSError:
|
|
1833
|
-
# Typically means g++ cannot be found.
|
|
1834
|
-
# So it is not an llvm compiler.
|
|
1835
|
-
|
|
1836
|
-
# Normally this should not happen as we should not try to
|
|
1837
|
-
# compile when g++ is not available. If this happen, it
|
|
1838
|
-
# will crash later so supposing it is not llvm is "safe".
|
|
1839
|
-
output = b""
|
|
1840
|
-
gcc_llvm.is_llvm = b"llvm" in output
|
|
1841
|
-
return gcc_llvm.is_llvm
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
gcc_llvm.is_llvm = None
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
1808
|
class Compiler:
|
|
1848
1809
|
"""
|
|
1849
1810
|
Meta compiler that offer some generic function.
|