Ejemplo n.º 1
0
    def test_PrimalDualHybridGradient(self):
        n = 5
        lamda = 0.1
        A, x_numpy, y = self.Ax_y_setup(n, lamda)

        # Compute step-size
        lipschitz = np.linalg.svd(np.matmul(A.T, A), compute_uv=False)[0]
        tau = 1.0 / lipschitz
        sigma = 1.0

        x = np.zeros([n])
        u = np.zeros([n])
        alg_method = alg.PrimalDualHybridGradient(lambda alpha, u:
                                                  (u - alpha * y) /
                                                  (1 + alpha),
                                                  lambda alpha, x: x /
                                                  (1 + lamda * alpha),
                                                  lambda x: A @ x,
                                                  lambda x: A.T @ x,
                                                  x,
                                                  u,
                                                  tau,
                                                  sigma,
                                                  max_iter=1000)
        while (not alg_method.done()):
            alg_method.update()

        npt.assert_allclose(x, x_numpy)
Ejemplo n.º 2
0
    def test_PrimalDualHybridGradient(self):
        n = 5
        A = np.random.random([n, n])
        x_orig = np.random.random([n])
        y = np.matmul(A, x_orig)
        lamda = 1.0
        x_truth = np.linalg.solve(
            np.matmul(A.T, A) + lamda * np.eye(n), np.matmul(A.T, y))

        # Compute step-size
        lipschitz = np.linalg.svd(np.matmul(A.T, A), compute_uv=False)[0]
        tau = 1.0 / lipschitz
        sigma = 1.0

        x = np.zeros([n])
        u = np.zeros([n])
        alg_method = alg.PrimalDualHybridGradient(lambda alpha, u:
                                                  (u - alpha * y) /
                                                  (1 + alpha),
                                                  lambda alpha, x: x /
                                                  (1 + lamda * alpha),
                                                  lambda x: np.matmul(A, x),
                                                  lambda x: np.matmul(A.T, x),
                                                  x,
                                                  u,
                                                  tau,
                                                  sigma,
                                                  max_iter=1000)
        while (not alg_method.done()):
            alg_method.update()

        npt.assert_allclose(x, x_truth, atol=1e-3, rtol=1e-3)