def test_sub(self): for _ in range(10): u1, u2, v1, v2 = np.random.randn(4) u, v = sjs.Dvec2(u1, u2), sjs.Dvec2(v1, v2) w = u - v self.assertAlmostEqual(w.x, u1 - v1) self.assertAlmostEqual(w.y, u2 - v2)
def test_outer(self): for _ in range(10): u_gt, v_gt = np.random.randn(2, 2) u, v = sjs.Dvec2(*u_gt), sjs.Dvec2(*v_gt) uv, uv_gt = sjs.outer(u, v), np.outer(u_gt, v_gt) for i, j in it.product(range(2), repeat=2): self.assertAlmostEqual(uv[i, j], uv_gt[i, j])
def test_cproj(self): for _ in range(10): u, v = np.random.randn(2, 2) w = sjs.cproj(sjs.Dvec2(*u), sjs.Dvec2(*v)) w_gt = (np.eye(2) - np.outer(u, u)) @ v self.assertAlmostEqual(w[0], w_gt[0]) self.assertAlmostEqual(w[1], w_gt[1])
def test_add(self): for _ in range(10): u1, u2, v1, v2 = np.random.randn(4) u, v = sjs.Dvec2(u1, u2), sjs.Dvec2(v1, v2) w = u + v self.assertAlmostEqual(w.x, u1 + v1) self.assertAlmostEqual(w.y, u2 + v2)
def test_hybrid_constant_slowness(self): cubic = sjs.Cubic([0, 0, 0, 0]) xy0 = sjs.Dvec2(1, 0) xy1 = sjs.Dvec2(0, 1) xy = sjs.Dvec2(0, 0) h = 1 slow = sjs.get_constant_slowness_field2() context = sjs.F3Context(cubic, xy, xy0, xy1, slow) def func(lam): context.compute(lam) return context.F3_eta lam = sjs.hybrid(func, 0, 1) self.assertAlmostEqual(lam, 0.5) self.assertAlmostEqual(context.F3, 1.0 / np.sqrt(2)) self.assertAlmostEqual(context.F3_eta, 0.0) context.T_cubic = sjs.Cubic([0, 1, 1, 1]) lam = sjs.hybrid(func, 0, 1) self.assertAlmostEqual(lam, 0.0) self.assertAlmostEqual(context.F3, 1.0) self.assertAlmostEqual(context.F3_eta, 0.0) context.T_cubic = sjs.Cubic([1, 0, -1, -1]) lam = sjs.hybrid(func, 0, 1) self.assertAlmostEqual(lam, 1.0) self.assertAlmostEqual(context.F3, 1.0) self.assertAlmostEqual(context.F3_eta, 0.0) context.T_cubic = sjs.Cubic([1, 1, -1, 1]) lam = sjs.hybrid(func, 0, 1) self.assertAlmostEqual(lam, 0.5) self.assertAlmostEqual(context.F3_eta, 0.0)
def test_dvec2_to_ivec2(self): for _ in range(10): u1, u2 = np.random.randn(2) u = sjs.Dvec2(u1, u2) v = sjs.Ivec2(u) self.assertAlmostEqual(v.i, int(u1)) self.assertAlmostEqual(v.j, int(u2))
def test_dbl_div(self): for _ in range(10): u1, u2, a = np.random.randn(3) u = sjs.Dvec2(u1, u2) v = u / a self.assertAlmostEqual(v.x, u1 / a) self.assertAlmostEqual(v.y, u2 / a)
def test_floor(self): for _ in range(10): u1, u2 = np.random.randn(2) u = sjs.Dvec2(u1, u2) v = u.floor() self.assertAlmostEqual(v.x, np.floor(u1)) self.assertAlmostEqual(v.y, np.floor(u2))
def test_solve(self): for _ in range(10): A_gt = np.random.randn(2, 2) b_gt = np.random.randn(2) A, b = sjs.Dmat22(A_gt), sjs.Dvec2(*b_gt) x, x_gt = A.solve(b), np.linalg.solve(A_gt, b_gt) self.assertAlmostEqual(x[0], x_gt[0]) self.assertAlmostEqual(x[1], x_gt[1])
def test_evaluate_linear_speed(self): for _ in range(10): h = 0.1 x0, y0 = np.random.uniform(-1, 1 - h, (2, )) x1, y1 = x0 + h, y0 + h x, y = x0 - h, y0 xy = sjs.Dvec2(x, y) xy0 = sjs.Dvec2(x0, y0) xy1 = sjs.Dvec2(x0, y1) vx, vy = np.random.uniform(-0.05, 0.05, (2, )) tau_xy = get_linear_speed_tau(vx, vy) tau = lambda eta: tau_xy(x0, y0 + eta * (y1 - y0)) tau_eta = autograd.grad(tau) s_gt = get_linear_speed_s(vx, vy) slow = sjs.get_linear_speed_field2(vx, vy) cubic = sjs.Cubic([tau(0.0), tau(1.0), tau_eta(0.0), tau_eta(1.0)]) context = sjs.F3Context(cubic, xy, xy0, xy1, slow) a_T = np.array([cubic.a[0], cubic.a[1], cubic.a[2], cubic.a[3]]) p, p0, p1 = np.array([x, y]), np.array([x0, y0]), np.array([x0, y1]) context_gt = F3(s_gt, a_T, p, p0, p1) for _ in range(10): eta = np.random.random() T, T_gt = cubic.f(eta), context_gt.T(eta) T_eta, T_eta_gt = cubic.df(eta), context_gt.T_eta(eta) self.assertAlmostEqual(T, T_gt) self.assertAlmostEqual(T_eta, T_eta_gt) context.compute(eta) f3, f3_eta = context.F3, context.F3_eta f3_gt, f3_eta_gt = context_gt.F3(eta), context_gt.grad_F3(eta) self.assertAlmostEqual(f3, f3_gt) self.assertAlmostEqual(f3_eta, f3_eta_gt)
def test_evaluate(self): eps = 1e-7 for _ in range(10): vx, vy = np.random.uniform(-0.05, 0.05, (2,)) s_gt = get_linear_speed_s(vx, vy) slow = sjs.get_linear_speed_field2(vx, vy) data = np.random.randn(4, 4) h = np.random.random() H = np.diag([1, 1, h, h]) data = H@data@H p = np.random.randn(2) p0 = p + h*np.random.randn(2) p1 = p + h*np.random.randn(2) bicubic = sjs.Bicubic(data) T = bicubic.get_f_on_edge(sjs.BicubicVariable.Lambda, 0) Tx = bicubic.get_fx_on_edge(sjs.BicubicVariable.Lambda, 0) Ty = bicubic.get_fy_on_edge(sjs.BicubicVariable.Lambda, 0) a_T = np.array([T.a[i] for i in range(4)]) a_Tx = np.array([Tx.a[i] for i in range(4)]) a_Ty = np.array([Ty.a[i] for i in range(4)]) context_gt = F4(s_gt, a_T, a_Tx, a_Ty, p, p0, p1) xy = sjs.Dvec2(*p) xy0 = sjs.Dvec2(*p0) xy1 = sjs.Dvec2(*p1) context = sjs.F4Context(T, Tx, Ty, xy, xy0, xy1, slow) for _ in range(10): args = np.random.random(2) args[1] *= 2*np.pi context.compute(*args) f4_gt = context_gt.F4(args) f4_eta_gt, f4_th_gt = context_gt.grad_F4(args) self.assertAlmostEqual(f4_gt, context.F4) self.assertAlmostEqual(f4_eta_gt, context.F4_eta) self.assertAlmostEqual(f4_th_gt, context.F4_th)
def test_dbl_mul(self): for _ in range(10): u1, u2, a = np.random.randn(3) u = sjs.Dvec2(u1, u2) v = u * a self.assertAlmostEqual(v.x, a * u1) self.assertAlmostEqual(v.y, a * u2) u *= a self.assertAlmostEqual(v.x, u.x) self.assertAlmostEqual(v.y, u.y)
def test_evaluate_constant_slowness(self): cubic = sjs.Cubic([0, 0, 0, 0]) xy0 = sjs.Dvec2(1, 0) xy1 = sjs.Dvec2(0, 1) xy = sjs.Dvec2(0, 0) h = 1 slow = sjs.get_constant_slowness_field2() context = sjs.F3Context(cubic, xy, xy0, xy1, slow) context.compute(0) self.assertAlmostEqual(context.F3, 1.0) self.assertAlmostEqual(context.F3_eta, -1.0) context.compute(1) self.assertAlmostEqual(context.F3, 1.0) self.assertAlmostEqual(context.F3_eta, 1.0) context.compute(1 / 2) self.assertAlmostEqual(context.F3, 1.0 / np.sqrt(2))
def test_mul(self): for _ in range(10): A_data, B_data = np.random.randn(2, 2, 2) C_gt = A_data @ B_data A = sjs.Dmat22(A_data) B = sjs.Dmat22(B_data) C = A @ B for i, j in it.product(range(2), repeat=2): self.assertAlmostEqual(C[i, j], C_gt[i, j]) x_data = np.random.randn(2) x = sjs.Dvec2(*x_data) y, y_gt = A @ x, A_data @ x_data self.assertAlmostEqual(y[0], y_gt[0]) self.assertAlmostEqual(y[1], y_gt[1])
def test_dot(self): for _ in range(10): u1, u2, v1, v2 = np.random.randn(4) u, v = sjs.Dvec2(u1, u2), sjs.Dvec2(v1, v2) self.assertAlmostEqual(u * v, u1 * v1 + u2 * v2)
def test_bfgs_linear_speed(self): for _ in range(10): h = 0.1 x0, y0 = np.random.uniform(-1, 1 - h, (2,)) x1, y1 = x0 + h, y0 + h x, y = x0 - h, y0 vx, vy = np.random.uniform(-0.05, 0.05, (2,)) s_gt = get_linear_speed_s(vx, vy) slow = sjs.get_linear_speed_field2(vx, vy) tau_Omega = get_linear_speed_tau(vx, vy) tau = lambda lam, mu: tau_Omega( (1 - lam)*x0 + lam*x1, (1 - mu)*y0 + mu*y1 ) grad_tau = autograd.grad(lambda args: tau(args[0], args[1])) hess_tau = autograd.hessian(lambda args: tau(args[0], args[1])) tau_x = lambda lam, mu: grad_tau(np.array([lam, mu]))[0] tau_y = lambda lam, mu: grad_tau(np.array([lam, mu]))[1] tau_xy = lambda lam, mu: hess_tau(np.array([lam, mu]))[1][0] data = np.array([ [ tau(0., 0.), tau(0., 1.), tau_y(0., 0.), tau_y(0., 1.)], [ tau(1., 0.), tau(1., 1.), tau_y(1., 0.), tau_y(1., 1.)], [tau_x(0., 0.), tau_x(0., 1.), tau_xy(0., 0.), tau_xy(0., 1.)], [tau_x(1., 0.), tau_x(1., 1.), tau_xy(1., 0.), tau_xy(1., 1.)], ]) bicubic = sjs.Bicubic(data) T = bicubic.get_f_on_edge(sjs.BicubicVariable.Lambda, 0) Tx = bicubic.get_fx_on_edge(sjs.BicubicVariable.Lambda, 0) Ty = bicubic.get_fy_on_edge(sjs.BicubicVariable.Lambda, 0) a_T = np.array([T.a[i] for i in range(4)]) a_Tx = np.array([Tx.a[i] for i in range(4)]) a_Ty = np.array([Ty.a[i] for i in range(4)]) p, p0, p1 = np.array([x, y]), np.array([x0, y0]), np.array([x0, y1]) context_gt = F4(s_gt, a_T, a_Tx, a_Ty, p, p0, p1) xy = sjs.Dvec2(*p) xy0 = sjs.Dvec2(*p0) xy1 = sjs.Dvec2(*p1) context = sjs.F4Context(T, Tx, Ty, xy, xy0, xy1, slow) context3 = sjs.F3Context(T, xy, xy0, xy1, slow) def F3(eta): context3.compute(eta) return context3.F3 def F3_eta(eta): context3.compute(eta) return context3.F3_eta if np.sign(F3_eta(0.)) == np.sign(F3_eta(1.)): argeta3 = 0. if F3(0.) < F3(1.) else 1. else: argeta3 = brentq(F3_eta, 0, 1) lp = (p - p0 - argeta3*(p1 - p0)) lp /= np.linalg.norm(lp) argth3 = np.arctan2(*reversed(lp)) xk_gt = np.array([argeta3, argth3]) eps = 1e-7 hess_gt = context_gt.hess_F4(xk_gt) hess_fd = context.hess_fd(argeta3, argth3, eps) self.assertTrue(abs(hess_gt[0, 0] - hess_fd[0, 0]) < eps) self.assertTrue(abs(hess_gt[1, 0] - hess_fd[1, 0]) < eps) self.assertTrue(abs(hess_gt[0, 1] - hess_fd[0, 1]) < eps) self.assertTrue(abs(hess_gt[1, 1] - hess_fd[1, 1]) < eps) gk_gt = context_gt.grad_F4(xk_gt) Hk_gt = np.linalg.inv(hess_gt) xk, gk, Hk = context.bfgs_init(*xk_gt) eps = 1e-6 self.assertTrue(abs(Hk_gt[0, 0] - Hk[0, 0]) < eps) self.assertTrue(abs(Hk_gt[1, 0] - Hk[1, 0]) < eps) self.assertTrue(abs(Hk_gt[0, 1] - Hk[0, 1]) < eps) self.assertTrue(abs(Hk_gt[1, 1] - Hk[1, 1]) < eps)
def test_normalize(self): for _ in range(10): u = sjs.Dvec2(*np.random.randn(2)) u.normalize() self.assertAlmostEqual(u.norm(), 1.0)
def test_ccomb(self): u, v = sjs.Dvec2(2, 0), sjs.Dvec2(1, 3) w = sjs.ccomb(u, v, 0.1) self.assertAlmostEqual(w.x, 1.9) self.assertAlmostEqual(w.y, 0.3)
def test_ctor(self): v = sjs.Dvec2(1, 2) self.assertEqual(v.x, 1) self.assertEqual(v.y, 2)
def test_dist(self): for _ in range(10): u1, u2, v1, v2 = np.random.randn(4) u, v = sjs.Dvec2(u1, u2), sjs.Dvec2(v1, v2) d = np.sqrt((v1 - u1)**2 + (v2 - u2)**2) self.assertAlmostEqual(sjs.dist(u, v), d)
def test_norm(self): for _ in range(10): u1, u2 = np.random.randn(2) u = sjs.Dvec2(u1, u2) d = np.sqrt(u1**2 + u2**2) self.assertAlmostEqual(u.norm(), d)