class TestVisualization(geomstats.tests.TestCase): def setUp(self): self.n_samples = 10 self.SO3_GROUP = SpecialOrthogonal(n=3, point_type='vector') self.SE3_GROUP = SpecialEuclidean(n=3, point_type='vector') self.S1 = Hypersphere(dim=1) self.S2 = Hypersphere(dim=2) self.H2 = Hyperbolic(dim=2) self.H2_half_plane = PoincareHalfSpace(dim=2) plt.figure() @staticmethod def test_tutorial_matplotlib(): visualization.tutorial_matplotlib() def test_plot_points_so3(self): points = self.SO3_GROUP.random_uniform(self.n_samples) visualization.plot(points, space='SO3_GROUP') def test_plot_points_se3(self): points = self.SE3_GROUP.random_uniform(self.n_samples) visualization.plot(points, space='SE3_GROUP') @geomstats.tests.np_and_pytorch_only def test_plot_points_s1(self): points = self.S1.random_uniform(self.n_samples) visualization.plot(points, space='S1') def test_plot_points_s2(self): points = self.S2.random_uniform(self.n_samples) visualization.plot(points, space='S2') def test_plot_points_h2_poincare_disk(self): points = self.H2.random_uniform(self.n_samples) visualization.plot(points, space='H2_poincare_disk') def test_plot_points_h2_poincare_half_plane_ext(self): points = self.H2.random_uniform(self.n_samples) visualization.plot(points, space='H2_poincare_half_plane', point_type='extrinsic') def test_plot_points_h2_poincare_half_plane_none(self): points = self.H2_half_plane.random_uniform(self.n_samples) visualization.plot(points, space='H2_poincare_half_plane') def test_plot_points_h2_poincare_half_plane_hs(self): points = self.H2_half_plane.random_uniform(self.n_samples) visualization.plot(points, space='H2_poincare_half_plane', point_type='half_space') def test_plot_points_h2_klein_disk(self): points = self.H2.random_uniform(self.n_samples) visualization.plot(points, space='H2_klein_disk')
def setUp(self): self.n_samples = 10 self.SO3_GROUP = SpecialOrthogonal(n=3, point_type='vector') self.SE3_GROUP = SpecialEuclidean(n=3, point_type='vector') self.S1 = Hypersphere(dim=1) self.S2 = Hypersphere(dim=2) self.H2 = Hyperbolic(dim=2) self.H2_half_plane = PoincareHalfSpace(dim=2) plt.figure()
def setUp(self): self.n_samples = 10 self.SO3_GROUP = SpecialOrthogonal(n=3, point_type='vector') self.SE3_GROUP = SpecialEuclidean(n=3, point_type='vector') self.S1 = Hypersphere(dim=1) self.S2 = Hypersphere(dim=2) self.H2 = Hyperbolic(dim=2) self.H2_half_plane = PoincareHalfSpace(dim=2) self.M32 = Matrices(m=3, n=2) self.S32 = PreShapeSpace(k_landmarks=3, m_ambient=2) self.KS = visualization.KendallSphere() self.M33 = Matrices(m=3, n=3) self.S33 = PreShapeSpace(k_landmarks=3, m_ambient=3) self.KD = visualization.KendallDisk() plt.figure()
def __new__(cls, *args, default_coords_type='extrinsic', **kwargs): """Instantiate class that corresponds to the default_coords_type.""" errors.check_parameter_accepted_values( default_coords_type, 'default_coords_type', ['extrinsic', 'ball', 'half-space']) if default_coords_type == 'extrinsic': return Hyperboloid(*args, **kwargs) if default_coords_type == 'ball': return PoincareBall(*args, **kwargs) return PoincareHalfSpace(*args, **kwargs)
def __new__(cls, *args, default_coords_type="extrinsic", **kwargs): """Instantiate class that corresponds to the default_coords_type.""" errors.check_parameter_accepted_values( default_coords_type, "default_coords_type", ["extrinsic", "ball", "half-space"], ) if default_coords_type == "extrinsic": return Hyperboloid(*args, **kwargs) if default_coords_type == "ball": return PoincareBall(*args, **kwargs) return PoincareHalfSpace(*args, **kwargs)
class TestVisualization(geomstats.tests.TestCase): def setUp(self): self.n_samples = 10 self.SO3_GROUP = SpecialOrthogonal(n=3, point_type='vector') self.SE3_GROUP = SpecialEuclidean(n=3, point_type='vector') self.S1 = Hypersphere(dim=1) self.S2 = Hypersphere(dim=2) self.H2 = Hyperbolic(dim=2) self.H2_half_plane = PoincareHalfSpace(dim=2) self.M32 = Matrices(m=3, n=2) self.S32 = PreShapeSpace(k_landmarks=3, m_ambient=2) self.KS = visualization.KendallSphere() self.M33 = Matrices(m=3, n=3) self.S33 = PreShapeSpace(k_landmarks=3, m_ambient=3) self.KD = visualization.KendallDisk() plt.figure() @staticmethod def test_tutorial_matplotlib(): visualization.tutorial_matplotlib() def test_plot_points_so3(self): points = self.SO3_GROUP.random_uniform(self.n_samples) visualization.plot(points, space='SO3_GROUP') def test_plot_points_se3(self): points = self.SE3_GROUP.random_point(self.n_samples) visualization.plot(points, space='SE3_GROUP') def test_draw_pre_shape_2d(self): self.KS.draw() def test_draw_points_pre_shape_2d(self): points = self.S32.random_point(self.n_samples) visualization.plot(points, space='S32') points = self.M32.random_point(self.n_samples) visualization.plot(points, space='M32') self.KS.clear_points() def test_draw_curve_pre_shape_2d(self): self.KS.draw() base_point = self.S32.random_point() vec = self.S32.random_point() tangent_vec = self.S32.to_tangent(vec, base_point) times = gs.linspace(0., 1., 1000) speeds = gs.array([-t * tangent_vec for t in times]) points = self.S32.ambient_metric.exp(speeds, base_point) self.KS.add_points(points) self.KS.draw_curve() self.KS.clear_points() def test_draw_vector_pre_shape_2d(self): self.KS.draw() base_point = self.S32.random_point() vec = self.S32.random_point() tangent_vec = self.S32.to_tangent(vec, base_point) self.KS.draw_vector(tangent_vec, base_point) def test_convert_to_spherical_coordinates_pre_shape_2d(self): points = self.S32.random_point(self.n_samples) coords = self.KS.convert_to_spherical_coordinates(points) x = coords[:, 0] y = coords[:, 1] z = coords[:, 2] result = x**2 + y**2 + z**2 expected = .25 * gs.ones(self.n_samples) self.assertAllClose(result, expected) def test_rotation_pre_shape_2d(self): theta = gs.random.rand(1)[0] phi = gs.random.rand(1)[0] rot = self.KS.rotation(theta, phi) result = _SpecialOrthogonalMatrices(3).belongs(rot) expected = True self.assertAllClose(result, expected) def test_draw_pre_shape_3d(self): self.KD.draw() def test_draw_points_pre_shape_3d(self): points = self.S33.random_point(self.n_samples) visualization.plot(points, space='S33') points = self.M33.random_point(self.n_samples) visualization.plot(points, space='M33') self.KD.clear_points() def test_draw_curve_pre_shape_3d(self): self.KD.draw() base_point = self.S33.random_point() vec = self.S33.random_point() tangent_vec = self.S33.to_tangent(vec, base_point) tangent_vec = .5 * tangent_vec / self.S33.ambient_metric.norm( tangent_vec) times = gs.linspace(0., 1., 1000) speeds = gs.array([-t * tangent_vec for t in times]) points = self.S33.ambient_metric.exp(speeds, base_point) self.KD.add_points(points) self.KD.draw_curve() self.KD.clear_points() def test_draw_vector_pre_shape_3d(self): self.KS.draw() base_point = self.S32.random_point() vec = self.S32.random_point() tangent_vec = self.S32.to_tangent(vec, base_point) self.KS.draw_vector(tangent_vec, base_point) def test_convert_to_planar_coordinates_pre_shape_3d(self): points = self.S33.random_point(self.n_samples) coords = self.KD.convert_to_planar_coordinates(points) x = coords[:, 0] y = coords[:, 1] radius = x**2 + y**2 result = [r <= 1. for r in radius] self.assertTrue(gs.all(result)) @geomstats.tests.np_and_pytorch_only def test_plot_points_s1(self): points = self.S1.random_uniform(self.n_samples) visualization.plot(points, space='S1') def test_plot_points_s2(self): points = self.S2.random_uniform(self.n_samples) visualization.plot(points, space='S2') def test_plot_points_h2_poincare_disk(self): points = self.H2.random_point(self.n_samples) visualization.plot(points, space='H2_poincare_disk') def test_plot_points_h2_poincare_half_plane_ext(self): points = self.H2.random_point(self.n_samples) visualization.plot(points, space='H2_poincare_half_plane', point_type='extrinsic') def test_plot_points_h2_poincare_half_plane_none(self): points = self.H2_half_plane.random_point(self.n_samples) visualization.plot(points, space='H2_poincare_half_plane') def test_plot_points_h2_poincare_half_plane_hs(self): points = self.H2_half_plane.random_point(self.n_samples) visualization.plot(points, space='H2_poincare_half_plane', point_type='half_space') def test_plot_points_h2_klein_disk(self): points = self.H2.random_point(self.n_samples) visualization.plot(points, space='H2_klein_disk') @staticmethod def test_plot_points_se2(): points = SpecialEuclidean(n=2, point_type='vector').random_point(4) visu = visualization.SpecialEuclidean2(points, point_type='vector') ax = visu.set_ax() visu.draw(ax)
from geomstats.geometry.hypersphere import Hypersphere from geomstats.geometry.matrices import Matrices from geomstats.geometry.poincare_half_space import PoincareHalfSpace from geomstats.geometry.pre_shape import KendallShapeMetric, PreShapeSpace from geomstats.geometry.special_euclidean import SpecialEuclidean from geomstats.geometry.special_orthogonal import SpecialOrthogonal from mpl_toolkits.mplot3d import Axes3D # NOQA SE3_GROUP = SpecialEuclidean(n=3, point_type='vector') SE2_GROUP = SpecialEuclidean(n=2, point_type='matrix') SE2_VECT = SpecialEuclidean(n=2, point_type='vector') SO3_GROUP = SpecialOrthogonal(n=3, point_type='vector') S1 = Hypersphere(dim=1) S2 = Hypersphere(dim=2) H2 = Hyperboloid(dim=2) POINCARE_HALF_PLANE = PoincareHalfSpace(dim=2) M32 = Matrices(m=3, n=2) S32 = PreShapeSpace(k_landmarks=3, m_ambient=2) METRIC_S32 = KendallShapeMetric(k_landmarks=3, m_ambient=2) M33 = Matrices(m=3, n=3) S33 = PreShapeSpace(k_landmarks=3, m_ambient=3) METRIC_S33 = KendallShapeMetric(k_landmarks=3, m_ambient=3) AX_SCALE = 1.2 IMPLEMENTED = [ 'SO3_GROUP', 'SE3_GROUP', 'SE2_GROUP', 'S1', 'S2', 'H2_poincare_disk', 'H2_poincare_half_plane', 'H2_klein_disk', 'poincare_polydisk', 'S32', 'M32', 'S33', 'M33' ]
class TestVisualization(geomstats.tests.TestCase): def setup_method(self): self.n_samples = 10 self.SO3_GROUP = SpecialOrthogonal(n=3, point_type="vector") self.SE3_GROUP = SpecialEuclidean(n=3, point_type="vector") self.S1 = Hypersphere(dim=1) self.S2 = Hypersphere(dim=2) self.H2 = Hyperbolic(dim=2) self.H2_half_plane = PoincareHalfSpace(dim=2) self.M32 = Matrices(m=3, n=2) self.S32 = PreShapeSpace(k_landmarks=3, m_ambient=2) self.KS = visualization.KendallSphere() self.M33 = Matrices(m=3, n=3) self.S33 = PreShapeSpace(k_landmarks=3, m_ambient=3) self.KD = visualization.KendallDisk() self.spd = SPDMatrices(n=2) plt.figure() @staticmethod def test_tutorial_matplotlib(): visualization.tutorial_matplotlib() def test_plot_points_so3(self): points = self.SO3_GROUP.random_uniform(self.n_samples) visualization.plot(points, space="SO3_GROUP") def test_plot_points_se3(self): points = self.SE3_GROUP.random_point(self.n_samples) visualization.plot(points, space="SE3_GROUP") def test_draw_pre_shape_2d(self): self.KS.draw() def test_draw_points_pre_shape_2d(self): points = self.S32.random_point(self.n_samples) visualization.plot(points, space="S32") points = self.M32.random_point(self.n_samples) visualization.plot(points, space="M32") self.KS.clear_points() def test_draw_curve_pre_shape_2d(self): self.KS.draw() base_point = self.S32.random_point() vec = self.S32.random_point() tangent_vec = self.S32.to_tangent(vec, base_point) times = gs.linspace(0.0, 1.0, 1000) speeds = gs.array([-t * tangent_vec for t in times]) points = self.S32.ambient_metric.exp(speeds, base_point) self.KS.add_points(points) self.KS.draw_curve() self.KS.clear_points() def test_draw_vector_pre_shape_2d(self): self.KS.draw() base_point = self.S32.random_point() vec = self.S32.random_point() tangent_vec = self.S32.to_tangent(vec, base_point) self.KS.draw_vector(tangent_vec, base_point) def test_convert_to_spherical_coordinates_pre_shape_2d(self): points = self.S32.random_point(self.n_samples) coords = self.KS.convert_to_spherical_coordinates(points) x = coords[:, 0] y = coords[:, 1] z = coords[:, 2] result = x**2 + y**2 + z**2 expected = 0.25 * gs.ones(self.n_samples) self.assertAllClose(result, expected) def test_rotation_pre_shape_2d(self): theta = gs.random.rand(1)[0] phi = gs.random.rand(1)[0] rot = self.KS.rotation(theta, phi) result = _SpecialOrthogonalMatrices(3).belongs(rot) expected = True self.assertAllClose(result, expected) def test_draw_pre_shape_3d(self): self.KD.draw() def test_draw_points_pre_shape_3d(self): points = self.S33.random_point(self.n_samples) visualization.plot(points, space="S33") points = self.M33.random_point(self.n_samples) visualization.plot(points, space="M33") self.KD.clear_points() def test_draw_curve_pre_shape_3d(self): self.KD.draw() base_point = self.S33.random_point() vec = self.S33.random_point() tangent_vec = self.S33.to_tangent(vec, base_point) tangent_vec = 0.5 * tangent_vec / self.S33.ambient_metric.norm( tangent_vec) times = gs.linspace(0.0, 1.0, 1000) speeds = gs.array([-t * tangent_vec for t in times]) points = self.S33.ambient_metric.exp(speeds, base_point) self.KD.add_points(points) self.KD.draw_curve() self.KD.clear_points() def test_draw_vector_pre_shape_3d(self): self.KS.draw() base_point = self.S32.random_point() vec = self.S32.random_point() tangent_vec = self.S32.to_tangent(vec, base_point) self.KS.draw_vector(tangent_vec, base_point) def test_convert_to_planar_coordinates_pre_shape_3d(self): points = self.S33.random_point(self.n_samples) coords = self.KD.convert_to_planar_coordinates(points) x = coords[:, 0] y = coords[:, 1] radius = x**2 + y**2 result = [r <= 1.0 for r in radius] self.assertTrue(gs.all(result)) @geomstats.tests.np_autograd_and_torch_only def test_plot_points_s1(self): points = self.S1.random_uniform(self.n_samples) visualization.plot(points, space="S1") def test_plot_points_s2(self): points = self.S2.random_uniform(self.n_samples) visualization.plot(points, space="S2") def test_plot_points_h2_poincare_disk(self): points = self.H2.random_point(self.n_samples) visualization.plot(points, space="H2_poincare_disk") def test_plot_points_h2_poincare_half_plane_ext(self): points = self.H2.random_point(self.n_samples) visualization.plot(points, space="H2_poincare_half_plane", point_type="extrinsic") def test_plot_points_h2_poincare_half_plane_none(self): points = self.H2_half_plane.random_point(self.n_samples) visualization.plot(points, space="H2_poincare_half_plane") def test_plot_points_h2_poincare_half_plane_hs(self): points = self.H2_half_plane.random_point(self.n_samples) visualization.plot(points, space="H2_poincare_half_plane", point_type="half_space") def test_plot_points_h2_klein_disk(self): points = self.H2.random_point(self.n_samples) visualization.plot(points, space="H2_klein_disk") @staticmethod def test_plot_points_se2(): points = SpecialEuclidean(n=2, point_type="vector").random_point(4) visu = visualization.SpecialEuclidean2(points, point_type="vector") ax = visu.set_ax() visu.draw_points(ax) def test_plot_points_spd2(self): one_point = self.spd.random_point() visualization.plot(one_point, space="SPD2") points = self.spd.random_point(4) visualization.plot(points, space="SPD2") def test_compute_coordinates_spd2(self): point = gs.eye(2) ellipsis = visualization.Ellipses(n_sampling_points=4) x, y = ellipsis.compute_coordinates(point) self.assertAllClose(x, gs.array([1, 0, -1, 0, 1])) self.assertAllClose(y, gs.array([0, 1, 0, -1, 0])) @staticmethod def teardown_method(): plt.close()
class TestPoincareHalfSpace(geomstats.tests.TestCase): def setup_method(self): self.manifold = PoincareHalfSpace(2) self.metric = self.manifold.metric self.hyperboloid_manifold = Hyperboloid(2) self.hyperboloid_metric = self.hyperboloid_manifold.metric def test_belongs(self): point = gs.array([1.5, 2.3]) result = self.manifold.belongs(point) self.assertTrue(result) points = gs.array([[1.5, 2.0], [2.5, -0.3]]) result = self.manifold.belongs(points) expected = gs.array([True, False]) self.assertAllClose(result, expected) def test_inner_product_vectorization(self): tangent_vec = gs.array([[1.0, 2.0], [3.0, 4.0]]) base_point = gs.array([[0.0, 1.0], [0.0, 5.0]]) result = self.metric.inner_product(tangent_vec, tangent_vec, base_point) expected = gs.array([5.0, 1.0]) self.assertAllClose(result, expected) def test_half_space_to_ball_coordinates(self): point_half_space = gs.array([0.0, 1.0]) result = self.manifold.half_space_to_ball_coordinates(point_half_space) expected = gs.zeros(2) self.assertAllClose(result, expected) def test_half_space_to_ball_coordinates_vectorization(self): point_half_space = gs.array([[0.0, 1.0], [0.0, 2.0]]) point_ball = self.manifold.half_space_to_ball_coordinates(point_half_space) expected = gs.array([[0.0, 0.0], [0.0, 1.0 / 3.0]]) self.assertAllClose(point_ball, expected) def test_ball_to_half_space_coordinates(self): point_ball = gs.array([-0.3, 0.7]) point_half_space = self.manifold.ball_to_half_space_coordinates(point_ball) point_ext = self.hyperboloid_manifold.from_coordinates(point_ball, "ball") point_half_space_expected = self.hyperboloid_manifold.to_coordinates( point_ext, "half-space" ) self.assertAllClose(point_half_space, point_half_space_expected) def test_coordinates(self): point_half_space = gs.array([1.5, 2.3]) point_ball = self.manifold.half_space_to_ball_coordinates(point_half_space) result = self.manifold.ball_to_half_space_coordinates(point_ball) self.assertAllClose(result, point_half_space) def test_exp_and_coordinates_tangent(self): base_point = gs.array([1.5, 2.3]) tangent_vec = gs.array([0.0, 1.0]) end_point = self.metric.exp(tangent_vec, base_point) self.assertAllClose(base_point[0], end_point[0]) def test_ball_half_plane_are_inverse(self): base_point = gs.array([1.5, 2.3]) base_point_ball = self.manifold.half_space_to_ball_coordinates(base_point) result = self.manifold.ball_to_half_space_coordinates(base_point_ball) self.assertAllClose(result, base_point) def test_ball_half_plane_tangent_are_inverse(self): base_point = gs.array([1.5, 2.3]) tangent_vec = gs.array([0.5, 1.0]) tangent_vec_ball = self.manifold.half_space_to_ball_tangent( tangent_vec, base_point ) base_point_ball = self.manifold.half_space_to_ball_coordinates(base_point) result = self.manifold.ball_to_half_space_tangent( tangent_vec_ball, base_point_ball ) self.assertAllClose(result, tangent_vec) @geomstats.tests.np_and_autograd_only def test_exp(self): point = gs.array([1.0, 1.0]) tangent_vec = gs.array([2.0, 1.0]) end_point = self.metric.exp(tangent_vec, point) circle_center = point[0] + point[1] * tangent_vec[1] / tangent_vec[0] circle_radius = gs.sqrt((circle_center - point[0]) ** 2 + point[1] ** 2) moebius_d = 1 moebius_c = 1 / (2 * circle_radius) moebius_b = circle_center - circle_radius moebius_a = (circle_center + circle_radius) * moebius_c point_complex = point[0] + 1j * point[1] tangent_vec_complex = tangent_vec[0] + 1j * tangent_vec[1] point_moebius = ( 1j * (moebius_d * point_complex - moebius_b) / (moebius_c * point_complex - moebius_a) ) tangent_vec_moebius = ( -1j * tangent_vec_complex * (1j * moebius_c * point_moebius + moebius_d) ** 2 ) end_point_moebius = point_moebius * gs.exp(tangent_vec_moebius / point_moebius) end_point_complex = (moebius_a * 1j * end_point_moebius + moebius_b) / ( moebius_c * 1j * end_point_moebius + moebius_d ) end_point_expected = gs.hstack( [np.real(end_point_complex), np.imag(end_point_complex)] ) self.assertAllClose(end_point, end_point_expected) @geomstats.tests.np_and_autograd_only def test_exp_vectorization(self): point = gs.array([[1.0, 1.0], [1.0, 1.0]]) tangent_vec = gs.array([[2.0, 1.0], [2.0, 1.0]]) result = self.metric.exp(tangent_vec, point) point = point[0] tangent_vec = tangent_vec[0] circle_center = point[0] + point[1] * tangent_vec[1] / tangent_vec[0] circle_radius = gs.sqrt((circle_center - point[0]) ** 2 + point[1] ** 2) moebius_d = 1 moebius_c = 1 / (2 * circle_radius) moebius_b = circle_center - circle_radius moebius_a = (circle_center + circle_radius) * moebius_c point_complex = point[0] + 1j * point[1] tangent_vec_complex = tangent_vec[0] + 1j * tangent_vec[1] point_moebius = ( 1j * (moebius_d * point_complex - moebius_b) / (moebius_c * point_complex - moebius_a) ) tangent_vec_moebius = ( -1j * tangent_vec_complex * (1j * moebius_c * point_moebius + moebius_d) ** 2 ) end_point_moebius = point_moebius * gs.exp(tangent_vec_moebius / point_moebius) end_point_complex = (moebius_a * 1j * end_point_moebius + moebius_b) / ( moebius_c * 1j * end_point_moebius + moebius_d ) end_point_expected = gs.hstack( [np.real(end_point_complex), np.imag(end_point_complex)] ) expected = gs.stack([end_point_expected, end_point_expected]) self.assertAllClose(result, expected) def test_exp_and_log_are_inverse(self): points = gs.array([[1.0, 1.0], [1.0, 1.0]]) tangent_vecs = gs.array([[2.0, 1.0], [2.0, 1.0]]) end_points = self.metric.exp(tangent_vecs, points) result = self.metric.log(end_points, points) expected = tangent_vecs self.assertAllClose(result, expected) def test_projection(self): point = gs.array([[1.0, -1.0], [0.0, 1.0]]) projected = self.manifold.projection(point) result = self.manifold.belongs(projected) self.assertTrue(gs.all(result)) projected = self.manifold.projection(point[0]) result = self.manifold.belongs(projected) self.assertTrue(result)
def setup_method(self): self.manifold = PoincareHalfSpace(2) self.metric = self.manifold.metric self.hyperboloid_manifold = Hyperboloid(2) self.hyperboloid_metric = self.hyperboloid_manifold.metric
class PoincareHalfSpaceMetricTestData(_RiemannianMetricTestData): dim_list = random.sample(range(2, 5), 2) metric_args_list = [(dim, ) for dim in dim_list] shape_list = [(dim, ) for dim in dim_list] space_list = [PoincareHalfSpace(dim) for dim in dim_list] n_points_list = random.sample(range(1, 5), 2) n_tangent_vecs_list = random.sample(range(1, 5), 2) n_points_a_list = random.sample(range(1, 5), 2) n_points_b_list = [1] alpha_list = [1] * 2 n_rungs_list = [1] * 2 scheme_list = ["pole"] * 2 def inner_product_test_data(self): smoke_data = [ dict( dim=2, tangent_vec_a=[[1.0, 2.0], [3.0, 4.0]], tangent_vec_b=[[1.0, 2.0], [3.0, 4.0]], base_point=[[0.0, 1.0], [0.0, 5.0]], expected=[5.0, 1.0], ) ] return self.generate_tests(smoke_data) def exp_and_coordinates_tangent_test_data(self): smoke_data = [ dict( dim=2, tangent_vec=gs.array([0.0, 1.0]), base_point=gs.array([1.5, 2.3]), ) ] return self.generate_tests(smoke_data) def exp_test_data(self): def _exp(tangent_vec, base_point): circle_center = (base_point[0] + base_point[1] * tangent_vec[1] / tangent_vec[0]) circle_radius = gs.sqrt((circle_center - base_point[0])**2 + base_point[1]**2) moebius_d = 1 moebius_c = 1 / (2 * circle_radius) moebius_b = circle_center - circle_radius moebius_a = (circle_center + circle_radius) * moebius_c point_complex = base_point[0] + 1j * base_point[1] tangent_vec_complex = tangent_vec[0] + 1j * tangent_vec[1] point_moebius = (1j * (moebius_d * point_complex - moebius_b) / (moebius_c * point_complex - moebius_a)) tangent_vec_moebius = ( -1j * tangent_vec_complex * (1j * moebius_c * point_moebius + moebius_d)**2) end_point_moebius = point_moebius * gs.exp( tangent_vec_moebius / point_moebius) end_point_complex = ( moebius_a * 1j * end_point_moebius + moebius_b) / (moebius_c * 1j * end_point_moebius + moebius_d) end_point_expected = gs.hstack( [np.real(end_point_complex), np.imag(end_point_complex)]) return end_point_expected inputs_to_exp = [(gs.array([2.0, 1.0]), gs.array([1.0, 1.0]))] smoke_data = [] if not geomstats.tests.tf_backend(): for tangent_vec, base_point in inputs_to_exp: smoke_data.append( dict( dim=2, tangent_vec=tangent_vec, base_point=base_point, expected=_exp(tangent_vec, base_point), )) 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 * 10000, ) 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 * 10900, ) 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 exp_after_log_test_data(self): return self._exp_after_log_test_data( self.metric_args_list, self.space_list, self.n_points_list, rtol=gs.rtol * 100, atol=gs.atol * 10000, ) def log_after_exp_test_data(self): return self._log_after_exp_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 * 100000, atol=gs.atol * 100000, ) 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_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_positive_test_data(self): return self._dist_is_positive_test_data( self.metric_args_list, self.space_list, self.n_points_a_list, self.n_points_b_list, ) def squared_dist_is_positive_test_data(self): return self._squared_dist_is_positive_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 triangle_inequality_of_dist_test_data(self): return self._triangle_inequality_of_dist_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, ) def retraction_lifting_test_data(self): return self._log_after_exp_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, )