# Source code for geomstats.geometry.euclidean

"""Euclidean space."""

import geomstats.backend as gs
from geomstats.geometry.manifold import Manifold
from geomstats.geometry.riemannian_metric import RiemannianMetric

[docs]class Euclidean(Manifold):
"""Class for Euclidean spaces.

By definition, a Euclidean space is a vector space of a given
dimension, equipped with a Euclidean metric.

Parameters
----------
dim : int
Dimension of the Euclidean space.
"""

def __init__(self, dim):
super(Euclidean, self).__init__(dim=dim)
self.metric = EuclideanMetric(dim)

[docs]    def belongs(self, point):
"""Evaluate if a point belongs to the Euclidean space.

Parameters
----------
point : array-like, shape=[..., dim]
Point to evaluate.

Returns
-------
belongs : array-like, shape=[...,]
Boolean evaluating if point belongs to the Euclidean space.
"""
point_dim = point.shape[-1]
belongs = point_dim == self.dim
if gs.ndim(point) == 2:
belongs = gs.tile([belongs], (point.shape,))

return belongs

[docs]    def random_uniform(self, n_samples=1, bound=1.):
"""Sample in the Euclidean space with the uniform distribution.

Parameters
----------
n_samples : int
Number of samples.
Optional, default: 1.
bound : float
Side of hypercube support of the uniform distribution.
Optional, default: 1.0

Returns
-------
point : array-like, shape=[..., dim]
Sample.
"""
size = (self.dim,)
if n_samples != 1:
size = (n_samples, self.dim)
point = bound * (gs.random.rand(*size) - 0.5) * 2

return point

[docs]class EuclideanMetric(RiemannianMetric):
"""Class for Euclidean metrics.

As a Riemannian metric, the Euclidean metric is:
- flat: the inner-product is independent of the base point.
- positive definite: it has signature (dimension, 0, 0),
where dimension is the dimension of the Euclidean space.

Parameters
----------
dim : int
Dimension of the Euclidean space.
"""

def __init__(self, dim):
super(EuclideanMetric, self).__init__(
dim=dim, signature=(dim, 0, 0))

[docs]    def inner_product_matrix(self, base_point=None):
"""Compute the inner-product matrix, independent of the base point.

Parameters
----------
base_point : array-like, shape=[..., dim]
Base point.
Optional, default: None.

Returns
-------
inner_prod_mat : array-like, shape=[..., dim, dim]
Inner-product matrix.
"""
mat = gs.eye(self.dim)
return mat

[docs]    def exp(self, tangent_vec, base_point):
"""Compute exp map of a base point in tangent vector direction.

The Riemannian exponential is vector addition in the Euclidean space.

Parameters
----------
tangent_vec : array-like, shape=[..., dim]
Tangent vector at base point.
base_point : array-like, shape=[..., dim]
Base point.

Returns
-------
exp : array-like, shape=[..., dim]
Riemannian exponential.
"""
exp = base_point + tangent_vec
return exp

[docs]    def log(self, point, base_point):
"""Compute log map using a base point and other point.

The Riemannian logarithm is the subtraction in the Euclidean space.

Parameters
----------
point: array-like, shape=[..., dim]
Point.
base_point: array-like, shape=[..., dim]
Base point.

Returns
-------
log: array-like, shape=[..., dim]
Riemannian logarithm.
"""
log = point - base_point
return log