cartan

Orthonormal Frame Bundle

An orthonormal frame at is a tuple orthonormal with respect to the Riemannian inner product at , where . The union over all of such frames is the orthonormal frame bundle : a principal -bundle over .

Why it matters

Brownian motion on a Riemannian manifold cannot be defined by directly "adding Gaussian noise" to a point — ambient addition takes you off the manifold. The Eells-Elworthy-Malliavin construction instead drives the frame bundle with Euclidean Brownian motion and projects to , producing an exact BM with the Laplace-Beltrami generator. Every operation in cartan-stochastic routes through a frame.

API

use cartan_stochastic::{OrthonormalFrame, random_frame_at};
 
let m = Sphere::<3>;                                // S^2 in R^3
let p = m.random_point(&mut rng);
let frame: OrthonormalFrame<Sphere<3>> =
    random_frame_at(&m, &p, &mut rng).unwrap();     // 2 basis vectors
assert_eq!(frame.len(), m.dim());

The OrthonormalFrame<M> struct is storage-agnostic: it holds a Vec<M::Tangent> of length dim(M), with each entry guaranteed to lie in and pairwise orthonormal to float tolerance.

Gram-Schmidt reconstruction

During stochastic development the frame is parallel-transported from to at each step. Numerical discretisation causes the transported basis to slowly lose orthonormality. Every step calls reorthonormalize() — a modified Gram-Schmidt against the Riemannian metric at — to absorb the drift:

Rank-deficiency (collapse to linearly independent vectors) is detected via a configurable threshold on the residual norm and reported as StochasticError::GramSchmidtRankDeficient rather than producing silently singular output.

Design note

The frame bundle itself is not materialised as a Rust type. Callers carry around the pair (p, frame) and treat it as a point in . This keeps the API free of bundle-level abstractions (local trivialisations, transition functions) while preserving the mathematical content: every routine that "knows about " consumes a (point, frame) pair and returns the same.