cartan

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^2

horizontal_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.