Manifold

Trait Manifold 

Source
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§

Source

fn new() -> Self

Source

fn name() -> &'static str

Source

fn project<const D: usize>( point: Tensor<B, D>, vector: Tensor<B, D>, ) -> Tensor<B, D>

Source

fn retract<const D: usize>( point: Tensor<B, D>, direction: Tensor<B, D>, ) -> Tensor<B, D>

Source

fn inner<const D: usize>( point: Tensor<B, D>, u: Tensor<B, D>, v: Tensor<B, D>, ) -> Tensor<B, D>

Riemannian inner product at a given point

Provided Methods§

Source

fn egrad2rgrad<const D: usize>( point: Tensor<B, D>, grad: Tensor<B, D>, ) -> Tensor<B, D>

Convert Euclidean gradient to Riemannian gradient

Source

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

Source

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

Source

fn project_tangent<const D: usize>( point: Tensor<B, D>, vector: Tensor<B, D>, ) -> Tensor<B, D>

Project vector to tangent space at point

Source

fn proj<const D: usize>(point: Tensor<B, D>) -> Tensor<B, D>

Project point onto manifold

Source

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.

Implementors§