def apply(self, problem): inverse_data = InverseData(problem) # Form the constraints extractor = CoeffExtractor(inverse_data) params_to_objective, flattened_variable = self.stuffed_objective( problem, extractor) # Lower equality and inequality to Zero and NonNeg. cons = [] for con in problem.constraints: if isinstance(con, Equality): con = lower_equality(con) elif isinstance(con, Inequality): con = lower_ineq_to_nonneg(con) elif isinstance(con, NonPos): con = nonpos2nonneg(con) elif isinstance(con, SOC) and con.axis == 1: con = SOC(con.args[0], con.args[1].T, axis=0, constr_id=con.constr_id) elif isinstance(con, PowCone3D) and con.args[0].ndim > 1: x, y, z = con.args alpha = con.alpha con = PowCone3D(x.flatten(), y.flatten(), z.flatten(), alpha.flatten(), constr_id=con.constr_id) elif isinstance(con, ExpCone) and con.args[0].ndim > 1: x, y, z = con.args con = ExpCone(x.flatten(), y.flatten(), z.flatten(), constr_id=con.constr_id) cons.append(con) # Reorder constraints to Zero, NonNeg, SOC, PSD, EXP, PowCone3D constr_map = group_constraints(cons) ordered_cons = constr_map[Zero] + constr_map[NonNeg] + \ constr_map[SOC] + constr_map[PSD] + constr_map[ExpCone] + constr_map[PowCone3D] inverse_data.cons_id_map = {con.id: con.id for con in ordered_cons} inverse_data.constraints = ordered_cons # Batch expressions together, then split apart. expr_list = [arg for c in ordered_cons for arg in c.args] params_to_problem_data = extractor.affine(expr_list) inverse_data.minimize = type(problem.objective) == Minimize new_prob = ParamConeProg(params_to_objective, flattened_variable, params_to_problem_data, problem.variables(), inverse_data.var_offsets, ordered_cons, problem.parameters(), inverse_data.param_id_map) return new_prob, inverse_data
def apply(self, problem): inverse_data = InverseData(problem) real2imag = { var.id: lu.get_id() for var in problem.variables() if var.is_complex() } constr_dict = { cons.id: lu.get_id() for cons in problem.constraints if cons.is_complex() } real2imag.update(constr_dict) inverse_data.real2imag = real2imag leaf_map = {} real_obj, imag_obj = self.canonicalize_tree(problem.objective, inverse_data.real2imag, leaf_map) assert imag_obj is None constrs = [] for constraint in problem.constraints: if type(constraint) == Equality: constraint = lower_equality(constraint) elif type(constraint) == Inequality: constraint = lower_ineq_to_nonneg(constraint) # real2imag maps variable id to a potential new variable # created for the imaginary part. real_constrs, imag_constrs = self.canonicalize_tree( constraint, inverse_data.real2imag, leaf_map) if real_constrs is not None: constrs.extend(real_constrs) if imag_constrs is not None: constrs.extend(imag_constrs) new_problem = problems.problem.Problem(real_obj, constrs) return new_problem, inverse_data