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 MarkovQuantale
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 MarkovQuantale (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.

unit

unit(obj: SetObject) -> Morphism

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

PARAMETER DESCRIPTION
obj

The object A.

TYPE: SetObject

RETURNS DESCRIPTION
Morphism

The identity/delta morphism η_A: A → A.

Source code in src/quivers/stochastic/giry.py
66
67
68
69
70
71
72
73
74
75
76
77
78
79
def unit(self, obj: SetObject) -> Morphism:
    """η_A = δ: the Kronecker delta (deterministic distribution).

    Parameters
    ----------
    obj : SetObject
        The object A.

    Returns
    -------
    Morphism
        The identity/delta morphism η_A: A → A.
    """
    return identity(obj, quantale=MARKOV)

multiply

multiply(obj: SetObject) -> Morphism

μ_A = id: flatten nested distributions.

For finite sets, flattening G(G(A)) → G(A) is just the identity because G(A) = A at the set level.

PARAMETER DESCRIPTION
obj

The object A.

TYPE: SetObject

RETURNS DESCRIPTION
Morphism

The multiplication morphism μ_A: A → A.

Source code in src/quivers/stochastic/giry.py
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
def multiply(self, obj: SetObject) -> Morphism:
    """μ_A = id: flatten nested distributions.

    For finite sets, flattening G(G(A)) → G(A) is just the
    identity because G(A) = A at the set level.

    Parameters
    ----------
    obj : SetObject
        The object A.

    Returns
    -------
    Morphism
        The multiplication morphism μ_A: A → A.
    """
    return identity(obj, quantale=MARKOV)

kleisli_compose

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

Kleisli composition via sum-product (matrix multiplication).

Since G = Id, the Kleisli composition f >=> g is just standard composition f >> g under the MarkovQuantale.

PARAMETER DESCRIPTION
f

Left Kleisli morphism A → B.

TYPE: Morphism

g

Right Kleisli morphism B → C.

TYPE: Morphism

RETURNS DESCRIPTION
Morphism

Composed morphism A → C.

Source code in src/quivers/stochastic/giry.py
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
def kleisli_compose(self, f: Morphism, g: Morphism) -> Morphism:
    """Kleisli composition via sum-product (matrix multiplication).

    Since G = Id, the Kleisli composition f >=> g is just
    standard composition f >> g under the MarkovQuantale.

    Parameters
    ----------
    f : Morphism
        Left Kleisli morphism A → B.
    g : Morphism
        Right Kleisli morphism B → C.

    Returns
    -------
    Morphism
        Composed morphism 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
147
148
def __init__(self) -> None:
    super().__init__(GiryMonad())