pytensor 2.24.1__tar.gz → 2.24.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pytensor-2.24.1/pytensor.egg-info → pytensor-2.24.2}/PKG-INFO +2 -1
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/gradients.rst +10 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pyproject.toml +2 -1
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/_version.py +3 -3
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/gradient.py +80 -1
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/basic.py +4 -1
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/nlinalg.py +5 -6
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/pytorch/dispatch/basic.py +17 -1
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/pkl_utils.py +1 -1
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scalar/basic.py +1 -0
- pytensor-2.24.2/pytensor/scalar/c_code/incbet.c +311 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scalar/math.py +19 -2
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/basic.py +11 -8
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/basic.py +73 -48
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/extra_ops.py +3 -3
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/math.py +86 -11
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/op.py +4 -5
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/rewriting/basic.py +4 -1
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/utils.py +11 -7
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/math.py +2 -2
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/shape.py +31 -5
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/subtensor.py +109 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/shape.py +4 -4
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/slinalg.py +4 -4
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/subtensor.py +8 -3
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/utils.py +3 -2
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/variable.py +4 -2
- {pytensor-2.24.1 → pytensor-2.24.2/pytensor.egg-info}/PKG-INFO +2 -1
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor.egg-info/SOURCES.txt +1 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor.egg-info/requires.txt +1 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/tests/test_gradient.py +39 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/LICENSE.txt +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/MANIFEST.in +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/README.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/.templates/PLACEHOLDER +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/.templates/layout.html +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/LICENSE.txt +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/README.md +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/acknowledgement.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/bcast.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/bcast.svg +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/conf.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/core_development_guide.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/css.inc +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/dev_start_guide.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/environment.yml +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/apply.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/apply.svg +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/apply2.svg +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/creating_a_c_op.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/creating_a_numba_jax_op.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/creating_an_op.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/ctype.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/extending_faq.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/extending_pytensor_solution_1.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/graph_rewriting.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/graphstructures.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/index.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/inplace.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/op.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/other_ops.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/pics/symbolic_graph_opt.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/pics/symbolic_graph_unopt.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/pipeline.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/scan.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/tips.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/type.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/unittest.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/extending/using_params.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/faq.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/generate_dtype_tensor_table.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/glossary.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/images/Elman_srnn.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/images/PyTensor_RGB.svg +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/images/blocksparse.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/images/lstm.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/images/lstm_memorycell.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/images/talk2010.gif +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/images/talk2010.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/index.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/install.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/internal/how_to_release.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/internal/index.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/internal/metadocumentation.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/introduction.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/debugmode.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/function.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/index.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/io.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/mode.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/nanguardmode.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/opfromgraph.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/ops.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/profilemode.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/compile/shared.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/config.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/d3viz/css/d3viz.css +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/d3viz/js/d3viz.js +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/mlp.html +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/mlp.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/mlp2.html +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/mlp2.pdf +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/mlp2.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/ofg.html +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/examples/ofg2.html +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/index.ipynb +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/index.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/index_files/index_10_0.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/index_files/index_11_0.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/index_files/index_24_0.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/d3viz/index_files/index_25_0.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/gradient.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/graph/features.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/graph/fgraph.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/graph/graph.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/graph/index.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/graph/op.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/graph/type.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/graph/utils.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/index.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/misc/pkl_utils.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/printing.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/sandbox/index.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/sandbox/linalg.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/scalar/index.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/scan.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/sparse/index.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/sparse/sandbox.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/basic.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/basic_opt.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/bcast.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/bcast.svg +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/conv.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/elemwise.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/extra_ops.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/fft.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/index.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/io.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/math_opt.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/nlinalg.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/plot_fft.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/random/basic.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/random/index.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/random/utils.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/slinalg.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/tensor/utils.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/library/typed_list.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/links.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/optimizations.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/pylintrc +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/ccodegen.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/compilation.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/debugging_with_stepmode.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/elemwise_compiler.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/function.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/functional.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/how_to_make_ops.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/index.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/index2.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/interactive_debugger.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/logistic_regression_example.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/performance.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/randomnumbers.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/rethinkccodegen.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/sandbox.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/software.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/sparse.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/sandbox/tensoroptools.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/troubleshooting.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/adding.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/adding_solution_1.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/aliasing.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/apply.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/apply.svg +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/bcast.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/broadcasting.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/conditions.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/debug_faq.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/dlogistic.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/examples.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/faq_tutorial.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/index.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/loading_and_saving.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/logistic.gp +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/logistic.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/loop.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/loop_solution_1.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/modes.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/modes_solution_1.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/multi_cores.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/nan_tutorial.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/pics/d3viz.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/pics/logreg_pydotprint_predict.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/pics/logreg_pydotprint_prediction.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/pics/logreg_pydotprint_train.png +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/printing_drawing.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/profiling.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/profiling_example.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/profiling_example_out.prof +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/shape_info.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/sparse.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/tutorial/symbolic_graphs.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/doc/user_guide.rst +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/bin/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/bin/pytensor_cache.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/breakpoint.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/builders.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/compiledir.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/compilelock.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/debugmode.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/function/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/function/pfunc.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/function/types.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/io.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/mode.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/monitormode.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/nanguardmode.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/ops.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/profiling.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/compile/sharedvalue.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/configdefaults.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/configparser.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/css/d3-context-menu.css +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/css/d3viz.css +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/d3viz.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/formatting.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/js/d3-context-menu.js +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/js/d3.v3.min.js +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/js/d3viz.js +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/js/dagre-d3.min.js +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/d3viz/js/graphlib-dot.min.js +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/destroyhandler.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/features.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/fg.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/null_type.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/op.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/replace.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/rewriting/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/rewriting/basic.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/rewriting/db.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/rewriting/kanren.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/rewriting/unify.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/rewriting/utils.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/type.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/graph/utils.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/ifelse.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/basic.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/basic.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/c_code/lazylinker_c.c +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/c_code/pytensor_mod_helper.h +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/cmodule.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/cutils.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/cvm.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/exceptions.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/interface.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/lazylinker_c.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/op.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/params_type.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/c/type.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/basic.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/blockwise.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/elemwise.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/extra_ops.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/random.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/scalar.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/scan.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/shape.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/slinalg.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/sort.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/sparse.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/subtensor.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/dispatch/tensor_basic.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/jax/linker.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/basic.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/cython_support.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/elemwise.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/extra_ops.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/nlinalg.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/random.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/scalar.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/scan.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/slinalg.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/sparse.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/subtensor.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/tensor_basic.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/dispatch/vectorize_codegen.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/numba/linker.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/pytorch/dispatch/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/pytorch/dispatch/elemwise.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/pytorch/dispatch/extra_ops.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/pytorch/dispatch/scalar.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/pytorch/linker.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/utils.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/link/vm.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/check_blas.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/check_blas_many.sh +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/check_duplicate_key.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/elemwise_openmp_speedup.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/elemwise_time_test.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/frozendict.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/may_share_memory.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/ordered_set.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/misc/safe_asarray.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/printing.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/py.typed +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/raise_op.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scalar/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scalar/c_code/Faddeeva.cc +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scalar/c_code/Faddeeva.hh +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scalar/c_code/gamma.c +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scalar/loop.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scalar/sharedvar.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/basic.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/checkpoints.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/op.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/rewriting.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/scan_perform.pyx +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/scan_perform_ext.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/utils.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/scan/views.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/rewriting.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/sandbox/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/sandbox/sp.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/sandbox/sp2.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/sharedvar.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/type.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/sparse/utils.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/blas.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/blas_c.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/blas_headers.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/blas_scipy.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/blockwise.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/c_code/alt_blas_common.h +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/c_code/alt_blas_template.c +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/c_code/dimshuffle.c +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/conv/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/conv/abstract_conv.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/elemwise.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/elemwise_cgen.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/exceptions.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/fft.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/fourier.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/functional.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/inplace.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/io.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/linalg.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/nlinalg.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/basic.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/rewriting/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/rewriting/jax.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/rewriting/numba.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/type.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/random/var.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/basic.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/blas.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/blas_c.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/blas_scipy.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/blockwise.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/elemwise.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/extra_ops.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/jax.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/linalg.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/special.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/rewriting/uncanonicalize.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/sharedvar.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/sort.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/special.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/type.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/type_other.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/var.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/tensor/xlogx.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/typed_list/__init__.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/typed_list/basic.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/typed_list/rewriting.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/typed_list/type.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/updates.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/utils.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor/version.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor.egg-info/dependency_links.txt +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor.egg-info/entry_points.txt +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/pytensor.egg-info/top_level.txt +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/scripts/mypy-failing.txt +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/setup.cfg +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/setup.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/tests/link/c/c_code/test_cenum.h +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/tests/link/c/c_code/test_quadratic_function.c +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/tests/tensor/conv/c_code/corr3d_gemm.c +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/tests/tensor/conv/c_code/corr_gemm.c +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/tests/test_breakpoint.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/tests/test_config.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/tests/test_ifelse.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/tests/test_printing.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/tests/test_raise_op.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/tests/test_rop.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/tests/test_updates.py +0 -0
- {pytensor-2.24.1 → pytensor-2.24.2}/versioneer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pytensor
|
|
3
|
-
Version: 2.24.
|
|
3
|
+
Version: 2.24.2
|
|
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: .. _license:
|
|
@@ -94,6 +94,7 @@ Requires-Dist: pytest-cov>=2.6.1; extra == "tests"
|
|
|
94
94
|
Requires-Dist: coverage>=5.1; extra == "tests"
|
|
95
95
|
Requires-Dist: pytest-benchmark; extra == "tests"
|
|
96
96
|
Requires-Dist: pytest-mock; extra == "tests"
|
|
97
|
+
Requires-Dist: pytest-sphinx; extra == "tests"
|
|
97
98
|
Provides-Extra: rtd
|
|
98
99
|
Requires-Dist: sphinx<6,>=5.1.0; extra == "rtd"
|
|
99
100
|
Requires-Dist: pygments; extra == "rtd"
|
|
@@ -267,6 +267,16 @@ or, making use of the R-operator:
|
|
|
267
267
|
>>> f([4, 4], [2, 2])
|
|
268
268
|
array([ 4., 4.])
|
|
269
269
|
|
|
270
|
+
There is a builtin helper that uses the first method
|
|
271
|
+
|
|
272
|
+
>>> x = pt.dvector('x')
|
|
273
|
+
>>> v = pt.dvector('v')
|
|
274
|
+
>>> y = pt.sum(x ** 2)
|
|
275
|
+
>>> Hv = pytensor.gradient.hessian_vector_product(y, x, v)
|
|
276
|
+
>>> f = pytensor.function([x, v], Hv)
|
|
277
|
+
>>> f([4, 4], [2, 2])
|
|
278
|
+
array([ 4., 4.])
|
|
279
|
+
|
|
270
280
|
|
|
271
281
|
Final Pointers
|
|
272
282
|
==============
|
|
@@ -75,6 +75,7 @@ tests = [
|
|
|
75
75
|
"coverage>=5.1",
|
|
76
76
|
"pytest-benchmark",
|
|
77
77
|
"pytest-mock",
|
|
78
|
+
"pytest-sphinx",
|
|
78
79
|
]
|
|
79
80
|
rtd = ["sphinx>=5.1.0,<6", "pygments", "pydot", "pydot2", "pydot-ng"]
|
|
80
81
|
jax = ["jax", "jaxlib"]
|
|
@@ -116,7 +117,7 @@ versionfile_build = "pytensor/_version.py"
|
|
|
116
117
|
tag_prefix = "rel-"
|
|
117
118
|
|
|
118
119
|
[tool.pytest]
|
|
119
|
-
addopts = "--durations=50"
|
|
120
|
+
addopts = "--durations=50 --doctest-modules pytensor --ignore=pytensor/misc/check_duplicate_key.py --ignore=pytensor/link"
|
|
120
121
|
testpaths = "tests/"
|
|
121
122
|
|
|
122
123
|
[tool.ruff]
|
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2024-07-
|
|
11
|
+
"date": "2024-07-08T14:11:01+0200",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "2.24.
|
|
14
|
+
"full-revisionid": "7f623fefbed89442737fd6d8ba11c32d2eab65ed",
|
|
15
|
+
"version": "2.24.2"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -2050,6 +2050,85 @@ def hessian(cost, wrt, consider_constant=None, disconnected_inputs="raise"):
|
|
|
2050
2050
|
return as_list_or_tuple(using_list, using_tuple, hessians)
|
|
2051
2051
|
|
|
2052
2052
|
|
|
2053
|
+
def hessian_vector_product(cost, wrt, p, **grad_kwargs):
|
|
2054
|
+
"""Return the expression of the Hessian times a vector p.
|
|
2055
|
+
|
|
2056
|
+
Notes
|
|
2057
|
+
-----
|
|
2058
|
+
This function uses backward autodiff twice to obtain the desired expression.
|
|
2059
|
+
You may want to manually build the equivalent expression by combining backward
|
|
2060
|
+
followed by forward (if all Ops support it) autodiff.
|
|
2061
|
+
See {ref}`docs/_tutcomputinggrads#Hessian-times-a-Vector` for how to do this.
|
|
2062
|
+
|
|
2063
|
+
Parameters
|
|
2064
|
+
----------
|
|
2065
|
+
cost: Scalar (0-dimensional) variable.
|
|
2066
|
+
wrt: Vector (1-dimensional tensor) 'Variable' or list of Vectors
|
|
2067
|
+
p: Vector (1-dimensional tensor) 'Variable' or list of Vectors
|
|
2068
|
+
Each vector will be used for the hessp wirt to exach input variable
|
|
2069
|
+
**grad_kwargs:
|
|
2070
|
+
Keyword arguments passed to `grad` function.
|
|
2071
|
+
|
|
2072
|
+
Returns
|
|
2073
|
+
-------
|
|
2074
|
+
:class:` Vector or list of Vectors
|
|
2075
|
+
The Hessian times p of the `cost` with respect to (elements of) `wrt`.
|
|
2076
|
+
|
|
2077
|
+
Examples
|
|
2078
|
+
--------
|
|
2079
|
+
|
|
2080
|
+
.. testcode::
|
|
2081
|
+
|
|
2082
|
+
import numpy as np
|
|
2083
|
+
from scipy.optimize import minimize
|
|
2084
|
+
from pytensor import function
|
|
2085
|
+
from pytensor.tensor import vector
|
|
2086
|
+
from pytensor.gradient import grad, hessian_vector_product
|
|
2087
|
+
|
|
2088
|
+
x = vector('x')
|
|
2089
|
+
p = vector('p')
|
|
2090
|
+
|
|
2091
|
+
rosen = (100 * (x[1:] - x[:-1] ** 2) ** 2 + (1 - x[:-1]) ** 2).sum()
|
|
2092
|
+
rosen_jac = grad(rosen, x)
|
|
2093
|
+
rosen_hessp = hessian_vector_product(rosen, x, p)
|
|
2094
|
+
|
|
2095
|
+
rosen_fn = function([x], rosen)
|
|
2096
|
+
rosen_jac_fn = function([x], rosen_jac)
|
|
2097
|
+
rosen_hessp_fn = function([x, p], rosen_hessp)
|
|
2098
|
+
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
|
|
2099
|
+
res = minimize(
|
|
2100
|
+
rosen_fn,
|
|
2101
|
+
x0,
|
|
2102
|
+
method="Newton-CG",
|
|
2103
|
+
jac=rosen_jac_fn,
|
|
2104
|
+
hessp=rosen_hessp_fn,
|
|
2105
|
+
options={"xtol": 1e-8},
|
|
2106
|
+
)
|
|
2107
|
+
print(res.x)
|
|
2108
|
+
|
|
2109
|
+
.. testoutput::
|
|
2110
|
+
|
|
2111
|
+
[1. 1. 1. 0.99999999 0.99999999]
|
|
2112
|
+
|
|
2113
|
+
|
|
2114
|
+
|
|
2115
|
+
"""
|
|
2116
|
+
wrt_list = wrt if isinstance(wrt, Sequence) else [wrt]
|
|
2117
|
+
p_list = p if isinstance(p, Sequence) else [p]
|
|
2118
|
+
grad_wrt_list = grad(cost, wrt=wrt_list, **grad_kwargs)
|
|
2119
|
+
hessian_cost = pytensor.tensor.add(
|
|
2120
|
+
*[
|
|
2121
|
+
(grad_wrt * p).sum()
|
|
2122
|
+
for grad_wrt, p in zip(grad_wrt_list, p_list, strict=True)
|
|
2123
|
+
]
|
|
2124
|
+
)
|
|
2125
|
+
Hp_list = grad(hessian_cost, wrt=wrt_list, **grad_kwargs)
|
|
2126
|
+
|
|
2127
|
+
if isinstance(wrt, Variable):
|
|
2128
|
+
return Hp_list[0]
|
|
2129
|
+
return Hp_list
|
|
2130
|
+
|
|
2131
|
+
|
|
2053
2132
|
def _is_zero(x):
|
|
2054
2133
|
"""
|
|
2055
2134
|
Returns 'yes', 'no', or 'maybe' indicating whether x
|
|
@@ -2241,7 +2320,7 @@ def grad_clip(x, lower_bound, upper_bound):
|
|
|
2241
2320
|
>>> z2 = pytensor.gradient.grad(x**2, x)
|
|
2242
2321
|
>>> f = pytensor.function([x], outputs = [z, z2])
|
|
2243
2322
|
>>> print(f(2.0))
|
|
2244
|
-
[array(1.
|
|
2323
|
+
[array(1.), array(4.)]
|
|
2245
2324
|
|
|
2246
2325
|
Notes
|
|
2247
2326
|
-----
|
|
@@ -1034,7 +1034,10 @@ def orphans_between(
|
|
|
1034
1034
|
|
|
1035
1035
|
Examples
|
|
1036
1036
|
--------
|
|
1037
|
-
>>>
|
|
1037
|
+
>>> from pytensor.graph.basic import orphans_between
|
|
1038
|
+
>>> from pytensor.tensor import scalars
|
|
1039
|
+
>>> x, y = scalars("xy")
|
|
1040
|
+
>>> list(orphans_between([x], [(x+y)]))
|
|
1038
1041
|
[y]
|
|
1039
1042
|
|
|
1040
1043
|
"""
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import jax.numpy as jnp
|
|
2
|
+
import numpy as np
|
|
2
3
|
|
|
3
4
|
from pytensor.link.jax.dispatch import jax_funcify
|
|
4
5
|
from pytensor.tensor.blas import BatchedDot
|
|
@@ -137,12 +138,10 @@ def jax_funcify_Argmax(op, **kwargs):
|
|
|
137
138
|
|
|
138
139
|
# NumPy does not support multiple axes for argmax; this is a
|
|
139
140
|
# work-around
|
|
140
|
-
keep_axes =
|
|
141
|
-
[i for i in range(x.ndim) if i not in axes], dtype="int64"
|
|
142
|
-
)
|
|
141
|
+
keep_axes = np.array([i for i in range(x.ndim) if i not in axes], dtype="int64")
|
|
143
142
|
# Not-reduced axes in front
|
|
144
143
|
transposed_x = jnp.transpose(
|
|
145
|
-
x,
|
|
144
|
+
x, tuple(np.concatenate((keep_axes, np.array(axes, dtype="int64"))))
|
|
146
145
|
)
|
|
147
146
|
kept_shape = transposed_x.shape[: len(keep_axes)]
|
|
148
147
|
reduced_shape = transposed_x.shape[len(keep_axes) :]
|
|
@@ -151,9 +150,9 @@ def jax_funcify_Argmax(op, **kwargs):
|
|
|
151
150
|
# Otherwise reshape would complain citing float arg
|
|
152
151
|
new_shape = (
|
|
153
152
|
*kept_shape,
|
|
154
|
-
|
|
153
|
+
np.prod(np.array(reduced_shape, dtype="int64"), dtype="int64"),
|
|
155
154
|
)
|
|
156
|
-
reshaped_x = transposed_x.reshape(new_shape)
|
|
155
|
+
reshaped_x = transposed_x.reshape(tuple(new_shape))
|
|
157
156
|
|
|
158
157
|
max_idx_res = jnp.argmax(reshaped_x, axis=-1).astype("int64")
|
|
159
158
|
|
|
@@ -6,7 +6,7 @@ from pytensor.compile.ops import DeepCopyOp
|
|
|
6
6
|
from pytensor.graph.fg import FunctionGraph
|
|
7
7
|
from pytensor.link.utils import fgraph_to_python
|
|
8
8
|
from pytensor.raise_op import CheckAndRaise
|
|
9
|
-
from pytensor.tensor.basic import Alloc, AllocEmpty, ARange, Join
|
|
9
|
+
from pytensor.tensor.basic import Alloc, AllocEmpty, ARange, Eye, Join
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
@singledispatch
|
|
@@ -100,3 +100,19 @@ def pytorch_funcify_Join(op, **kwargs):
|
|
|
100
100
|
return torch.cat(tensors, dim=axis)
|
|
101
101
|
|
|
102
102
|
return join
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@pytorch_funcify.register(Eye)
|
|
106
|
+
def pytorch_funcify_eye(op, **kwargs):
|
|
107
|
+
torch_dtype = getattr(torch, op.dtype)
|
|
108
|
+
|
|
109
|
+
def eye(N, M, k):
|
|
110
|
+
major, minor = (M, N) if k > 0 else (N, M)
|
|
111
|
+
k_abs = torch.abs(k)
|
|
112
|
+
zeros = torch.zeros(N, M, dtype=torch_dtype)
|
|
113
|
+
if k_abs < major:
|
|
114
|
+
l_ones = torch.min(major - k_abs, minor)
|
|
115
|
+
return zeros.diagonal_scatter(torch.ones(l_ones, dtype=torch_dtype), k)
|
|
116
|
+
return zeros
|
|
117
|
+
|
|
118
|
+
return eye
|
|
@@ -239,7 +239,7 @@ def dump(
|
|
|
239
239
|
>>> foo_2 = pytensor.shared(1, name='foo')
|
|
240
240
|
>>> with open('model.zip', 'wb') as f:
|
|
241
241
|
... dump((foo_1, foo_2, np.array(2)), f)
|
|
242
|
-
>>> np.load('model.zip').keys()
|
|
242
|
+
>>> list(np.load('model.zip').keys())
|
|
243
243
|
['foo', 'foo_2', 'array_0', 'pkl']
|
|
244
244
|
>>> np.load('model.zip')['foo']
|
|
245
245
|
array(0)
|
|
@@ -208,6 +208,7 @@ class autocast_float_as:
|
|
|
208
208
|
|
|
209
209
|
Examples
|
|
210
210
|
--------
|
|
211
|
+
>>> from pytensor.tensor import fvector
|
|
211
212
|
>>> with autocast_float_as('float32'):
|
|
212
213
|
... assert (fvector() + 1.1).dtype == 'float32' # temporary downcasting
|
|
213
214
|
>>> assert (fvector() + 1.1).dtype == 'float64' # back to default behaviour
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/* adapted from file incbet.c, obtained from the Cephes library (MIT License)
|
|
2
|
+
Cephes Math Library, Release 2.8: June, 2000
|
|
3
|
+
Copyright 1984, 1995, 2000 by Stephen L. Moshier
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
//For GPU support
|
|
7
|
+
#ifdef __CUDACC__
|
|
8
|
+
#define DEVICE __device__
|
|
9
|
+
#else
|
|
10
|
+
#define DEVICE
|
|
11
|
+
#endif
|
|
12
|
+
|
|
13
|
+
#include <float.h>
|
|
14
|
+
#include <math.h>
|
|
15
|
+
#include <stdio.h>
|
|
16
|
+
#include <numpy/npy_math.h>
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
#define MINLOG -170.0
|
|
20
|
+
#define MAXLOG +170.0
|
|
21
|
+
#define MAXGAM 171.624376956302725
|
|
22
|
+
#define EPSILON 2.2204460492503131e-16
|
|
23
|
+
|
|
24
|
+
DEVICE static double pseries(double, double, double);
|
|
25
|
+
DEVICE static double incbcf(double, double, double);
|
|
26
|
+
DEVICE static double incbd(double, double, double);
|
|
27
|
+
|
|
28
|
+
static double big = 4.503599627370496e15;
|
|
29
|
+
static double biginv = 2.22044604925031308085e-16;
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
DEVICE double BetaInc(double a, double b, double x)
|
|
33
|
+
{
|
|
34
|
+
double xc, y, w, t;
|
|
35
|
+
/* check function arguments */
|
|
36
|
+
if (a <= 0.0) return NPY_NAN;
|
|
37
|
+
if (b <= 0.0) return NPY_NAN;
|
|
38
|
+
if (x < 0.0) return NPY_NAN;
|
|
39
|
+
if (1.0 < x) return NPY_NAN;
|
|
40
|
+
|
|
41
|
+
/* some special cases */
|
|
42
|
+
if (x == 0.0) return 0.0;
|
|
43
|
+
if (x == 1.0) return 1.0;
|
|
44
|
+
|
|
45
|
+
if ( (b * x) <= 1.0 && x <= 0.95)
|
|
46
|
+
{
|
|
47
|
+
return pseries(a, b, x);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
xc = 1.0 - x;
|
|
51
|
+
/* reverse a and b if x is greater than the mean */
|
|
52
|
+
if (x > (a / (a + b)))
|
|
53
|
+
{
|
|
54
|
+
t = BetaInc(b, a, xc);
|
|
55
|
+
if (t <= EPSILON) return 1.0 - EPSILON;
|
|
56
|
+
return 1.0 - t;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* Choose expansion for better convergence. */
|
|
60
|
+
y = x * (a+b-2.0) - (a-1.0);
|
|
61
|
+
if( y < 0.0 )
|
|
62
|
+
w = incbcf( a, b, x );
|
|
63
|
+
else
|
|
64
|
+
w = incbd( a, b, x ) / xc;
|
|
65
|
+
|
|
66
|
+
y = a * log(x);
|
|
67
|
+
t = b * log(xc);
|
|
68
|
+
if( (a+b) < MAXGAM && fabs(y) < MAXLOG && fabs(t) < MAXLOG )
|
|
69
|
+
{
|
|
70
|
+
t = pow(xc, b);
|
|
71
|
+
t *= pow(x, a);
|
|
72
|
+
t /= a;
|
|
73
|
+
t *= w;
|
|
74
|
+
t *= tgamma(a + b) / (tgamma(a) * tgamma(b));
|
|
75
|
+
|
|
76
|
+
return t;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* Resort to logarithms. */
|
|
80
|
+
y += t + lgamma(a+b) - lgamma(a) - lgamma(b);
|
|
81
|
+
y += log(w / a);
|
|
82
|
+
if( y < MINLOG )
|
|
83
|
+
t = 0.0;
|
|
84
|
+
else
|
|
85
|
+
t = exp(y);
|
|
86
|
+
|
|
87
|
+
return t;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* Continued fraction expansion #1
|
|
91
|
+
* for incomplete beta integral
|
|
92
|
+
*/
|
|
93
|
+
|
|
94
|
+
DEVICE static double incbcf(double a, double b, double x)
|
|
95
|
+
{
|
|
96
|
+
double xk, pk, pkm1, pkm2, qk, qkm1, qkm2;
|
|
97
|
+
double k1, k2, k3, k4, k5, k6, k7, k8;
|
|
98
|
+
double r, t, ans, thresh;
|
|
99
|
+
int n;
|
|
100
|
+
|
|
101
|
+
k1 = a;
|
|
102
|
+
k2 = a + b;
|
|
103
|
+
k3 = a;
|
|
104
|
+
k4 = a + 1.0;
|
|
105
|
+
k5 = 1.0;
|
|
106
|
+
k6 = b - 1.0;
|
|
107
|
+
k7 = k4;
|
|
108
|
+
k8 = a + 2.0;
|
|
109
|
+
|
|
110
|
+
pkm2 = 0.0;
|
|
111
|
+
qkm2 = 1.0;
|
|
112
|
+
pkm1 = 1.0;
|
|
113
|
+
qkm1 = 1.0;
|
|
114
|
+
ans = 1.0;
|
|
115
|
+
r = 1.0;
|
|
116
|
+
n = 0;
|
|
117
|
+
thresh = 3.0 * EPSILON;
|
|
118
|
+
do
|
|
119
|
+
{
|
|
120
|
+
|
|
121
|
+
xk = -( x * k1 * k2 ) / ( k3 * k4 );
|
|
122
|
+
pk = pkm1 + pkm2 * xk;
|
|
123
|
+
qk = qkm1 + qkm2 * xk;
|
|
124
|
+
pkm2 = pkm1;
|
|
125
|
+
pkm1 = pk;
|
|
126
|
+
qkm2 = qkm1;
|
|
127
|
+
qkm1 = qk;
|
|
128
|
+
|
|
129
|
+
xk = ( x * k5 * k6 ) / ( k7 * k8 );
|
|
130
|
+
pk = pkm1 + pkm2 * xk;
|
|
131
|
+
qk = qkm1 + qkm2 * xk;
|
|
132
|
+
pkm2 = pkm1;
|
|
133
|
+
pkm1 = pk;
|
|
134
|
+
qkm2 = qkm1;
|
|
135
|
+
qkm1 = qk;
|
|
136
|
+
|
|
137
|
+
if( qk != 0.0 )
|
|
138
|
+
r = pk/qk;
|
|
139
|
+
if( r != 0.0 )
|
|
140
|
+
{
|
|
141
|
+
t = fabs( (ans - r) / r );
|
|
142
|
+
ans = r;
|
|
143
|
+
}
|
|
144
|
+
else
|
|
145
|
+
t = 1.0;
|
|
146
|
+
|
|
147
|
+
if( t < thresh )
|
|
148
|
+
break;
|
|
149
|
+
|
|
150
|
+
k1 += 1.0;
|
|
151
|
+
k2 += 1.0;
|
|
152
|
+
k3 += 2.0;
|
|
153
|
+
k4 += 2.0;
|
|
154
|
+
k5 += 1.0;
|
|
155
|
+
k6 -= 1.0;
|
|
156
|
+
k7 += 2.0;
|
|
157
|
+
k8 += 2.0;
|
|
158
|
+
|
|
159
|
+
if( (fabs(qk) + fabs(pk)) > big )
|
|
160
|
+
{
|
|
161
|
+
pkm2 *= biginv;
|
|
162
|
+
pkm1 *= biginv;
|
|
163
|
+
qkm2 *= biginv;
|
|
164
|
+
qkm1 *= biginv;
|
|
165
|
+
}
|
|
166
|
+
if( (fabs(qk) < biginv) || (fabs(pk) < biginv) )
|
|
167
|
+
{
|
|
168
|
+
pkm2 *= big;
|
|
169
|
+
pkm1 *= big;
|
|
170
|
+
qkm2 *= big;
|
|
171
|
+
qkm1 *= big;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
while( ++n < 300 );
|
|
175
|
+
|
|
176
|
+
return ans;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/* Continued fraction expansion #2
|
|
180
|
+
* for incomplete beta integral
|
|
181
|
+
*/
|
|
182
|
+
|
|
183
|
+
DEVICE static double incbd(double a, double b, double x)
|
|
184
|
+
{
|
|
185
|
+
double xk, pk, pkm1, pkm2, qk, qkm1, qkm2;
|
|
186
|
+
double k1, k2, k3, k4, k5, k6, k7, k8;
|
|
187
|
+
double r, t, ans, z, thresh;
|
|
188
|
+
int n;
|
|
189
|
+
|
|
190
|
+
k1 = a;
|
|
191
|
+
k2 = b - 1.0;
|
|
192
|
+
k3 = a;
|
|
193
|
+
k4 = a + 1.0;
|
|
194
|
+
k5 = 1.0;
|
|
195
|
+
k6 = a + b;
|
|
196
|
+
k7 = a + 1.0;;
|
|
197
|
+
k8 = a + 2.0;
|
|
198
|
+
|
|
199
|
+
pkm2 = 0.0;
|
|
200
|
+
qkm2 = 1.0;
|
|
201
|
+
pkm1 = 1.0;
|
|
202
|
+
qkm1 = 1.0;
|
|
203
|
+
z = x / (1.0-x);
|
|
204
|
+
ans = 1.0;
|
|
205
|
+
r = 1.0;
|
|
206
|
+
n = 0;
|
|
207
|
+
thresh = 3.0 * EPSILON;
|
|
208
|
+
do
|
|
209
|
+
{
|
|
210
|
+
|
|
211
|
+
xk = -( z * k1 * k2 ) / ( k3 * k4 );
|
|
212
|
+
pk = pkm1 + pkm2 * xk;
|
|
213
|
+
qk = qkm1 + qkm2 * xk;
|
|
214
|
+
pkm2 = pkm1;
|
|
215
|
+
pkm1 = pk;
|
|
216
|
+
qkm2 = qkm1;
|
|
217
|
+
qkm1 = qk;
|
|
218
|
+
|
|
219
|
+
xk = ( z * k5 * k6 ) / ( k7 * k8 );
|
|
220
|
+
pk = pkm1 + pkm2 * xk;
|
|
221
|
+
qk = qkm1 + qkm2 * xk;
|
|
222
|
+
pkm2 = pkm1;
|
|
223
|
+
pkm1 = pk;
|
|
224
|
+
qkm2 = qkm1;
|
|
225
|
+
qkm1 = qk;
|
|
226
|
+
|
|
227
|
+
if( qk != 0 )
|
|
228
|
+
r = pk/qk;
|
|
229
|
+
if( r != 0 )
|
|
230
|
+
{
|
|
231
|
+
t = fabs( (ans - r) / r );
|
|
232
|
+
ans = r;
|
|
233
|
+
}
|
|
234
|
+
else
|
|
235
|
+
t = 1.0;
|
|
236
|
+
|
|
237
|
+
if( t < thresh )
|
|
238
|
+
break;
|
|
239
|
+
|
|
240
|
+
k1 += 1.0;
|
|
241
|
+
k2 -= 1.0;
|
|
242
|
+
k3 += 2.0;
|
|
243
|
+
k4 += 2.0;
|
|
244
|
+
k5 += 1.0;
|
|
245
|
+
k6 += 1.0;
|
|
246
|
+
k7 += 2.0;
|
|
247
|
+
k8 += 2.0;
|
|
248
|
+
|
|
249
|
+
if( (fabs(qk) + fabs(pk)) > big )
|
|
250
|
+
{
|
|
251
|
+
pkm2 *= biginv;
|
|
252
|
+
pkm1 *= biginv;
|
|
253
|
+
qkm2 *= biginv;
|
|
254
|
+
qkm1 *= biginv;
|
|
255
|
+
}
|
|
256
|
+
if( (fabs(qk) < biginv) || (fabs(pk) < biginv) )
|
|
257
|
+
{
|
|
258
|
+
pkm2 *= big;
|
|
259
|
+
pkm1 *= big;
|
|
260
|
+
qkm2 *= big;
|
|
261
|
+
qkm1 *= big;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
while( ++n < 300 );
|
|
265
|
+
|
|
266
|
+
return ans;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
/* Power series for incomplete beta integral.
|
|
271
|
+
Use when b*x is small and x not too close to 1. */
|
|
272
|
+
|
|
273
|
+
DEVICE static double pseries(double a, double b, double x)
|
|
274
|
+
{
|
|
275
|
+
double s, t, u, v, n, t1, z, ai;
|
|
276
|
+
|
|
277
|
+
ai = 1.0 / a;
|
|
278
|
+
u = (1.0 - b) * x;
|
|
279
|
+
v = u / (a + 1.0);
|
|
280
|
+
t1 = v;
|
|
281
|
+
t = u;
|
|
282
|
+
n = 2.0;
|
|
283
|
+
s = 0.0;
|
|
284
|
+
z = EPSILON * ai;
|
|
285
|
+
while( fabs(v) > z )
|
|
286
|
+
{
|
|
287
|
+
u = (n - b) * x / n;
|
|
288
|
+
t *= u;
|
|
289
|
+
v = t / (a + n);
|
|
290
|
+
s += v;
|
|
291
|
+
n += 1.0;
|
|
292
|
+
}
|
|
293
|
+
s += t1;
|
|
294
|
+
s += ai;
|
|
295
|
+
|
|
296
|
+
u = a * log(x);
|
|
297
|
+
if( (a+b) < MAXGAM && fabs(u) < MAXLOG )
|
|
298
|
+
{
|
|
299
|
+
t = tgamma(a + b) / (tgamma(a) * tgamma(b));
|
|
300
|
+
s = s * t * pow(x,a);
|
|
301
|
+
}
|
|
302
|
+
else
|
|
303
|
+
{
|
|
304
|
+
t = lgamma(a + b) - lgamma(a) - lgamma(b) + u + log(s);
|
|
305
|
+
if( t < MINLOG )
|
|
306
|
+
s = 0.0;
|
|
307
|
+
else
|
|
308
|
+
s = exp(t);
|
|
309
|
+
}
|
|
310
|
+
return s;
|
|
311
|
+
}
|
|
@@ -1495,8 +1495,25 @@ class BetaInc(ScalarOp):
|
|
|
1495
1495
|
),
|
|
1496
1496
|
]
|
|
1497
1497
|
|
|
1498
|
-
def
|
|
1499
|
-
|
|
1498
|
+
def c_support_code(self, **kwargs):
|
|
1499
|
+
with open(os.path.join(os.path.dirname(__file__), "c_code", "incbet.c")) as f:
|
|
1500
|
+
raw = f.read()
|
|
1501
|
+
return raw
|
|
1502
|
+
|
|
1503
|
+
def c_code(self, node, name, inp, out, sub):
|
|
1504
|
+
(a, b, x) = inp
|
|
1505
|
+
(z,) = out
|
|
1506
|
+
if (
|
|
1507
|
+
node.inputs[0].type in float_types
|
|
1508
|
+
and node.inputs[1].type in float_types
|
|
1509
|
+
and node.inputs[2].type in float_types
|
|
1510
|
+
):
|
|
1511
|
+
return f"""{z} = BetaInc({a}, {b}, {x});"""
|
|
1512
|
+
|
|
1513
|
+
raise NotImplementedError("type not supported", type)
|
|
1514
|
+
|
|
1515
|
+
def c_code_cache_version(self):
|
|
1516
|
+
return (1,)
|
|
1500
1517
|
|
|
1501
1518
|
|
|
1502
1519
|
betainc = BetaInc(upgrade_to_float_no_complex, name="betainc")
|
|
@@ -4316,23 +4316,26 @@ def block_diag(*matrices: TensorVariable, format: Literal["csc", "csr"] = "csc")
|
|
|
4316
4316
|
--------
|
|
4317
4317
|
Create a sparse block diagonal matrix from two sparse 2x2 matrices:
|
|
4318
4318
|
|
|
4319
|
-
..
|
|
4319
|
+
.. testcode::
|
|
4320
4320
|
import numpy as np
|
|
4321
4321
|
from pytensor.sparse import block_diag
|
|
4322
4322
|
from scipy.sparse import csr_matrix
|
|
4323
4323
|
|
|
4324
4324
|
A = csr_matrix([[1, 2], [3, 4]])
|
|
4325
4325
|
B = csr_matrix([[5, 6], [7, 8]])
|
|
4326
|
-
result_sparse = block_diag(A, B, format='csr'
|
|
4326
|
+
result_sparse = block_diag(A, B, format='csr')
|
|
4327
4327
|
|
|
4328
4328
|
print(result_sparse)
|
|
4329
|
-
>>> SparseVariable{csr,int32}
|
|
4330
|
-
|
|
4331
4329
|
print(result_sparse.toarray().eval())
|
|
4332
|
-
|
|
4333
|
-
|
|
4334
|
-
|
|
4335
|
-
|
|
4330
|
+
|
|
4331
|
+
.. testoutput::
|
|
4332
|
+
|
|
4333
|
+
SparseVariable{csr,int64}
|
|
4334
|
+
[[1 2 0 0]
|
|
4335
|
+
[3 4 0 0]
|
|
4336
|
+
[0 0 5 6]
|
|
4337
|
+
[0 0 7 8]]
|
|
4338
|
+
|
|
4336
4339
|
"""
|
|
4337
4340
|
if len(matrices) == 1:
|
|
4338
4341
|
return matrices
|