Esempio n. 1
0
 def test_inner_product_is_minkowski_inner_product(self, dim, tangent_vec_a,
                                                   tangent_vec_b,
                                                   base_point):
     metric = self.metric(dim)
     minkowki_space = Minkowski(dim + 1)
     result = metric.inner_product(tangent_vec_a, tangent_vec_b, base_point)
     expected = minkowki_space.metric.inner_product(tangent_vec_a,
                                                    tangent_vec_b,
                                                    base_point)
     self.assertAllClose(result, expected)
 def test_inner_product_matrix_matrix(self):
     euclidean = Euclidean(3)
     minkowski = Minkowski(3)
     space = ProductManifold(manifolds=[euclidean, minkowski],
                             default_point_type='matrix')
     point = space.random_uniform(1)
     result = space.metric.inner_product_matrix(point)
     expected = gs.eye(6)
     expected[3, 3] = -1
     self.assertAllClose(result, expected)
Esempio n. 3
0
 def __init__(self, dim, coords_type='extrinsic', scale=1):
     super(Hyperboloid,
           self).__init__(dim=dim,
                          scale=scale,
                          embedding_manifold=Minkowski(dim + 1))
     self.coords_type = coords_type
     self.point_type = Hyperboloid.default_point_type
     self.embedding_metric = self.embedding_manifold.metric
     self.metric =\
         HyperboloidMetric(self.dim, self.coords_type, self.scale)
Esempio n. 4
0
 def __init__(self, dim, coords_type='extrinsic', scale=1):
     # TODO (ninamiolane): Call __init__ from parent classes
     # and remove ignore rule of corresponding DeepSource issue
     self.scale = scale
     self.dim = dim
     self.coords_type = coords_type
     self.point_type = Hyperboloid.default_point_type
     self.embedding_manifold = Minkowski(dim + 1)
     self.embedding_metric = self.embedding_manifold.metric
     self.metric =\
         HyperboloidMetric(self.dim, self.coords_type, self.scale)
Esempio n. 5
0
 def __init__(self, dim, coords_type="extrinsic", scale=1):
     minkowski = Minkowski(dim + 1)
     super(Hyperboloid, self).__init__(
         dim=dim,
         embedding_space=minkowski,
         submersion=minkowski.metric.squared_norm,
         value=-1.0,
         tangent_submersion=minkowski.metric.inner_product,
         scale=scale,
     )
     self.coords_type = coords_type
     self.point_type = Hyperboloid.default_point_type
     self.metric = HyperboloidMetric(self.dim, self.coords_type, self.scale)
Esempio n. 6
0
    def test_inner_product(self):
        """
        Test that the inner product between two tangent vectors
        is the Minkowski inner product.
        """
        minkowski_space = Minkowski(self.dimension + 1)
        base_point = gs.array([1.16563816, 0.36381045, -0.47000603, 0.07381469])

        tangent_vec_a = self.space.to_tangent(
            vector=gs.array([10.0, 200.0, 1.0, 1.0]), base_point=base_point
        )

        tangent_vec_b = self.space.to_tangent(
            vector=gs.array([11.0, 20.0, -21.0, 0.0]), base_point=base_point
        )

        result = self.metric.inner_product(tangent_vec_a, tangent_vec_b, base_point)

        expected = minkowski_space.metric.inner_product(
            tangent_vec_a, tangent_vec_b, base_point
        )

        self.assertAllClose(result, expected)
