def add_model_soc_constr( self, model: ScipModel, variables: List, rows: Iterator, A: dok_matrix, b: ndarray, ) -> Tuple: """Adds SOC constraint to the model using the data from mat and vec. Return tuple contains (QConstr, list of Constr, and list of variables). """ from pyscipopt.scip import quicksum # Assume first expression (i.e. t) is nonzero. expr_list = {i: [] for i in rows} for (i, j), c in A.items(): v = variables[j] try: expr_list[i].append((c, v)) except Exception: pass # Make a variable and equality constraint for each term. soc_vars = [] for i in rows: lb = 0 if len(soc_vars) == 0 else None var = model.addVar( obj=0, name="soc_t_%d" % i, vtype=VariableTypes.CONTINUOUS, lb=lb, ub=None, ) soc_vars.append(var) lin_expr_list = [ b[i] - quicksum(coeff * var for coeff, var in expr_list[i]) for i in rows ] new_lin_constrs = [ model.addCons(soc_vars[i] == lin_expr_list[i]) for i, _ in enumerate(lin_expr_list) ] # Interesting because only <=? t_term = soc_vars[0] * soc_vars[0] x_term = quicksum([var * var for var in soc_vars[1:]]) constraint = model.addCons(x_term <= t_term) return ( constraint, new_lin_constrs, soc_vars, )
def _create_variables(self, model: ScipModel, data: Dict[str, Any], c: ndarray) -> List: """Create a list of variables.""" variables = [] for n, obj in enumerate(c): var_type = get_variable_type(n=n, data=data) variables.append( model.addVar( obj=obj, name="x_%d" % n, vtype=var_type, lb=None if var_type != VariableTypes.BINARY else 0, ub=None if var_type != VariableTypes.BINARY else 1, )) return variables