Metadata-Version: 2.4
Name: pytensor
Version: 3.2.2
Summary: Optimizing compiler for evaluating mathematical expressions on CPUs and GPUs.
Author-email: pymc-devs <pymc.devs@gmail.com>
License-Expression: BSD-3-Clause
Project-URL: homepage, https://github.com/pymc-devs/pytensor
Project-URL: repository, https://github.com/pymc-devs/pytensor
Project-URL: documentation, https://pytensor.readthedocs.io/en/latest/
Keywords: pytensor,math,numerical,symbolic,blas,numpy,autodiff,differentiation
Classifier: Development Status :: 6 - Mature
Classifier: Intended Audience :: Education
Classifier: Intended Audience :: Science/Research
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python
Classifier: Topic :: Software Development :: Code Generators
Classifier: Topic :: Software Development :: Compilers
Classifier: Topic :: Scientific/Engineering :: Mathematics
Classifier: Operating System :: Microsoft :: Windows
Classifier: Operating System :: POSIX
Classifier: Operating System :: Unix
Classifier: Operating System :: MacOS
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Requires-Python: <3.15,>=3.12
Description-Content-Type: text/x-rst
License-File: LICENSE.txt
Requires-Dist: setuptools>=59.0.0
Requires-Dist: scipy<2,>=1
Requires-Dist: numpy>=2.0
Requires-Dist: numba<=0.65.1,>=0.58
Requires-Dist: filelock>=3.15
Provides-Extra: complete
Requires-Dist: pytensor[jax]; extra == "complete"
Requires-Dist: pytensor[numba]; extra == "complete"
Provides-Extra: development
Requires-Dist: pytensor[complete]; extra == "development"
Requires-Dist: pytensor[tests]; extra == "development"
Requires-Dist: pytensor[rtd]; extra == "development"
Provides-Extra: tests
Requires-Dist: pytest; extra == "tests"
Requires-Dist: pre-commit; extra == "tests"
Requires-Dist: pytest-cov>=2.6.1; extra == "tests"
Requires-Dist: coverage>=5.1; extra == "tests"
Requires-Dist: pytest-benchmark; extra == "tests"
Requires-Dist: pytest-mock; extra == "tests"
Requires-Dist: pytest-sphinx; extra == "tests"
Requires-Dist: pytensor[kanren]; extra == "tests"
Provides-Extra: rtd
Requires-Dist: sphinx<6,>=5.1.0; extra == "rtd"
Requires-Dist: pygments; extra == "rtd"
Requires-Dist: pydot; extra == "rtd"
Provides-Extra: jax
Requires-Dist: jax; extra == "jax"
Requires-Dist: jaxlib; extra == "jax"
Provides-Extra: numba
Requires-Dist: numba<=0.65.1,>=0.58; extra == "numba"
Requires-Dist: llvmlite; extra == "numba"
Provides-Extra: kanren
Requires-Dist: etuples; extra == "kanren"
Requires-Dist: logical-unification; extra == "kanren"
Requires-Dist: miniKanren; extra == "kanren"
Requires-Dist: cons; extra == "kanren"
Dynamic: license-file

.. image:: https://cdn.rawgit.com/pymc-devs/pytensor/main/doc/images/PyTensor_RGB.svg
    :height: 100px
    :alt: PyTensor logo
    :align: center

|Tests Status| |Coverage|

|Project Name| is a Python library that allows one to define, optimize, and
efficiently evaluate mathematical expressions involving multi-dimensional arrays.
It provides the computational backend for `PyMC <https://github.com/pymc-devs/pymc>`__.

Features
========

- A hackable, pure-Python codebase
- Extensible graph framework suitable for rapid development of custom operators and symbolic optimizations
- Implements an extensible graph transpilation framework that currently provides
  compilation via C, `JAX <https://github.com/google/jax>`__, and `Numba <https://github.com/numba/numba>`__
- Contrary to PyTorch and TensorFlow, PyTensor maintains a static graph which can be modified in-place to
  allow for advanced optimizations

Getting started
===============

.. code-block:: python

    import pytensor
    from pytensor import tensor as pt

    # Declare two symbolic floating-point scalars
    a = pt.dscalar("a")
    b = pt.dscalar("b")

    # Create a simple example expression
    c = a + b

    # Convert the expression into a callable object that takes `(a, b)`
    # values as input and computes the value of `c`.
    f_c = pytensor.function([a, b], c)

    assert f_c(1.5, 2.5) == 4.0

    # Compute the gradient of the example expression with respect to `a`
    dc = pytensor.grad(c, a)

    f_dc = pytensor.function([a, b], dc)

    assert f_dc(1.5, 2.5) == 1.0

    # Compiling functions with `pytensor.function` also optimizes
    # expression graphs by removing unnecessary operations and
    # replacing computations with more efficient ones.

    v = pt.vector("v")
    M = pt.matrix("M")

    d = a/a + (M + a).dot(v)

    pytensor.dprint(d)
    #  Add [id A]
    #  ├─ ExpandDims{axis=0} [id B]
    #  │  └─ True_div [id C]
    #  │     ├─ a [id D]
    #  │     └─ a [id D]
    #  └─ dot [id E]
    #     ├─ Add [id F]
    #     │  ├─ M [id G]
    #     │  └─ ExpandDims{axes=[0, 1]} [id H]
    #     │     └─ a [id D]
    #     └─ v [id I]

    f_d = pytensor.function([a, v, M], d)

    # `a/a` -> `1` and the dot product is replaced with a BLAS function
    # (i.e. CGemv)
    pytensor.dprint(f_d)
    # Add [id A] 5
    #  ├─ [1.] [id B]
    #  └─ CGemv{inplace} [id C] 4
    #     ├─ AllocEmpty{dtype='float64'} [id D] 3
    #     │  └─ Shape_i{0} [id E] 2
    #     │     └─ M [id F]
    #     ├─ 1.0 [id G]
    #     ├─ Add [id H] 1
    #     │  ├─ M [id F]
    #     │  └─ ExpandDims{axes=[0, 1]} [id I] 0
    #     │     └─ a [id J]
    #     ├─ v [id K]
    #     └─ 0.0 [id L]

See `the PyTensor documentation <https://pytensor.readthedocs.io/en/latest/>`__ for in-depth tutorials.


Installation
============

The latest release of |Project Name| can be installed from PyPI using ``pip``:

::

    pip install pytensor


Or via conda-forge:

::

    conda install -c conda-forge pytensor


The current development branch of |Project Name| can be installed from GitHub, also using ``pip``:

::

    pip install git+https://github.com/pymc-devs/pytensor


Background
==========

PyTensor is a fork of `Aesara <https://github.com/aesara-devs/aesara>`__, which is a fork of `Theano <https://github.com/Theano/Theano>`__.

Contributing
============

We welcome bug reports and fixes and improvements to the documentation.

For more information on contributing, please see the
`contributing guide <https://pytensor.readthedocs.io/en/latest/dev_start_guide.html>`__.

A good place to start contributing is by looking through the issues
`here <https://github.com/pymc-devs/pytensor/issues>`__.


.. |Project Name| replace:: PyTensor
.. |Tests Status| image:: https://github.com/pymc-devs/pytensor/workflows/Tests/badge.svg
  :target: https://github.com/pymc-devs/pytensor/actions?query=workflow%3ATests+branch%3Amain
.. |Coverage| image:: https://codecov.io/gh/pymc-devs/pytensor/branch/main/graph/badge.svg?token=WVwr8nZYmc
  :target: https://codecov.io/gh/pymc-devs/pytensor
