def _generate_model(self, zvars, Ws, ws, b, bounds=None, binary=False, labels=None, prefix=""): """Generate an arc-flow model.""" from pyvpsolver import MVP, AFG ndims = len(Ws[0]) m = len(ws) bb = [0] * m bvars = [] maxW = [max(Wi[d] for Wi in Ws) for d in range(ndims)] for i in range(m): if isinstance(b[i], six.string_types): minw = [min(wi[d] for wi in ws[i]) for d in range(ndims)] bb[i] = min(maxW[d] // minw[d] for d in range(ndims) if minw[d] != 0) if bounds is not None: bb[i] = min(bb[i], bounds[i]) bvars.append(b[i]) else: bb[i] = b[i] Cs = [1] * len(Ws) Qs = [-1] * len(Ws) instance = MVP(Ws, Cs, Qs, ws, bb, binary=binary, verbose=False) graph = AFG(instance, verbose=Tools.VERBOSE).graph() vnames = {(T, graph.S, graph.LOSS): zvar for zvar, T in zip(zvars, graph.Ts)} ub = {} varl, cons = graph.get_flow_cons(vnames) assocs = graph.get_assocs(vnames) graph.names = vnames nopts = [len(ws[i]) for i in range(m)] if labels is None: names = ["i={}".format(i + 1) for i in range(m)] for i in range(m): if isinstance(b[i], six.string_types): names[i] = b[i] labels = {(i, j): "{} opt={}".format(names[i], j + 1) for i, j in instance.labels} elif isinstance(labels, list): labels = dict(enumerate(labels)) graph.set_labels({(u, v, lbl): [labels[lbl]] for (u, v, lbl) in graph.A if lbl in labels}) for i in range(m): lincomb = [] for j in range(nopts[i]): lincomb += assocs.get((i, j), []) if bounds is not None: for var in lincomb: ub[var] = bounds[i] if isinstance(b[i], six.string_types): varl.append(b[i]) cons.append((lincomb, "=", b[i])) else: if b[i] > 1: cons.append((lincomb, ">=", b[i])) else: cons.append((lincomb, "=", b[i])) model = Model() for var in varl: model.add_var(name=var, lb=0, ub=ub.get(var, None), vtype="I") for lincomb, sign, rhs in cons: model.add_con(lincomb, sign, rhs) for i, zvar in enumerate(zvars): flowvar = "_total_flow_{}".format(i) model.add_var(name=flowvar, vtype="I") model.add_con(flowvar, "=", zvar) declared_vars = set(bvars) def var_name(name): if name in zvars: return name elif name in declared_vars: return name else: return prefix + name def con_name(name): return prefix + name model.rename_vars(var_name) model.rename_cons(con_name) return graph, model, declared_vars
def _generate_model(self, zvars, Ws, ws, b, bounds=None, binary=False, labels=None, prefix=""): """Generate an arc-flow model.""" from pyvpsolver import MVP, AFG ndims = len(Ws[0]) m = len(ws) bb = [0]*m bvars = [] maxW = [max(Wi[d] for Wi in Ws) for d in range(ndims)] for i in range(m): if isinstance(b[i], six.string_types): minw = [min(wi[d] for wi in ws[i]) for d in range(ndims)] bb[i] = min( maxW[d]//minw[d] for d in range(ndims) if minw[d] != 0 ) if bounds is not None: bb[i] = min(bb[i], bounds[i]) bvars.append(b[i]) else: bb[i] = b[i] Cs = [1]*len(Ws) Qs = [-1]*len(Ws) instance = MVP(Ws, Cs, Qs, ws, bb, binary=binary, verbose=False) graph = AFG(instance, verbose=Tools.VERBOSE).graph() vnames = { (T, graph.S, graph.LOSS): zvar for zvar, T in zip(zvars, graph.Ts) } ub = {} varl, cons = graph.get_flow_cons(vnames) assocs = graph.get_assocs(vnames) graph.names = vnames nopts = [len(ws[i]) for i in range(m)] if labels is None: names = ["i={}".format(i+1) for i in range(m)] for i in range(m): if isinstance(b[i], six.string_types): names[i] = b[i] labels = { (i, j): "{} opt={}".format(names[i], j+1) for i, j in instance.labels } elif isinstance(labels, list): labels = dict(enumerate(labels)) graph.set_labels({ (u, v, lbl): [labels[lbl]] for (u, v, lbl) in graph.A if lbl in labels }) for i in range(m): lincomb = [] for j in range(nopts[i]): lincomb += assocs.get((i, j), []) if bounds is not None: for var in lincomb: ub[var] = bounds[i] if isinstance(b[i], six.string_types): varl.append(b[i]) cons.append((lincomb, "=", b[i])) else: if b[i] > 1: cons.append((lincomb, ">=", b[i])) else: cons.append((lincomb, "=", b[i])) model = Model() for var in varl: model.add_var(name=var, lb=0, ub=ub.get(var, None), vtype="I") for lincomb, sign, rhs in cons: model.add_con(lincomb, sign, rhs) for i, zvar in enumerate(zvars): flowvar = "_total_flow_{}".format(i) model.add_var(name=flowvar, vtype="I") model.add_con(flowvar, "=", zvar) declared_vars = set(bvars) def var_name(name): if name in zvars: return name elif name in declared_vars: return name else: return prefix+name def con_name(name): return prefix+name model.rename_vars(var_name) model.rename_cons(con_name) return graph, model, declared_vars
def _generate_model(self, zvar, W, w, b, bounds=None, binary=False, labels=None, prefix=""): """Generate an arc-flow model.""" from pyvpsolver import VBP, AFG m = len(w) bb = [0] * m bvars = [] for i in range(m): if isinstance(b[i], six.string_types): bb[i] = min(W[d] // w[i][d] for d in range(len(w[i])) if w[i][d] != 0) if bounds is not None: bb[i] = min(bb[i], bounds[i]) bvars.append(b[i]) else: bb[i] = b[i] instance = VBP(W, w, bb, binary=binary, verbose=False) graph = AFG(instance, verbose=Tools.VERBOSE).graph() feedback = (graph.Ts[0], graph.S, graph.LOSS) vnames = {} vnames[feedback] = zvar ub = {} varl, cons = graph.get_flow_cons(vnames) assocs = graph.get_assocs(vnames) graph.names = vnames if labels is None: labels = {i: "i={0}".format(i + 1) for i in instance.labels} for i in range(m): if isinstance(b[i], six.string_types): labels[i] = b[i] elif isinstance(labels, list): labels = dict(enumerate(labels)) graph.set_labels({(u, v, i): [labels[i]] for (u, v, i) in graph.A if i in labels}) for i in range(m): if i not in assocs: assocs[i] = [] if bounds is not None: for var in assocs[i]: ub[var] = bounds[i] if isinstance(b[i], six.string_types): varl.append(b[i]) cons.append((assocs[i], "=", b[i])) else: if b[i] > 1: cons.append((assocs[i], ">=", b[i])) else: cons.append((assocs[i], "=", b[i])) model = Model() for var in varl: model.add_var(name=var, lb=0, ub=ub.get(var, None), vtype="I") for lincomb, sign, rhs in cons: model.add_con(lincomb, sign, rhs) model.add_var(name="_total_flow", vtype="I") model.add_con("_total_flow", "=", zvar) declared_vars = set(bvars) def var_name(name): if name == zvar: return name elif name in declared_vars: return name else: return prefix + name def con_name(name): return prefix + name model.rename_vars(var_name) model.rename_cons(con_name) return graph, model, declared_vars
def _generate_model(self, zvar, W, w, b, bounds=None, binary=False, labels=None, prefix=""): """Generate an arc-flow model.""" from pyvpsolver import VBP, AFG m = len(w) bb = [0]*m bvars = [] for i in range(m): if isinstance(b[i], six.string_types): bb[i] = min( W[d]//w[i][d] for d in range(len(w[i])) if w[i][d] != 0 ) if bounds is not None: bb[i] = min(bb[i], bounds[i]) bvars.append(b[i]) else: bb[i] = b[i] instance = VBP(W, w, bb, binary=binary, verbose=False) graph = AFG(instance, verbose=Tools.VERBOSE).graph() feedback = (graph.Ts[0], graph.S, graph.LOSS) vnames = {} vnames[feedback] = zvar ub = {} varl, cons = graph.get_flow_cons(vnames) assocs = graph.get_assocs(vnames) graph.names = vnames if labels is None: labels = {i: "i={0}".format(i+1) for i in instance.labels} for i in range(m): if isinstance(b[i], six.string_types): labels[i] = b[i] elif isinstance(labels, list): labels = dict(enumerate(labels)) graph.set_labels({ (u, v, i): [labels[i]] for (u, v, i) in graph.A if i in labels }) for i in range(m): if i not in assocs: assocs[i] = [] if bounds is not None: for var in assocs[i]: ub[var] = bounds[i] if isinstance(b[i], six.string_types): varl.append(b[i]) cons.append((assocs[i], "=", b[i])) else: if b[i] > 1: cons.append((assocs[i], ">=", b[i])) else: cons.append((assocs[i], "=", b[i])) model = Model() for var in varl: model.add_var(name=var, lb=0, ub=ub.get(var, None), vtype="I") for lincomb, sign, rhs in cons: model.add_con(lincomb, sign, rhs) model.add_var(name="_total_flow", vtype="I") model.add_con("_total_flow", "=", zvar) declared_vars = set(bvars) def var_name(name): if name == zvar: return name elif name in declared_vars: return name else: return prefix+name def con_name(name): return prefix+name model.rename_vars(var_name) model.rename_cons(con_name) return graph, model, declared_vars