tiny_solver/manifold/
mod.rs

1use std::num::NonZero;
2
3use nalgebra as na;
4use num_dual::DualDVec64;
5
6pub mod se3;
7pub mod so3;
8
9pub trait AutoDiffManifold<T: na::RealField> {
10    fn plus(&self, x: na::DVectorView<T>, delta: na::DVectorView<T>) -> na::DVector<T>;
11    fn minus(&self, y: na::DVectorView<T>, x: na::DVectorView<T>) -> na::DVector<T>;
12}
13
14pub trait Manifold: AutoDiffManifold<f64> + AutoDiffManifold<num_dual::DualDVec64> {
15    fn tangent_size(&self) -> NonZero<usize>;
16    fn plus_f64(&self, x: na::DVectorView<f64>, delta: na::DVectorView<f64>) -> na::DVector<f64> {
17        self.plus(x, delta)
18    }
19    fn plus_dual(
20        &self,
21        x: na::DVectorView<DualDVec64>,
22        delta: na::DVectorView<DualDVec64>,
23    ) -> na::DVector<DualDVec64> {
24        self.plus(x, delta)
25    }
26    fn minus_f64(&self, y: na::DVectorView<f64>, x: na::DVectorView<f64>) -> na::DVector<f64> {
27        self.minus(y, x)
28    }
29    fn minus_dual(
30        &self,
31        y: na::DVectorView<DualDVec64>,
32        x: na::DVectorView<DualDVec64>,
33    ) -> na::DVector<DualDVec64> {
34        self.minus(y, x)
35    }
36}