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
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)
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)
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)
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))