def quad_over_lin_canon(expr, real_args, imag_args, real2imag): """Convert quad_over_lin to real. """ if imag_args[0] is None: matrix = real_args[0] else: matrix = bmat([real_args[0], imag_args[0]]) return expr.copy([matrix, real_args[1]]), None
def hermitian_canon(expr, real_args, imag_args, real2imag): """Canonicalize functions that take a Hermitian matrix. """ if imag_args[0] is None: matrix = real_args[0] else: if real_args[0] is None: real_args[0] = np.zeros(imag_args[0].shape) matrix = bmat([[real_args[0], -imag_args[0]], [imag_args[0], real_args[0]]]) return expr.copy([matrix]), None
def matrix_frac_canon(expr, real_args, imag_args, real2imag): """Convert matrix_frac to real. """ if real_args[0] is None: real_args[0] = np.zeros(imag_args[0].shape) if imag_args[0] is None: imag_args[0] = np.zeros(real_args[0].shape) vec = vstack([at_least_2D(real_args[0]), at_least_2D(imag_args[0])]) if real_args[1] is None: real_args[1] = np.zeros(imag_args[1].shape) elif imag_args[1] is None: imag_args[1] = np.zeros(real_args[1].shape) matrix = bmat([[real_args[1], -imag_args[1]], [imag_args[1], real_args[1]]]) return expr.copy([vec, matrix]), None
def matrix_frac_canon(expr, args): X = args[0] # n by m matrix. P = args[1] # n by n matrix. if len(X.shape) == 1: X = reshape(X, (X.shape[0], 1)) n, m = X.shape T = Variable((m, m), symmetric=True) M = bmat([[P, X], [X.T, T]]) # ^ a matrix with Schur complement T - X.T*P^-1*X. constraints = [PSD(M)] if not P.is_symmetric(): ut = upper_tri(P) lt = upper_tri(P.T) constraints.append(ut == lt) return trace(T), constraints
def quad_canon(expr, real_args, imag_args, real2imag): """Convert quad_form to real. """ if imag_args[0] is None: vec = real_args[0] matrix = real_args[1] elif real_args[0] is None: vec = imag_args[0] matrix = real_args[1] else: vec = vstack([at_least_2D(real_args[0]), at_least_2D(imag_args[0])]) if real_args[1] is None: real_args[1] = np.zeros(imag_args[1].shape) elif imag_args[1] is None: imag_args[1] = np.zeros(real_args[1].shape) matrix = bmat([[real_args[1], -imag_args[1]], [imag_args[1], real_args[1]]]) matrix = psd_wrap(matrix) return expr.copy([vec, matrix]), None