def test_exponential_map():
    p = np.array([
                    [np.cosh(0.), np.sinh(0.)],
                    [np.cosh(0.), np.sinh(0.)],
                    [np.cosh(0.5*np.pi), np.sinh(0.5*np.pi)],
              #      [np.cosh(np.pi), np.sinh(np.pi)]
                ])
    v = np.array([
                    [0.,         0.],
                    [0.,         0.25*np.pi],
                    [0.478393040868114, 0.521606959131886],
             #       [0.499066278634146, 0.500933721365854]
    ])
    expected = np.array([
                    [1., 0.],
                    [1.324609089252006, 0.86867096148601],
                    [3.04543575, 2.87657416],
    ])
    hyperb = Hyperboloid(1)
    print("")
    print(hyperb.exponential_map(p, v))
    print(expected)
    assert_array_almost_equal(hyperb.exponential_map(p, v), expected)
def test_logarithmic_map():
    # Leverage trusted exponential map to verify logarithmic map
    p0 = np.array([
                    [np.cosh(0.), np.sinh(0.)],
                    [np.cosh(0.), np.sinh(0.)],
                    [np.cosh(1), np.sinh(1)],
                    [np.cosh(1), np.sinh(1)],
                ])
    p1 = np.array([
                    [np.cosh(0.), np.sinh(0.)],
                    [np.cosh(1.), np.sinh(1.)],
                    [np.cosh(-1.), np.sinh(-1.)],
                    [np.cosh(-np.pi), np.sinh(-np.pi)]
    ])

    hyperb = Hyperboloid(1)
    vectors = hyperb.logarithmic_map(p0, p1)
    p1_from_v = hyperb.exponential_map(p0, vectors)
    assert_array_equal(
                        hyperb.is_on_manifold(p1_from_v),
                        np.ones((p1_from_v.shape[0], 1), dtype=bool)
    )
    assert_array_almost_equal(p1, p1_from_v)