pub trait Manifold<B: Backend>:
Clone
+ Send
+ Sync {
// Required methods
fn new() -> Self;
fn name() -> &'static str;
fn project<const D: usize>(
point: Tensor<B, D>,
vector: Tensor<B, D>,
) -> Tensor<B, D>;
fn retract<const D: usize>(
point: Tensor<B, D>,
direction: Tensor<B, D>,
) -> Tensor<B, D>;
fn inner<const D: usize>(
point: Tensor<B, D>,
u: Tensor<B, D>,
v: Tensor<B, D>,
) -> Tensor<B, D>;
// Provided methods
fn egrad2rgrad<const D: usize>(
point: Tensor<B, D>,
grad: Tensor<B, D>,
) -> Tensor<B, D> { ... }
fn expmap<const D: usize>(
point: Tensor<B, D>,
direction: Tensor<B, D>,
) -> Tensor<B, D> { ... }
fn parallel_transport<const D: usize>(
_point1: Tensor<B, D>,
point2: Tensor<B, D>,
tangent: Tensor<B, D>,
) -> Tensor<B, D> { ... }
fn project_tangent<const D: usize>(
point: Tensor<B, D>,
vector: Tensor<B, D>,
) -> Tensor<B, D> { ... }
fn proj<const D: usize>(point: Tensor<B, D>) -> Tensor<B, D> { ... }
fn is_in_manifold<const D: usize>(_point: Tensor<B, D>) -> bool { ... }
}Expand description
A Riemannian manifold defines the geometric structure for optimization.
This trait provides all the necessary operations for Riemannian optimization:
- Tangent space projections
- Retraction operations
- Exponential maps
- Parallel transport
- Riemannian inner products
§Example Implementation
use manopt_rs::prelude::*;
#[derive(Clone)]
struct MyManifold;
impl<B: Backend> Manifold<B> for MyManifold {
fn new() -> Self { MyManifold }
fn name() -> &'static str { "MyManifold" }
fn project<const D: usize>(point: Tensor<B, D>, vector: Tensor<B, D>) -> Tensor<B, D> {
// Project vector to tangent space at point
vector
}
fn retract<const D: usize>(point: Tensor<B, D>, direction: Tensor<B, D>) -> Tensor<B, D> {
// Move along manifold from point in direction with step size
point + direction
}
fn inner<const D: usize>(_point: Tensor<B, D>, u: Tensor<B, D>, v: Tensor<B, D>) -> Tensor<B, D> {
// Riemannian inner product at point
u * v
}
}Required Methods§
fn new() -> Self
fn name() -> &'static str
fn project<const D: usize>( point: Tensor<B, D>, vector: Tensor<B, D>, ) -> Tensor<B, D>
fn retract<const D: usize>( point: Tensor<B, D>, direction: Tensor<B, D>, ) -> Tensor<B, D>
Provided Methods§
Sourcefn egrad2rgrad<const D: usize>(
point: Tensor<B, D>,
grad: Tensor<B, D>,
) -> Tensor<B, D>
fn egrad2rgrad<const D: usize>( point: Tensor<B, D>, grad: Tensor<B, D>, ) -> Tensor<B, D>
Convert Euclidean gradient to Riemannian gradient
Sourcefn expmap<const D: usize>(
point: Tensor<B, D>,
direction: Tensor<B, D>,
) -> Tensor<B, D>
fn expmap<const D: usize>( point: Tensor<B, D>, direction: Tensor<B, D>, ) -> Tensor<B, D>
Exponential map: move from point along tangent vector u with step size
Sourcefn parallel_transport<const D: usize>(
_point1: Tensor<B, D>,
point2: Tensor<B, D>,
tangent: Tensor<B, D>,
) -> Tensor<B, D>
fn parallel_transport<const D: usize>( _point1: Tensor<B, D>, point2: Tensor<B, D>, tangent: Tensor<B, D>, ) -> Tensor<B, D>
Parallel transport of tangent vector from point1 to point2
Sourcefn project_tangent<const D: usize>(
point: Tensor<B, D>,
vector: Tensor<B, D>,
) -> Tensor<B, D>
fn project_tangent<const D: usize>( point: Tensor<B, D>, vector: Tensor<B, D>, ) -> Tensor<B, D>
Project vector to tangent space at point
Sourcefn is_in_manifold<const D: usize>(_point: Tensor<B, D>) -> bool
fn is_in_manifold<const D: usize>(_point: Tensor<B, D>) -> bool
Check if a point is in the manifold.
By default, this is not implemented and returns false.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.