Semidefinite program ==================== A semidefinite program (SDP) is an optimization problem of the form .. math:: \begin{array}{ll} \mbox{minimize} & \mathbf{tr}(CX) \\ \mbox{subject to} & \mathbf{tr}(A_iX) = b_i, \quad i=1,\ldots,p \\ & X \succeq 0, \end{array} where :math:`\mathbf{tr}` is the trace function, :math:`X \in \mathcal{S}^{n}` is the optimization variable and :math:`C, A_1, \ldots, A_p \in \mathcal{S}^{n}`, and :math:`b_1, \ldots, b_p \in \mathcal{R}` are problem data, and :math:`X \succeq 0` is a matrix inequality. Here :math:`\mathcal{S}^{n}` denotes the set of :math:`n`-by-:math:`n` symmetric matrices. An example of an SDP is to complete a covariance matrix :math:`\tilde \Sigma \in \mathcal{S}^{n}_+` with missing entries :math:`M \subset \{1,\ldots,n\} \times \{1,\ldots,n\}`: .. math:: \begin{array}{ll} \mbox{minimize} & 0 \\ \mbox{subject to} & \Sigma_{ij} = \tilde \Sigma_{ij}, \quad (i,j) \notin M \\ & \Sigma \succeq 0, \end{array} Example ------- In the following code, we solve a SDP with CVXPY. .. code:: python # Import packages. import cvxpy as cp import numpy as np # Generate a random SDP. n = 3 p = 3 np.random.seed(1) C = np.random.randn(n, n) A = [] b = [] for i in range(p): A.append(np.random.randn(n, n)) b.append(np.random.randn()) # Define and solve the CVXPY problem. # Create a symmetric matrix variable. X = cp.Variable((n,n), symmetric=True) # The operator >> denotes matrix inequality. constraints = [X >> 0] constraints += [ cp.trace(A[i] @ X) == b[i] for i in range(p) ] prob = cp.Problem(cp.Minimize(cp.trace(C @ X)), constraints) prob.solve() # Print result. print("The optimal value is", prob.value) print("A solution X is") print(X.value) .. parsed-literal:: The optimal value is 2.654348003008652 A solution X is [[ 1.6080571 -0.59770202 -0.69575904] [-0.59770202 0.22228637 0.24689205] [-0.69575904 0.24689205 1.39679396]]