def makeTwoTermIndexedDisjunction(): m = ConcreteModel() m.A = Set(initialize=[1, 2, 3]) m.B = Set(initialize=['a', 'b']) m.x = Var(m.A, bounds=(-10, 10)) def disjunct_rule(d, i, k): m = d.model() if k == 'a': d.cons_a = Constraint(expr=m.x[i] >= 5) if k == 'b': d.cons_b = Constraint(expr=m.x[i] <= 0) m.disjunct = Disjunct(m.A, m.B, rule=disjunct_rule) def disj_rule(m, i): return [m.disjunct[i, k] for k in m.B] m.disjunction = Disjunction(m.A, rule=disj_rule) return m
def get_model(flag, fixprim, fixdual): model = ConcreteModel() model.obj = Param(default=20) model.n = Param(default=7) model.m = Param(default=7) model.N = RangeSet(1, model.n) model.M = RangeSet(1, model.m) def c_rule(model, j): return 5 if j < 5 else 9.0 / 2 model.c = Param(model.N) def b_rule(model, i): if i == 4: i = 5 elif i == 5: i = 4 return 5 if i < 5 else 7.0 / 2 model.b = Param(model.M) def A_rule(model, i, j): if i == 4: i = 5 elif i == 5: i = 4 return 2 if i == j else 1 model.A = Param(model.M, model.N) model.x = Var(model.N, within=NonNegativeReals) model.y = Var(model.M, within=NonNegativeReals) model.xx = Var([1, 2], model.N, within=NonNegativeReals) model.yy = Var([1, 2], model.M, within=NonNegativeReals) if flag: model.ydiff = Objective(expr=model.yy[2, fixdual] - model.yy[1, fixdual]) def yext_rule(model, k): return sum(model.b[i] * model.yy[k, i] for i in model.M) == model.obj model.yext = Constraint([1, 2]) def dualcons_rule(model, k, j): return sum(model.A[i, j] * model.yy[k, i] for i in model.N) <= model.c[j] model.dualcons = Constraint([1, 2], model.N) else: model.xdiff = Objective(expr=model.xx[2, fixprim] - model.xx[1, fixprim]) def xext_rule(model, k): return sum(model.c[j] * model.xx[k, j] for j in model.N) == model.obj model.xext = Constraint([1, 2]) def primcons_rule(model, k, i): return sum(model.A[i, j] * model.xx[k, j] for j in model.M) >= model.b[i] model.primcons = Constraint([1, 2], model.M) model.create() return model
i = 4 return 5 if i < 5 else 7.0 / 2 model.b = Param(model.M) def A_rule(model, i, j): if i == 4: i = 5 elif i == 5: i = 4 return 2 if i == j else 1 model.A = Param(model.M, model.N) model.x = Var(model.N, within=NonNegativeReals) model.y = Var(model.M, within=NonNegativeReals) model.cost = Objective(expr=sum_product(model.c, model.x)) def primalcon_rule(model, i): return sum(model.A[i, j] * model.x[j] for j in model.N) >= model.b[i] model.primalcon = Constraint(model.M) model.dual = Suffix(direction=Suffix.IMPORT) model.rc = Suffix(direction=Suffix.IMPORT)