Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
 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])
Exemplo n.º 5
0
 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])
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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