def solve(self, objective, constraints, cached_data, warm_start, verbose, solver_opts): """Returns the result of the call to the solver. Parameters ---------- objective : CVXPY objective object Raw objective passed by CVXPY. Can be convex/concave. constraints : list The list of raw constraints. Returns ------- tuple (status, optimal value, primal, equality dual, inequality dual) """ sym_data = self.get_sym_data(objective, constraints) id_map = sym_data.var_offsets N = sym_data.x_length extractor = CoeffExtractor(id_map, N) # Extract the coefficients (Ps, Q, R) = extractor.get_coeffs(objective.args[0]) P = Ps[0] q = np.asarray(Q.todense()).flatten() r = R[0] # Forming the KKT system if len(constraints) > 0: Cs = [extractor.get_coeffs(c._expr)[1:] for c in constraints] As = sp.vstack([C[0] for C in Cs]) bs = np.array([C[1] for C in Cs]).flatten() lhs = sp.bmat([[2 * P, As.transpose()], [As, None]], format='csr') rhs = np.concatenate([-q, -bs]) else: # avoiding calling vstack with empty list lhs = 2 * P rhs = -q warnings.filterwarnings('error') # Actually solving the KKT system try: sol = SLA.spsolve(lhs.tocsr(), rhs) x = np.array(sol[:N]) nu = np.array(sol[N:]) p_star = np.dot(x.transpose(), P * x + q) + r except SLA.MatrixRankWarning: x = None nu = None p_star = None warnings.resetwarnings() result_dict = {s.PRIMAL: x, s.EQ_DUAL: nu, s.VALUE: p_star} return self.format_results(result_dict, None, cached_data)
def stuffed_objective(self, problem, inverse_data): extractor = CoeffExtractor(inverse_data) # Extract to c.T * x, store r C, R = extractor.get_coeffs(problem.objective.expr) c = np.asarray(C.todense()).flatten() boolean, integer = extract_mip_idx(problem.variables()) x = Variable(inverse_data.x_length, boolean=boolean, integer=integer) new_obj = c.T * x + 0 inverse_data.r = R[0] return new_obj, x
def apply(self, problem): inverse_data = InverseData(problem) new_obj, new_var = self.stuffed_objective(problem, inverse_data) # Form the constraints extractor = CoeffExtractor(inverse_data) new_cons = [] for con in problem.constraints: arg_list = [] for arg in con.args: A, b = extractor.get_coeffs(arg) arg_list.append(reshape(A * new_var + b, arg.shape)) new_cons.append(con.copy(arg_list)) inverse_data.cons_id_map[con.id] = new_cons[-1].id # Map of old constraint id to new constraint id. inverse_data.minimize = type(problem.objective) == Minimize new_prob = problems.problem.Problem(Minimize(new_obj), new_cons) return new_prob, inverse_data