Пример #1
0
 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)
Пример #2
0
 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])
Пример #3
0
 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])
Пример #4
0
 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)
Пример #5
0
    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)
Пример #6
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))
Пример #7
0
 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)
Пример #8
0
 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))
Пример #9
0
 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])
Пример #10
0
    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)
Пример #11
0
    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)
Пример #12
0
 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)
Пример #13
0
    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))
Пример #14
0
 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])
Пример #15
0
 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)
Пример #16
0
    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)
Пример #17
0
 def test_normalize(self):
     for _ in range(10):
         u = sjs.Dvec2(*np.random.randn(2))
         u.normalize()
         self.assertAlmostEqual(u.norm(), 1.0)
Пример #18
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)
Пример #19
0
 def test_ctor(self):
     v = sjs.Dvec2(1, 2)
     self.assertEqual(v.x, 1)
     self.assertEqual(v.y, 2)
Пример #20
0
 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)
Пример #21
0
 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)