예제 #1
0
def test_get_random_like():
    np.random.seed(0)
    A = sparse.eye(5)
    B = utils.get_random_like(A, lambda n: np.random.normal(0, 1e-6, size=n))
    A_r, A_c = [list(x) for x in A.nonzero()]
    B_r, B_c = [list(x) for x in B.nonzero()]
    assert A_r == B_r
    assert A_c == B_c
예제 #2
0
 def test_get_random_like(self):
     A = sparse.eye(5)
     B = utils.get_random_like(A,
                               lambda n: np.random.normal(0, 1e-6, size=n))
     A_r, A_c = [list(x) for x in A.nonzero()]
     B_r, B_c = [list(x) for x in B.nonzero()]
     self.assertListEqual(A_r, B_r)
     self.assertListEqual(A_c, B_c)
예제 #3
0
    def test_solve_and_derivative(self):
        np.random.seed(0)
        m = 20
        n = 10

        A, b, c, cone_dims = utils.least_squares_eq_scs_data(m, n)
        for mode in ["lsqr", "dense"]:
            x, y, s, derivative, adjoint_derivative = cone_prog.solve_and_derivative(
                A, b, c, cone_dims, eps=1e-10, mode=mode, solve_method="SCS")

            dA = utils.get_random_like(
                A, lambda n: np.random.normal(0, 1e-6, size=n))
            db = np.random.normal(0, 1e-6, size=b.size)
            dc = np.random.normal(0, 1e-6, size=c.size)

            dx, dy, ds = derivative(dA, db, dc)

            x_pert, y_pert, s_pert, _, _ = cone_prog.solve_and_derivative(
                A + dA,
                b + db,
                c + dc,
                cone_dims,
                eps=1e-10,
                solve_method="SCS")

            np.testing.assert_allclose(x_pert - x, dx, atol=1e-8)
            np.testing.assert_allclose(y_pert - y, dy, atol=1e-8)
            np.testing.assert_allclose(s_pert - s, ds, atol=1e-8)

            x, y, s, derivative, adjoint_derivative = cone_prog.solve_and_derivative(
                A, b, c, cone_dims, eps=1e-10, mode=mode, solve_method="SCS")

            objective = c.T @ x
            dA, db, dc = adjoint_derivative(c, np.zeros(y.size),
                                            np.zeros(s.size))

            x_pert, _, _, _, _ = cone_prog.solve_and_derivative(
                A + 1e-6 * dA,
                b + 1e-6 * db,
                c + 1e-6 * dc,
                cone_dims,
                eps=1e-10,
                solve_method="SCS")
            objective_pert = c.T @ x_pert

            np.testing.assert_allclose(objective_pert - objective,
                                       1e-6 * dA.multiply(dA).sum() +
                                       1e-6 * db @ db + 1e-6 * dc @ dc,
                                       atol=1e-8)
예제 #4
0
    def test_solve_and_derivative(self):
        m = 20
        n = 10
        A, b, c, cone_dims = utils.least_squares_eq_scs_data(m, n)

        x, y, s, derivative, _ = cone_prog.solve_and_derivative(A,
                                                                b,
                                                                c,
                                                                cone_dims,
                                                                eps=1e-8)

        dA = utils.get_random_like(A,
                                   lambda n: np.random.normal(0, 1e-6, size=n))
        db = np.random.normal(0, 1e-6, size=b.size)
        dc = np.random.normal(0, 1e-6, size=c.size)

        dx, dy, ds = derivative(dA, db, dc)

        x_pert, y_pert, s_pert, _, _ = cone_prog.solve_and_derivative(
            A + dA, b + db, c + dc, cone_dims, eps=1e-8)

        np.testing.assert_allclose(x_pert - x, dx, atol=1e-6, rtol=1e-6)
예제 #5
0
파일: prof.py 프로젝트: spenrich/diffcp
import time

import diffcp.cone_program as cone_prog
import diffcp.cones as cone_lib
import diffcp.utils as utils


m = 100
n = 50

A, b, c, cone_dims = utils.least_squares_eq_scs_data(m, n)
for mode in ["lsqr", "dense"]:
    x, y, s, derivative, adjoint_derivative = cone_prog.solve_and_derivative(
        A, b, c, cone_dims, eps=1e-10, mode=mode)

    dA = utils.get_random_like(
        A, lambda n: np.random.normal(0, 1e-2, size=n))
    db = np.random.normal(0, 1e-2, size=b.size)
    dc = np.random.normal(0, 1e-2, size=c.size)

    derivative_time = 0.0
    for _ in range(10):
        tic = time.time()
        dx, dy, ds = derivative(dA, db, dc)
        toc = time.time()
        derivative_time += (toc - tic) / 10

    adjoint_derivative_time = 0.0
    for _ in range(10):
        tic = time.time()
        dA, db, dc = adjoint_derivative(
            c, np.zeros(y.size), np.zeros(s.size))