Skip to content

Giry Monad

The Giry monad and probability distributions.

giry

The Giry monad on finite sets (the probability monad).

The Giry monad G on FinSet maps each finite set A to the set of probability distributions on A. In our representation:

G(A) = A   (at the set level, since distributions are represented
            as row-stochastic tensors, not as elements of a simplex)

This is structurally identical to the fuzzy powerset monad but with a different composition rule: sum-product (matrix multiplication) instead of noisy-OR.

η_A: A → A: the Kronecker delta (deterministic distribution)
μ_A: A → A: identity (flattening nested distributions)
f >=> g = f >> g: Kleisli composition = matrix multiplication

The Kleisli category of the Giry monad on FinSet is exactly FinStoch, the category of finite stochastic matrices.

This module provides:

GiryMonad: the probability monad (T, η, μ) with MarkovAlgebra
FinStoch: the Kleisli category of GiryMonad

GiryMonad

Bases: Monad

The Giry (probability) monad on finite sets.

At the finite-set level, G(A) = A because probability distributions over A are represented as tensors indexed by A (i.e., functions A → [0,1] that sum to 1), not as elements of a separate simplex object.

The Kleisli composition uses the MarkovAlgebra (sum-product), yielding standard matrix multiplication of stochastic matrices.

This is the categorical foundation for all stochastic morphisms in quivers: every Markov kernel A → B is a Kleisli morphism A → G(B) = A → B in this monad.

Examples:

>>> from quivers import FinSet
>>> from quivers.stochastic.giry import GiryMonad, FinStoch
>>> G = GiryMonad()
>>> A = FinSet(name="A", cardinality=3)
>>> eta = G.unit(A)  # Kronecker delta: shape (3, 3)
>>> finstoch = FinStoch()
>>> # compose stochastic morphisms via finstoch.compose(f, g)

endofunctor property

endofunctor: Functor

G = Id at the set level.

fmap_obj

fmap_obj(A: SetObject) -> SetObject

Act on an object: G(A) = A at the finite-set level.

PARAMETER DESCRIPTION
A

The finite set.

TYPE: SetObject

RETURNS DESCRIPTION
SetObject

A itself.

Source code in src/quivers/stochastic/giry.py
def fmap_obj(self, A: SetObject) -> SetObject:
    """Act on an object: ``G(A) = A`` at the finite-set level.

    Parameters
    ----------
    A : SetObject
        The finite set.

    Returns
    -------
    SetObject
        ``A`` itself.
    """
    return A

fmap

fmap(A: SetObject, B: SetObject, f: Morphism) -> Morphism

Act on a morphism: G(f) = f at the finite-set level.

PARAMETER DESCRIPTION
A

The domain of f.

TYPE: SetObject

B

The codomain of f.

TYPE: SetObject

f

The morphism to map.

TYPE: Morphism

RETURNS DESCRIPTION
Morphism

f itself.

Source code in src/quivers/stochastic/giry.py
def fmap(self, A: SetObject, B: SetObject, f: Morphism) -> Morphism:
    """Act on a morphism: ``G(f) = f`` at the finite-set level.

    Parameters
    ----------
    A : SetObject
        The domain of ``f``.
    B : SetObject
        The codomain of ``f``.
    f : Morphism
        The morphism to map.

    Returns
    -------
    Morphism
        ``f`` itself.
    """
    return f

pure

pure(A: SetObject) -> Morphism

η_A = δ, the Kronecker delta (deterministic distribution).

PARAMETER DESCRIPTION
A

The finite set.

TYPE: SetObject

RETURNS DESCRIPTION
Morphism

The identity Markov kernel on A.

Source code in src/quivers/stochastic/giry.py
def pure(self, A: SetObject) -> Morphism:
    """``η_A = δ``, the Kronecker delta (deterministic distribution).

    Parameters
    ----------
    A : SetObject
        The finite set.

    Returns
    -------
    Morphism
        The identity Markov kernel on ``A``.
    """
    return identity(A, algebra=MARKOV)

join

join(A: SetObject) -> Morphism

μ_A: flatten nested distributions.

Since G(A) = A at the finite-set level, the flattening is the identity.

PARAMETER DESCRIPTION
A

The finite set.

TYPE: SetObject

RETURNS DESCRIPTION
Morphism

The identity Markov kernel on A.

Source code in src/quivers/stochastic/giry.py
def join(self, A: SetObject) -> Morphism:
    """``μ_A``: flatten nested distributions.

    Since ``G(A) = A`` at the finite-set level, the flattening is
    the identity.

    Parameters
    ----------
    A : SetObject
        The finite set.

    Returns
    -------
    Morphism
        The identity Markov kernel on ``A``.
    """
    return identity(A, algebra=MARKOV)

unit

unit(A: SetObject) -> Morphism

The monad unit η_A, an alias of pure.

PARAMETER DESCRIPTION
A

The finite set.

TYPE: SetObject

RETURNS DESCRIPTION
Morphism

The identity Markov kernel on A.

Source code in src/quivers/stochastic/giry.py
def unit(self, A: SetObject) -> Morphism:
    """The monad unit ``η_A``, an alias of `pure`.

    Parameters
    ----------
    A : SetObject
        The finite set.

    Returns
    -------
    Morphism
        The identity Markov kernel on ``A``.
    """
    return self.pure(A)

multiply

multiply(A: SetObject) -> Morphism

The monad multiplication μ_A, an alias of join.

PARAMETER DESCRIPTION
A

The finite set.

TYPE: SetObject

RETURNS DESCRIPTION
Morphism

The identity Markov kernel on A.

Source code in src/quivers/stochastic/giry.py
def multiply(self, A: SetObject) -> Morphism:
    """The monad multiplication ``μ_A``, an alias of `join`.

    Parameters
    ----------
    A : SetObject
        The finite set.

    Returns
    -------
    Morphism
        The identity Markov kernel on ``A``.
    """
    return self.join(A)

kleisli_compose

kleisli_compose(f: Morphism, g: Morphism) -> Morphism

Kleisli composition via sum-product (matrix multiplication).

PARAMETER DESCRIPTION
f

The first kernel, A -> B.

TYPE: Morphism

g

The second kernel, B -> C.

TYPE: Morphism

RETURNS DESCRIPTION
Morphism

The composite kernel f >> g, A -> C.

Source code in src/quivers/stochastic/giry.py
def kleisli_compose(self, f: Morphism, g: Morphism) -> Morphism:
    """Kleisli composition via sum-product (matrix multiplication).

    Parameters
    ----------
    f : Morphism
        The first kernel, ``A -> B``.
    g : Morphism
        The second kernel, ``B -> C``.

    Returns
    -------
    Morphism
        The composite kernel ``f >> g``, ``A -> C``.
    """
    return f >> g

FinStoch

FinStoch()

Bases: KleisliCategory

The category FinStoch of finite sets and stochastic maps.

This is the Kleisli category of the Giry monad: objects are finite sets, morphisms are stochastic matrices (Markov kernels), and composition is matrix multiplication.

Examples:

>>> from quivers import FinSet
>>> from quivers.stochastic import StochasticMorphism
>>> from quivers.stochastic.giry import FinStoch
>>> cat = FinStoch()
>>> A = FinSet(name="A", cardinality=3)
>>> B = FinSet(name="B", cardinality=4)
>>> C = FinSet(name="C", cardinality=2)
>>> f = StochasticMorphism(A, B)
>>> g = StochasticMorphism(B, C)
>>> h = cat.compose(f, g)  # A → C via matrix multiplication
Source code in src/quivers/stochastic/giry.py
def __init__(self) -> None:
    super().__init__(GiryMonad())