def test_sum_smallest(self): """Test the sum_smallest atom and related atoms. """ with self.assertRaises(Exception) as cm: cp.sum_smallest(self.x, -1) self.assertEqual(str(cm.exception), "Second argument must be a positive integer.") with self.assertRaises(Exception) as cm: cp.lambda_sum_smallest(Variable((2, 2)), 2.4) self.assertEqual(str(cm.exception), "Second argument must be a positive integer.")
def test_eigval_atoms(self): """Test eigenvalue atoms. """ P = np.arange(9) - 2j*np.arange(9) P = np.reshape(P, (3, 3)) P1 = np.conj(P.T).dot(P)/10 + np.eye(3)*.1 P2 = np.array([[10, 1j, 0], [-1j, 10, 0], [0, 0, 1]]) for P in [P1, P2]: value = cvx.lambda_max(P).value X = Variable(P.shape, complex=True) prob = Problem(cvx.Minimize(cvx.lambda_max(X)), [X == P]) result = prob.solve(solver=cvx.SCS, eps=1e-6) self.assertAlmostEqual(result, value, places=2) eigs = np.linalg.eigvals(P).real value = cvx.sum_largest(eigs, 2).value X = Variable(P.shape, complex=True) prob = Problem(cvx.Minimize(cvx.lambda_sum_largest(X, 2)), [X == P]) result = prob.solve(solver=cvx.SCS, eps=1e-8) self.assertAlmostEqual(result, value, places=3) self.assertItemsAlmostEqual(X.value, P, places=3) value = cvx.sum_smallest(eigs, 2).value X = Variable(P.shape, complex=True) prob = Problem(cvx.Maximize(cvx.lambda_sum_smallest(X, 2)), [X == P]) result = prob.solve(solver=cvx.SCS, eps=1e-6) self.assertAlmostEqual(result, value, places=3)
def as_objective(self, **kwargs): """ main[selected] - branch[0] selection can be written as Minimize(minimum(main[:] - branch[0])) """ Xmain, Ymain = self.inputs.vars Xb, Yb = self._branch.vars start_x, start_y = Xb[0], Yb[0] o = Minimize( cvx.sum_smallest( cvx.norm1(Xmain - start_x) + cvx.norm1(Ymain - start_y), 1)) return o
def pmpt(mu, returns, percentile, max_loss): w = cvx.Variable(returns.shape[1]) nsamples = round(returns.shape[0] * percentile) portfolio_rets = returns @ w avg_worst_day = cvx.sum_smallest(portfolio_rets, nsamples) / nsamples objective = cvx.Maximize(w.T @ mu) constraints = [avg_worst_day >= max_loss] problem = cvx.Problem(objective, constraints) problem.solve() return w.value.round(4).ravel()
(cp.log1p, (2, 2), [[[0, math.e - 1], [math.e**2 - 1, 1.0 / math.e - 1]]], Constant([[0, 1], [2, -1]])), (cp.minimum, (2, ), [[-5, 2], [-3, 1], 0, [1, 2]], Constant([-5, 0])), (cp.minimum, (2, 2), [[[-5, 2], [-3, -1]], 0, [[5, 4], [-1, 2]]], Constant([[-5, 0], [-3, -1]])), (cp.min, tuple(), [[[-5, 2], [-3, 1]]], Constant([-5])), (cp.min, tuple(), [[-5, -10]], Constant([-10])), (lambda x: x**0.25, tuple(), [7.45], Constant([7.45**0.25])), (lambda x: x**0.32, (2, ), [[7.45, 3.9]], Constant(np.power(np.array([7.45, 3.9]), 0.32))), (lambda x: x**0.9, (2, 2), [[[7.45, 2.2], [4, 7]]], Constant(np.power(np.array([[7.45, 2.2], [4, 7]]).T, 0.9))), (cp.sqrt, (2, 2), [[[2, 4], [16, 1]]], Constant([[1.414213562373095, 2], [4, 1]])), (lambda x: cp.sum_smallest(x, 3), tuple(), [[-1, 2, 3, 4, 5]], Constant([-1 + 2 + 3])), (lambda x: cp.sum_smallest(x, 4), tuple(), [[[-3, -4, 5], [6, 7, 8], [9, 10, 11]]], Constant([-3 - 4 + 5 + 6])), (lambda x: (x + Constant(0))**0.5, (2, 2), [[[2, 4], [16, 1]]], Constant([[1.414213562373095, 2], [4, 1]])), ] def check_solver(prob, solver_name) -> bool: """Can the solver solve the problem? """ try: if solver_name == ROBUST_CVXOPT: solver_name = CVXOPT
(cp.log, (2, 2), [[[1, math.e], [math.e**2, 1.0 / math.e]]], Constant([[0, 1], [2, -1]])), (cp.log1p, (2, 2), [[[0, math.e - 1], [math.e**2 - 1, 1.0 / math.e - 1]]], Constant([[0, 1], [2, -1]])), (cp.minimum, (2,), [[-5, 2], [-3, 1], 0, [1, 2]], Constant([-5, 0])), (cp.minimum, (2, 2), [[[-5, 2], [-3, -1]], 0, [[5, 4], [-1, 2]]], Constant([[-5, 0], [-3, -1]])), (cp.min, tuple(), [[[-5, 2], [-3, 1]]], Constant([-5])), (cp.min, tuple(), [[-5, -10]], Constant([-10])), (lambda x: x**0.25, tuple(), [7.45], Constant([7.45**0.25])), (lambda x: x**0.32, (2,), [[7.45, 3.9]], Constant(np.power(np.array([7.45, 3.9]), 0.32))), (lambda x: x**0.9, (2, 2), [[[7.45, 2.2], [4, 7]]], Constant(np.power(np.array([[7.45, 2.2], [4, 7]]).T, 0.9))), (cp.sqrt, (2, 2), [[[2, 4], [16, 1]]], Constant([[1.414213562373095, 2], [4, 1]])), (lambda x: cp.sum_smallest(x, 3), tuple(), [[-1, 2, 3, 4, 5]], Constant([-1 + 2 + 3])), (lambda x: cp.sum_smallest(x, 4), tuple(), [[[-3, -4, 5], [6, 7, 8], [9, 10, 11]]], Constant([-3 - 4 + 5 + 6])), (lambda x: (x + Constant(0))**0.5, (2, 2), [[[2, 4], [16, 1]]], Constant([[1.414213562373095, 2], [4, 1]])), ] def check_solver(prob, solver_name) -> bool: """Can the solver solve the problem? """ try: if solver_name == ROBUST_CVXOPT: solver_name = CVXOPT prob._construct_chain(solver=solver_name)