def test_estimate_transform_spd(self):
     point = spd.SPDMatrices(3).random_uniform()
     points = gs.stack([point, point])
     transformer = ToTangentSpace(geometry=spd.SPDMetricAffine(3))
     transformer.fit(X=points)
     result = transformer.transform(points)
     expected = gs.zeros((2, 6))
     self.assertAllClose(expected, result, atol=1e-5)
    def __init__(self, dim, metric_type="bw"):
        super(SPDManifold, self).__init__(dim)

        if metric_type == "bw":
            self.metric = spd.SPDMetricBuresWasserstein(dim)
        elif metric_type == "euclid":
            self.metric = spd.SPDMetricEuclidean(dim)
        elif metric_type == "logeuclid":
            self.metric = spd.SPDMetricLogEuclidean(dim)
        else:
            self.metric = spd.SPDMetricAffine(dim)
    def test_inverse_transform_spd(self):
        point = spd.SPDMatrices(3).random_uniform(10)
        transformer = ToTangentSpace(geometry=spd.SPDMetricLogEuclidean(3))
        X = transformer.fit_transform(X=point)
        result = transformer.inverse_transform(X)
        expected = point
        self.assertAllClose(expected, result, atol=1e-4)

        transformer = ToTangentSpace(geometry=spd.SPDMetricAffine(3))
        X = transformer.fit_transform(X=point)
        result = transformer.inverse_transform(X)
        expected = point
        self.assertAllClose(expected, result, atol=1e-4)
    def test_spd_kmeans_fit(self):
        gs.random.seed(0)
        dim = 3
        n_points = 2
        space = spd_matrices.SPDMatrices(dim)
        data = space.random_point(n_samples=n_points)
        metric = spd_matrices.SPDMetricAffine(dim)

        kmeans = RiemannianKMeans(metric, n_clusters=1, lr=1.0)
        kmeans.fit(data)
        result = kmeans.centroids

        mean = FrechetMean(metric=metric, point_type="matrix", max_iter=100)
        mean.fit(data)
        expected = mean.estimate_
        self.assertAllClose(result, expected)