tiny_solver/manifold/
mod.rs1use 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}