Esempio n. 7
0
    class MinkowskiMetricTestData(_RiemannianMetricTestData):
        n_list = random.sample(range(2, 4), 2)
        metric_args_list = [(n, ) for n in n_list]
        shape_list = metric_args_list
        space_list = [Minkowski(n) for n in n_list]
        n_points_list = random.sample(range(1, 3), 2)
        n_tangent_vecs_list = random.sample(range(1, 3), 2)
        n_points_a_list = random.sample(range(1, 3), 2)
        n_points_b_list = [1]
        alpha_list = [1] * 2
        n_rungs_list = [1] * 2
        scheme_list = ["pole"] * 2

        def metric_matrix_test_data(self):
            smoke_data = [dict(dim=2, expected=[[-1.0, 0.0], [0.0, 1.0]])]
            return self.generate_tests(smoke_data)

        def inner_product_test_data(self):
            smoke_data = [
                dict(dim=2,
                     point_a=[0.0, 1.0],
                     point_b=[2.0, 10.0],
                     expected=10.0),
                dict(
                    dim=2,
                    point_a=[[-1.0, 0.0], [1.0, 0.0], [2.0, math.sqrt(3)]],
                    point_b=[
                        [2.0, -math.sqrt(3)],
                        [4.0, math.sqrt(15)],
                        [-4.0, math.sqrt(15)],
                    ],
                    expected=[2.0, -4.0, 14.70820393],
                ),
            ]
            return self.generate_tests(smoke_data)

        def squared_norm_test_data(self):
            smoke_data = [dict(dim=2, vector=[-2.0, 4.0], expected=12.0)]
            return self.generate_tests(smoke_data)

        def squared_dist_test_data(self):
            smoke_data = [
                dict(
                    dim=2,
                    point_a=[2.0, -math.sqrt(3)],
                    point_b=[4.0, math.sqrt(15)],
                    expected=27.416407,
                )
            ]
            return self.generate_tests(smoke_data)

        def exp_test_data(self):
            smoke_data = [
                dict(
                    dim=2,
                    tangent_vec=[2.0, math.sqrt(3)],
                    base_point=[1.0, 0.0],
                    expected=[3.0, math.sqrt(3)],
                )
            ]
            return self.generate_tests(smoke_data)

        def log_test_data(self):
            smoke_data = [
                dict(
                    dim=2,
                    point=[2.0, math.sqrt(3)],
                    base_point=[-1.0, 0.0],
                    expected=[3.0, math.sqrt(3)],
                )
            ]
            return self.generate_tests(smoke_data)

        def exp_shape_test_data(self):
            return self._exp_shape_test_data(self.metric_args_list,
                                             self.space_list, self.shape_list)

        def log_shape_test_data(self):
            return self._log_shape_test_data(
                self.metric_args_list,
                self.space_list,
            )

        def squared_dist_is_symmetric_test_data(self):
            return self._squared_dist_is_symmetric_test_data(
                self.metric_args_list,
                self.space_list,
                self.n_points_a_list,
                self.n_points_b_list,
                atol=gs.atol * 1000,
            )

        def exp_belongs_test_data(self):
            return self._exp_belongs_test_data(
                self.metric_args_list,
                self.space_list,
                self.shape_list,
                self.n_tangent_vecs_list,
                belongs_atol=gs.atol * 1000,
            )

        def log_is_tangent_test_data(self):
            return self._log_is_tangent_test_data(
                self.metric_args_list,
                self.space_list,
                self.n_points_list,
                is_tangent_atol=gs.atol * 1000,
            )

        def geodesic_ivp_belongs_test_data(self):
            return self._geodesic_ivp_belongs_test_data(
                self.metric_args_list,
                self.space_list,
                self.shape_list,
                self.n_points_list,
                belongs_atol=gs.atol * 1000,
            )

        def geodesic_bvp_belongs_test_data(self):
            return self._geodesic_bvp_belongs_test_data(
                self.metric_args_list,
                self.space_list,
                self.n_points_list,
                belongs_atol=gs.atol * 1000,
            )

        def log_then_exp_test_data(self):
            return self._log_then_exp_test_data(
                self.metric_args_list,
                self.space_list,
                self.n_points_list,
                rtol=gs.rtol * 100,
                atol=gs.atol * 10000,
            )

        def exp_then_log_test_data(self):
            return self._exp_then_log_test_data(
                self.metric_args_list,
                self.space_list,
                self.shape_list,
                self.n_tangent_vecs_list,
                rtol=gs.rtol * 100,
                atol=gs.atol * 10000,
            )

        def exp_ladder_parallel_transport_test_data(self):
            return self._exp_ladder_parallel_transport_test_data(
                self.metric_args_list,
                self.space_list,
                self.shape_list,
                self.n_tangent_vecs_list,
                self.n_rungs_list,
                self.alpha_list,
                self.scheme_list,
            )

        def exp_geodesic_ivp_test_data(self):
            return self._exp_geodesic_ivp_test_data(
                self.metric_args_list,
                self.space_list,
                self.shape_list,
                self.n_tangent_vecs_list,
                self.n_points_list,
                rtol=gs.rtol * 1000,
                atol=gs.atol * 1000,
            )

        def parallel_transport_ivp_is_isometry_test_data(self):
            return self._parallel_transport_ivp_is_isometry_test_data(
                self.metric_args_list,
                self.space_list,
                self.shape_list,
                self.n_tangent_vecs_list,
                is_tangent_atol=gs.atol * 1000,
                atol=gs.atol * 1000,
            )

        def parallel_transport_bvp_is_isometry_test_data(self):
            return self._parallel_transport_bvp_is_isometry_test_data(
                self.metric_args_list,
                self.space_list,
                self.shape_list,
                self.n_tangent_vecs_list,
                is_tangent_atol=gs.atol * 1000,
                atol=gs.atol * 1000,
            )

        def dist_is_symmetric_test_data(self):
            return self._dist_is_symmetric_test_data(
                self.metric_args_list,
                self.space_list,
                self.n_points_a_list,
                self.n_points_b_list,
            )

        def dist_is_norm_of_log_test_data(self):
            return self._dist_is_norm_of_log_test_data(
                self.metric_args_list,
                self.space_list,
                self.n_points_a_list,
                self.n_points_b_list,
            )

        def dist_point_to_itself_is_zero_test_data(self):
            return self._dist_point_to_itself_is_zero_test_data(
                self.metric_args_list, self.space_list, self.n_points_list)

        def inner_product_is_symmetric_test_data(self):
            return self._inner_product_is_symmetric_test_data(
                self.metric_args_list,
                self.space_list,
                self.shape_list,
                self.n_tangent_vecs_list,
            )
