This part of documentation covers integration of scalar functions defined on manifolds $f \colon \mathcal{M} \to ℝ$:

\[\int_{\mathcal M} f(p) \mathrm{d}p\]

The basic concepts are derived from geometric measure theory. In principle, there are many ways in which a manifold can be equipped with a measure that can be later used to define an integral. One of the most popular ways is based on pushing the Lebesgue measure on a tangent space through the exponential map. Any other suitable atlas could be used, not just the one defined by normal coordinates, though each one requires different volume density corrections due to the Jacobian determinant of the pushforward. Manifolds.jl provides the function volume_density that calculates that quantity, denoted $\theta_p(X)$. See for example [BP19], Definition 11, for a precise description using Jacobi fields.

While many sources define volume density as a function of two points, Manifolds.jl decided to use the more general point-tangent vector formulation. The two-points variant can be implemented as

using Manifolds
volume_density_two_points(M::AbstractManifold, p, q) = volume_density(M, p, log(M, p, q))
volume_density_two_points (generic function with 1 method)

The simplest way to of integrating a function on a compact manifold is through a 📖 Monte Carlo integrator. A simple variant can be implemented as follows (assuming uniform distribution of rand):

using LinearAlgebra, Distributions, SpecialFunctions
function simple_mc_integrate(M::AbstractManifold, f; N::Int = 1000)
    V = manifold_volume(M)
    sum = 0.0
    q = rand(M)
    for i in 1:N
        sum += f(M, q)
        rand!(M, q)
    return V * sum/N
simple_mc_integrate (generic function with 1 method)

We used the function manifold_volume to get the volume of the set over which the integration is performed, as described in the linked Wikipedia article.


We will now try to verify that volume density correction correctly changes probability density of an exponential-wrapped normal distribution. pdf_tangent_space (defined in the next code block) represents probability density of a normally distributed random variable $X_T$ in the tangent space $T_p \mathcal{M}$. Its probability density (with respect to the Lebesgue measure of the tangent space) is $f_{X_T}\colon T_p \mathcal{M} \to ℝ$.

pdf_manifold (defined below) refers to the probability density of the distribution $X_M$ from the tangent space $T_p \mathcal{M}$ wrapped using exponential map on the manifold. The formula for probability density with respect to pushforward measure of the Lebesgue measure in the tangent space reads

\[f_{X_M}(q) = \sum_{X \in T_p\mathcal{M}, \exp_p(X)=q} \frac{f_{X_T}(X)}{\theta_p(X)}\]

volume_density function calculates the correction $\theta_p(X)$.

function pdf_tangent_space(M::AbstractManifold, p)
    return pdf(MvNormal(zeros(manifold_dimension(M)), 0.2*I), p)

function pdf_manifold(M::AbstractManifold, q)
    p = [1.0, 0.0, 0.0]
    X = log(M, p, q)
    Xc = get_coordinates(M, p, X, DefaultOrthonormalBasis())
    vd = abs(volume_density(M, p, X))
    if vd > eps()
        return pdf_tangent_space(M, Xc) / vd
        return 0.0

println(simple_mc_integrate(Sphere(2), pdf_manifold; N=1000000))

The function simple_mc_integrate, defined in the previous section, is used to verify that the density integrates to 1 over the manifold.

Note that our pdf_manifold implements a simplified version of $f_{X_M}$ which assumes that the probability mass of pdf_tangent_space outside of (local) injectivity radius at $p$ is negligible. In such case there is only one non-zero summand in the formula for $f_{X_M}(q)$, namely $X=\log_p(q)$. Otherwise we would have to consider other vectors $Y\in T_p \mathcal{M}$ such that $\exp_p(Y) = q$ in that sum.

Remarkably, exponential-wrapped distributions possess three important qualities [CLLD22]:

  • Densities of $X_M$ are explicit. There is no normalization constant that needs to be computed like in truncated distributions.
  • Sampling from $X_M$ is easy. It suffices to get a sample from $X_T$ and pass it to the exponential map.
  • If mean of $X_T$ is 0, then there is a simple correspondence between moments of $X_M$ and $X_T$, for example $p$ is the mean of $X_M$.

