コード例 #1
0
ファイル: quad_form.py プロジェクト: evelynmitchell/cvxpy
def quad_form(x, P):
    x,P = map(Expression.cast_to_const, (x,P))
    # Check dimensions.
    n = P.size[0]
    if P.size[1] != n or x.size != (n,1):
        raise Exception("Invalid dimensions for arguments.")
    if x.is_constant():
        return x.T*P*x
    elif P.is_constant():
        np_intf = intf.get_matrix_interface(np.ndarray)
        P = np_intf.const_to_matrix(P.value)
        # Replace P with symmetric version.
        P = (P + P.T)/2
        # Check if P is PSD.
        eigvals, V = LA.eig(P)
        eigvals = eigvals.real
        if min(eigvals) >= 0:
            diag_eig = np.diag(np.sqrt(eigvals))
            P_sqrt = Constant(diag_eig.dot(V.T))
            return square(norm2(P_sqrt*x))
        elif max(eigvals) <= 0:
            diag_eig = np.diag(np.sqrt(-eigvals))
            P_sqrt = Constant(diag_eig.dot(V.T))
            return -square(norm2(P_sqrt*x))
        else:
            raise Exception("P has both positive and negative eigenvalues.")
    else:
        raise Exception("At least one argument to quad_form must be constant.")
コード例 #2
0
ファイル: norm.py プロジェクト: JudsonWilson/cvxpy
def norm(x, p=2):
    x = Expression.cast_to_const(x)
    if p == 1:
        return norm1(x)
    elif p == "inf":
        return normInf(x)
    elif p == "nuc":
        return normNuc(x)
    elif p == "fro":
        return norm2(x)
    elif p == 2:
        if x.is_matrix():
            return sigma_max(x)
        else:
            return norm2(x)
    else:
        raise Exception("Invalid value %s for p." % p)
コード例 #3
0
def norm(x, p=2):
    x = Expression.cast_to_const(x)
    if p == 1:
        return norm1(x)
    elif p == "inf":
        return normInf(x)
    elif p == "nuc":
        return normNuc(x)
    elif p == "fro":
        return norm2(x)
    elif p == 2:
        if x.is_matrix():
            return sigma_max(x)
        else:
            return norm2(x)
    else:
        raise Exception("Invalid value %s for p." % p)
コード例 #4
0
ファイル: quad_form.py プロジェクト: r0k3/cvxpy
def quad_form(x, P):
    """ Alias for :math:`x^T P x`.

    """
    x, P = map(Expression.cast_to_const, (x, P))
    # Check dimensions.
    n = P.size[0]
    if P.size[1] != n or x.size != (n, 1):
        raise Exception("Invalid dimensions for arguments.")
    if x.is_constant():
        return x.T * P * x
    elif P.is_constant():
        np_intf = intf.get_matrix_interface(np.ndarray)
        P = np_intf.const_to_matrix(P.value)
        sgn, scale, M = _decomp_quad(P)
        return sgn * scale * square(norm2(Constant(M.T) * x))
    else:
        raise Exception("At least one argument to quad_form must be constant.")
コード例 #5
0
ファイル: quad_form.py プロジェクト: Jarvistonychen/cvxpy
def quad_form(x, P):
    """ Alias for :math:`x^T P x`.

    """
    x,P = map(Expression.cast_to_const, (x,P))
    # Check dimensions.
    n = P.size[0]
    if P.size[1] != n or x.size != (n,1):
        raise Exception("Invalid dimensions for arguments.")
    if x.is_constant():
        return x.T * P * x
    elif P.is_constant():
        np_intf = intf.get_matrix_interface(np.ndarray)
        P = np_intf.const_to_matrix(P.value)
        sgn, scale, M = _decomp_quad(P)
        return sgn * scale * square(norm2(Constant(M.T) * x))
    else:
        raise Exception("At least one argument to quad_form must be constant.")