Horizontal Lift
Given a frame at and a vector , the horizontal lift of at is the unique curve in the frame bundle whose velocity projects to and whose frame evolves by parallel transport.
At the infinitesimal level, the ground component of the horizontal velocity is
This is the fundamental vector field of the principal -connection on when .
API
use cartan_stochastic::horizontal_velocity;
let dw: [f64; 2] = [0.01, -0.02];
let u: SVector<f64, 3> = horizontal_velocity(&frame, &dw)?; // ∈ T_p S^2horizontal_velocity requires dw.len() == frame.len() and returns the corresponding M::Tangent directly. Dimension mismatch surfaces as StochasticError::NoiseDimMismatch.
Anti-development
The inverse direction, anti-development, reads off the representation of a tangent vector in a chosen frame:
cartan-stochastic does not ship a dedicated helper for this: it is one line against Manifold::inner. Anti-development of a full curve on is a sequence of per-step inner products against parallel-transported frames — materialised only if a downstream consumer asks.
Why both directions matter
In BEL-style Greeks computation, horizontal lift drives the forward SDE while anti-development maps the computed weight back to the driving Euclidean noise. The symmetry — one routine per direction, both built from Manifold::inner — is what lets a single Stratonovich development be reused across forward simulation and pathwise derivative evaluation.