Kernel density estimation

We can also make a Pelletier’s isotropic kernel density estimator. Given points $p_1, p_2, \dots, p_n$ on $d$-dimensional manifold $\mathcal M$ the density at point $q$ is defined as

\[f(q) = \frac{1}{n h^d} \sum_{i=1}^n \frac{1}{\theta_q(\log_q(p_i))}K\left( \frac{d(q, p_i)}{h} \right),\]

where $h$ is the bandwidth, a small positive number less than the injectivity radius of $\mathcal M$ and $K\colonℝ\toℝ$ is a kernel function. Note that Pelletier’s estimator can only use radially-symmetric kernels. The radially symmetric multivariate Epanechnikov kernel used in the example below is described in [LW19].

struct PelletierKDE{TM<:AbstractManifold,TPts<:AbstractVector}

(kde::PelletierKDE)(::AbstractManifold, p) = kde(p)
function (kde::PelletierKDE)(p)
    n = length(kde.pts)
    d = manifold_dimension(kde.M)
    sum_kde = 0.0
    function epanechnikov_kernel(x)
        if x < 1
            return gamma(2+d/2) * (1-x^2)/(π^(d/2))
            return 0.0
    for i in 1:n
        X = log(kde.M, p, kde.pts[i])
        Xn = norm(kde.M, p, X)
        sum_kde += epanechnikov_kernel(Xn / kde.bandwidth) / volume_density(kde.M, p, X)
    sum_kde /= n * kde.bandwidth^d
    return sum_kde

M = Sphere(2)
pts = rand(M, 8)
kde = PelletierKDE(M, 0.7, pts)
println(simple_mc_integrate(Sphere(2), kde; N=1000000))

Technical notes

This section contains a few technical notes that are relevant to the problem of integration on manifolds but can be freely skipped on the first read of the tutorial.

Conflicting statements about volume of a manifold

manifold_volume and volume_density are closely related to each other, though very few sources explore this connection, and some even claiming a certain level of arbitrariness in defining manifold_volume. Volume is sometimes considered arbitrary because Riemannian metrics on some spaces like the manifold of rotations are defined with arbitrary constants. However, once a constant is picked (and it must be picked before any useful computation can be performed), all geometric operations must follow in a consistent way: inner products, exponential and logarithmic maps, volume densities, etc. Manifolds.jl consistently picks such constants and provides a unified framework, though it sometimes results in picking a different constant than what is the most popular in some sub-communities.

Haar measures

On Lie groups the situation regarding integration is more complicated. Invariance under left or right group action is a desired property that leads one to consider Haar measures [Tor20]. It is, however, unclear what are the practical benefits of considering Haar measures over the Lebesgue measure of the underlying manifold, which often turns out to be invariant anyway.

Integration in charts

Integration through charts is an approach currently not supported by Manifolds.jl. One has to define a suitable set of disjoint charts covering the entire manifold and use a method for multivariate Euclidean integration. Note that ranges of parameters have to be adjusted for each manifold and scaling based on the metric needs to be applied. See [BST03] for some considerations on symmetric spaces.



L. J. Boya, E. Sudarshan and T. Tilma. Volumes of compact manifolds. Reports on Mathematical Physics 52, 401–422 (2003).
A. L. Brigant and S. Puechmorel. Approximation of Densities on Riemannian Manifolds. Entropy 21, 43 (2019).
E. Chevallier, D. Li, Y. Lu and D. B. Dunson. Exponential-wrapped distributions on symmetric spaces. ArXiv Preprint (2022).
N. Langrené and X. Warin. Fast and Stable Multivariate Kernel Density Estimation by Fast Sum Updating. Journal of Computational and Graphical Statistics 28, 596–608 (2019).
S. Tornier. Haar Measures (2020).