Esempio n. 8
0
 def setUp(self):
     self.sphere = Hypersphere(dimension=4)
     self.hyperbolic = Hyperbolic(dimension=3)
     self.euclidean = Euclidean(dimension=2)
     self.minkowski = Minkowski(dimension=2)
from geomstats.geometry.minkowski import Minkowski
from geomstats.geometry.product_manifold import (
    NFoldManifold,
    NFoldMetric,
    ProductManifold,
)
from geomstats.geometry.product_riemannian_metric import ProductRiemannianMetric
from geomstats.geometry.special_orthogonal import SpecialOrthogonal
from tests.conftest import Parametrizer
from tests.data_generation import _ManifoldTestData, _RiemannianMetricTestData
from tests.geometry_test_cases import ManifoldTestCase, RiemannianMetricTestCase

smoke_manifolds_1 = [Hypersphere(dim=2), Hyperboloid(dim=2)]
smoke_metrics_1 = [Hypersphere(dim=2).metric, Hyperboloid(dim=2).metric]

smoke_manifolds_2 = [Euclidean(3), Minkowski(3)]
smoke_metrics_2 = [Euclidean(3).metric, Minkowski(3).metric]


class TestProductManifold(ManifoldTestCase, metaclass=Parametrizer):
    space = ProductManifold
    skip_test_random_tangent_vec_is_tangent = True
    skip_test_projection_belongs = True

    class ProductManifoldTestData(_ManifoldTestData):

        n_list = random.sample(range(2, 4), 2)
        default_point_list = ["vector", "matrix"]
        manifolds_list = [[Hypersphere(dim=n),
                           Hyperboloid(dim=n)] for n in n_list]
        space_args_list = [(manifold, None, default_point)
Esempio n. 10
0
 def setUp(self):
     gs.random.seed(123)
     self.sphere = Hypersphere(dim=4)
     self.hyperbolic = Hyperboloid(dim=3)
     self.euclidean = Euclidean(dim=2)
     self.minkowski = Minkowski(dim=2)