def test_maximum(self) -> None: """Test domain for maximum. """ b = Variable() expr = cp.maximum(self.a, b) self.a.value = 2 b.value = 4 self.assertAlmostEqual(expr.grad[self.a], 0) self.assertAlmostEqual(expr.grad[b], 1) self.a.value = 3 b.value = 0 self.assertAlmostEqual(expr.grad[self.a], 1) self.assertAlmostEqual(expr.grad[b], 0) self.a.value = -1 b.value = 2 self.assertAlmostEqual(expr.grad[self.a], 0) self.assertAlmostEqual(expr.grad[b], 1) y = Variable(2) expr = cp.maximum(self.x, y) self.x.value = [3, 4] y.value = [5, -5] val = np.zeros((2, 2)) + np.diag([0, 1]) self.assertItemsAlmostEqual(expr.grad[self.x].toarray(), val) val = np.zeros((2, 2)) + np.diag([1, 0]) self.assertItemsAlmostEqual(expr.grad[y].toarray(), val) expr = cp.maximum(self.x, y) self.x.value = [-1e-9, 4] y.value = [1, 4] val = np.zeros((2, 2)) + np.diag([0, 1]) self.assertItemsAlmostEqual(expr.grad[self.x].toarray(), val) val = np.zeros((2, 2)) + np.diag([1, 0]) self.assertItemsAlmostEqual(expr.grad[y].toarray(), val) expr = cp.maximum(self.A, self.B) self.A.value = [[1, 2], [3, 4]] self.B.value = [[5, 1], [3, 2.3]] val = np.zeros((4, 4)) + np.diag([0, 1, 1, 1]) self.assertItemsAlmostEqual(expr.grad[self.A].toarray(), val) val = np.zeros((4, 4)) + np.diag([1, 0, 0, 0]) self.assertItemsAlmostEqual(expr.grad[self.B].toarray(), val) # cummax expr = cp.cummax(self.x) self.x.value = [2, 1] val = np.zeros((2, 2)) val[0, 0] = 1 self.assertItemsAlmostEqual(expr.grad[self.x].toarray(), val) expr = cp.cummax(self.x[:, None], axis=1) self.x.value = [2, 1] val = np.eye(2) self.assertItemsAlmostEqual(expr.grad[self.x].toarray(), val)
# Atom, solver pairs known to fail. KNOWN_SOLVER_ERRORS = [ # See https://github.com/cvxgrp/cvxpy/issues/249 (log_sum_exp_axis_0, CVXOPT), (log_sum_exp_axis_1, CVXOPT), (cp.kl_div, CVXOPT), ] atoms_minimize = [ (cp.abs, (2, 2), [[[-5, 2], [-3, 1]]], Constant([[5, 2], [3, 1]])), (lambda x: cp.cumsum(x, axis=1), (2, 2), [[[-5, 2], [-3, 1]]], Constant([[-5, 2], [-8, 3]])), (lambda x: cp.cumsum(x, axis=0), (2, 2), [[[-5, 2], [-3, 1]]], Constant([[-5, -3], [-3, -2]])), (lambda x: cp.cummax(x, axis=1), (2, 2), [[[-5, 2], [-3, 1]]], Constant([[-5, 2], [-3, 2]])), (lambda x: cp.cummax(x, axis=0), (2, 2), [[[-5, 2], [-3, 1]]], Constant([[-5, 2], [-3, 1]])), (cp.diag, (2, ), [[[-5, 2], [-3, 1]]], Constant([-5, 1])), (cp.diag, (2, 2), [[-5, 1]], Constant([[-5, 0], [0, 1]])), (cp.exp, (2, 2), [[[1, 0], [2, -1]]], Constant([[math.e, 1], [math.e**2, 1.0 / math.e]])), (cp.huber, (2, 2), [[[0.5, -1.5], [4, 0]]], Constant([[0.25, 2], [7, 0]])), (lambda x: cp.huber(x, 2.5), (2, 2), [[[0.5, -1.5], [4, 0]]], Constant([[0.25, 2.25], [13.75, 0]])), (cp.inv_pos, (2, 2), [[[1, 2], [3, 4]]], Constant([[1, 1.0 / 2], [1.0 / 3, 1.0 / 4]])), (lambda x: (x + Constant(0))**-1, (2, 2), [[[1, 2], [3, 4]]], Constant([[1, 1.0 / 2], [1.0 / 3, 1.0 / 4]])), (cp.kl_div, tuple(), [math.e, 1], Constant([1])),