def constr_get_expr(self, constr: Constr) -> LinExpr: self.flush_rows() nnz = ffi.new("int *") # obtaining number of non-zeros st = GRBgetconstrs( self._model, nnz, ffi.NULL, ffi.NULL, ffi.NULL, constr.idx, 1 ) if st != 0: raise Exception( "Could not get info for constraint {}".format(constr.idx) ) nz = nnz[0] # creating arrays to hold indices and coefficients cbeg = ffi.new("int[2]") cind = ffi.new("int[{}]".format(nz)) cval = ffi.new("double[{}]".format(nz)) # obtaining variables and coefficients st = GRBgetconstrs(self._model, nnz, cbeg, cind, cval, constr.idx, 1) if st != 0: raise Exception("Could not query constraint contents") # obtaining sense and rhs c_sense = ffi.new("char *") rhs = ffi.new("double *") st = GRBgetcharattrelement( self._model, "Sense".encode("utf-8"), constr.idx, c_sense ) if st != 0: raise Exception( "Could not query sense for constraint {}".format(constr.idx) ) st = GRBgetdblattrelement( self._model, "RHS".encode("utf-8"), constr.idx, rhs ) if st != 0: raise Exception( "Could not query RHS for constraint {}".format(constr.idx) ) ssense = c_sense[0].decode("utf-8") # translating sense sense = "" if ssense == "<": sense = LESS_OR_EQUAL elif ssense == ">": sense = GREATER_OR_EQUAL elif ssense == "=": sense = EQUAL expr = LinExpr(const=-rhs[0], sense=sense) for i in range(nz): expr.add_var(self.model.vars[cind[i]], cval[i]) return expr
def maximize_sum(plfs, max_costs): # pylint: disable=too-many-locals m = Model("bid-landscapes") costs = LinExpr() objective = LinExpr() xs = [] ws = [] for (i, plf) in enumerate(plfs): k = len(plf) w = [m.add_var(var_type=CONTINUOUS) for _ in range(0, k)] x = [m.add_var(var_type=BINARY) for _ in range(0, k - 1)] xs.append(x) ws.append(w) m += xsum(w[i] for i in range(0, k)) == 1 for i in range(0, k): m += w[i] >= 0 m += w[0] <= x[0] for i in range(1, k - 1): m += w[i] <= x[i - 1] + x[i] m += w[k - 1] <= x[k - 2] m += xsum(x[k] for k in range(0, k - 1)) == 1 for i in range(0, k): costs.add_term(w[i] * plf.a[i]) objective.add_term(w[i] * plf.b[i]) m += costs <= max_costs m.objective = maximize(objective) start = monotonic() print(m.optimize()) print(f"DURATION: {(monotonic() - start) * 1000} ms") optimum = [] for (i, plf) in enumerate(plfs): k = len(plf) u_i = sum(ws[i][j].x * plf.a[j] for j in range(0, k)) v_i = sum(ws[i][j].x * plf.b[j] for j in range(0, k)) optimum.append(Line(cost=u_i, revenue=v_i, plf=plf)) return optimum