def setup_method(self): s2 = Hypersphere(dim=2) r2 = Euclidean(dim=2) r3 = s2.embedding_space initial_point = [0.0, 0.0, 1.0] initial_tangent_vec_a = [1.0, 0.0, 0.0] initial_tangent_vec_b = [0.0, 1.0, 0.0] initial_tangent_vec_c = [-1.0, 0.0, 0.0] curve_fun_a = s2.metric.geodesic( initial_point=initial_point, initial_tangent_vec=initial_tangent_vec_a ) curve_fun_b = s2.metric.geodesic( initial_point=initial_point, initial_tangent_vec=initial_tangent_vec_b ) curve_fun_c = s2.metric.geodesic( initial_point=initial_point, initial_tangent_vec=initial_tangent_vec_c ) self.curve_fun_a = curve_fun_a self.n_sampling_points = 10 self.sampling_times = gs.linspace(0.0, 1.0, self.n_sampling_points) self.curve_a = curve_fun_a(self.sampling_times) self.curve_b = curve_fun_b(self.sampling_times) self.curve_c = curve_fun_c(self.sampling_times) self.space_curves_in_euclidean_3d = DiscreteCurves(ambient_manifold=r3) self.space_curves_in_sphere_2d = DiscreteCurves(ambient_manifold=s2) self.space_closed_curves_in_euclidean_2d = ClosedDiscreteCurves( ambient_manifold=r2 ) self.l2_metric_s2 = L2CurvesMetric(ambient_manifold=s2) self.l2_metric_r3 = L2CurvesMetric(ambient_manifold=r3) self.srv_metric_r3 = ( self.space_curves_in_euclidean_3d.square_root_velocity_metric ) self.quotient_srv_metric_r3 = ( self.space_curves_in_euclidean_3d.quotient_square_root_velocity_metric ) self.a = 1 self.b = 1 self.elastic_metric = ElasticMetric(self.a, self.b) self.n_discretized_curves = 5 self.times = gs.linspace(0.0, 1.0, self.n_discretized_curves) gs.random.seed(1234)
def test_srv_metric_pointwise_inner_products(self, times, curve_a, curve_b, curve_c, n_discretized_curves, n_sampling_points): l2_metric_s2 = L2CurvesMetric(ambient_manifold=s2) srv_metric_r3 = SRVMetric(ambient_manifold=r3) curves_ab = l2_metric_s2.geodesic(curve_a, curve_b) curves_bc = l2_metric_s2.geodesic(curve_b, curve_c) curves_ab = curves_ab(times) curves_bc = curves_bc(times) tangent_vecs = l2_metric_s2.log(point=curves_bc, base_point=curves_ab) result = srv_metric_r3.l2_metric.pointwise_inner_products( tangent_vec_a=tangent_vecs, tangent_vec_b=tangent_vecs, base_curve=curves_ab) expected_shape = (n_discretized_curves, n_sampling_points) self.assertAllClose(gs.shape(result), expected_shape) result = srv_metric_r3.l2_metric.pointwise_inner_products( tangent_vec_a=tangent_vecs[0], tangent_vec_b=tangent_vecs[0], base_curve=curves_ab[0], ) expected_shape = (n_sampling_points, ) self.assertAllClose(gs.shape(result), expected_shape)
def test_l2_metric_geodesic(self, ambient_manifold, curve_a, curve_b, times, n_sampling_points): """Test the geodesic method of L2Metric.""" l2_metric_s2 = L2CurvesMetric(ambient_manifold=s2) curves_ab = l2_metric_s2.geodesic(curve_a, curve_b) curves_ab = curves_ab(times) result = curves_ab expected = [] for k in range(n_sampling_points): geod = l2_metric_s2.ambient_metric.geodesic( initial_point=curve_a[k, :], end_point=curve_b[k, :]) expected.append(geod(times)) expected = gs.stack(expected, axis=1) self.assertAllClose(result, expected)
def test_srv_transform_and_inverse(self, times, curve_a, curve_b): """Test of SRVT and its inverse. N.B: Here curves_ab are seen as curves in R3 and not S2. """ l2_metric_s2 = L2CurvesMetric(ambient_manifold=s2) srv_metric_r3 = SRVMetric(ambient_manifold=r3) curves_ab = l2_metric_s2.geodesic(curve_a, curve_b) curves_ab = curves_ab(times) curves = curves_ab srv_curves = srv_metric_r3.srv_transform(curves) starting_points = curves[:, 0, :] result = srv_metric_r3.srv_transform_inverse(srv_curves, starting_points) expected = curves self.assertAllClose(result, expected)
def test_srv_norm(self, curve_a, curve_b, times): l2_metric_s2 = L2CurvesMetric(ambient_manifold=s2) srv_metric_r3 = SRVMetric(ambient_manifold=r3) curves_ab = l2_metric_s2.geodesic(curve_a, curve_b) curves_ab = curves_ab(times) srvs_ab = srv_metric_r3.srv_transform(curves_ab) result = srv_metric_r3.l2_curves_metric.norm(srvs_ab) products = srvs_ab * srvs_ab sums = [gs.sum(product) for product in products] squared_norm = gs.array(sums) / (srvs_ab.shape[-2] + 1) expected = gs.sqrt(squared_norm) self.assertAllClose(result, expected) result = result.shape expected = [srvs_ab.shape[0]] self.assertAllClose(result, expected)
def test_srv_inner_product(self, curve_a, curve_b, curve_c, times): l2_metric_s2 = L2CurvesMetric(ambient_manifold=s2) srv_metric_r3 = SRVMetric(ambient_manifold=r3) curves_ab = l2_metric_s2.geodesic(curve_a, curve_b) curves_bc = l2_metric_s2.geodesic(curve_b, curve_c) curves_ab = curves_ab(times) curves_bc = curves_bc(times) srvs_ab = srv_metric_r3.srv_transform(curves_ab) srvs_bc = srv_metric_r3.srv_transform(curves_bc) result = srv_metric_r3.l2_curves_metric.inner_product(srvs_ab, srvs_bc) products = srvs_ab * srvs_bc expected = [gs.sum(product) for product in products] expected = gs.array(expected) / (srvs_ab.shape[-2] + 1) self.assertAllClose(result, expected) result = result.shape expected = [srvs_ab.shape[0]] self.assertAllClose(result, expected)