def convexify_constr(constr): """ :param constr: a constraint of a problem :return: for a dcp constraint, return itself; for a non-dcp constraint, return a convexified constraint and domain constraints; return None if non-sub/super-diff """ if not constr.is_dcp(): dom = [] # left hand concave if constr.args[0].curvature == 'CONCAVE': left = linearize(constr.args[0]) if left is None: return None else: for con in constr.args[0].domain: dom.append(con) else: left = constr.args[0] # right hand convex if constr.args[1].curvature == 'CONVEX': right = linearize(constr.args[1]) if right is None: return None else: for con in constr.args[1].domain: dom.append(con) else: right = constr.args[1] # quick hack to get fairness-classification methods working, but also means any input needs to be real-valued # return cvx.real(left - right) <= 0, dom return left - right <= 0, dom else: return constr
def convexify_constr(constr): """ :param constr: a constraint of a problem :return: for a dcp constraint, return itself; for a non-dcp constraint, return a convexified constraint and domain constraints; return None if non-sub/super-diff """ if not constr.is_dcp(): dom = [] # left hand concave if constr.args[0].curvature == 'CONCAVE': left = linearize(constr.args[0]) if left is None: return None else: for con in constr.args[0].domain: dom.append(con) else: left = constr.args[0] # right hand convex if constr.args[1].curvature == 'CONVEX': right = linearize(constr.args[1]) if right is None: return None else: for con in constr.args[1].domain: dom.append(con) else: right = constr.args[1] return left - right <= 0, dom else: return constr
def test_linearize(self): """Test the linearize function. """ z = Variable(1,5) expr = square(z) z.value = np.reshape(np.array([1,2,3,4,5]), (1,5)) lin = linearize(expr) self.assertEqual(lin.size, (1,5)) self.assertItemsAlmostEqual(lin.value, [1,4,9,16,25])
def test_linearize(self): """Test the linearize function. """ z = Variable(1, 5) expr = square(z) z.value = np.reshape(np.array([1, 2, 3, 4, 5]), (1, 5)) lin = linearize(expr) self.assertEqual(lin.size, (1, 5)) self.assertItemsAlmostEqual(lin.value, [1, 4, 9, 16, 25])
def convexify_obj(obj, vars=None, grads=None): """ :param obj: objective of a problem :return: convexified onjective or None """ # not dcp if obj.is_dcp() == False: lin = linearize(obj.expr, vars=vars, grads=grads) # non-sub/super-diff if lin is None: return None else: if obj.NAME == 'minimize': result = cvx.Minimize(lin) else: result = cvx.Maximize(lin) else: result = obj return result
def convexify_obj(obj): """ :param obj: objective of a problem :return: convexified onjective or None """ # not dcp if obj.is_dcp() == False: lin = linearize(obj.expr) # non-sub/super-diff if lin is None: return None else: if obj.NAME == 'minimize': result = cvx.Minimize(lin) else: result = cvx.Maximize(lin) else: result = obj return result