Beispiel #1
0
def test_mip_file(solver: str, instance: str):
    """Tests optimization of MIP models stored in .mps or .lp files"""
    m = Model(solver_name=solver)

    # optional file for optimal LP basis
    bas_file = ""

    iname = ""
    for ext in EXTS:
        if instance.endswith(ext):
            bas_file = instance.replace(ext, ".bas")
            if not exists(bas_file):
                bas_file = ""
            iname = basename(instance.replace(ext, ""))
            break
    assert iname in BOUNDS.keys()

    lb = BOUNDS[iname][0]
    ub = BOUNDS[iname][1]
    assert lb <= ub + TOL
    has_opt = abs(ub - lb) <= TOL

    max_dif = max(max(abs(ub), abs(lb)) * 0.01, TOL)

    m.read(instance)
    if bas_file:
        m.verbose = True
        m.read(bas_file)
        m.optimize(relax=True)
        print("Basis loaded!!! Obj value: %f" % m.objective_value)
    m.optimize(max_nodes=MAX_NODES)
    if m.status in [OptimizationStatus.OPTIMAL, OptimizationStatus.FEASIBLE]:
        assert m.num_solutions >= 1
        m.check_optimization_results()
        assert m.objective_value >= lb - max_dif
        if has_opt and m.status == OptimizationStatus.OPTIMAL:
            assert abs(m.objective_value - ub) <= max_dif

    elif m.status == OptimizationStatus.NO_SOLUTION_FOUND:
        assert m.objective_bound <= ub + max_dif
    else:
        assert m.status not in [
            OptimizationStatus.INFEASIBLE,
            OptimizationStatus.INT_INFEASIBLE,
            OptimizationStatus.UNBOUNDED,
            OptimizationStatus.ERROR,
            OptimizationStatus.CUTOFF,
        ]
    assert m.objective_bound <= ub + max_dif
Beispiel #2
0
from mip import Model, CutType, OptimizationStatus
import mip

lp_path = ""

#  using test data
lp_path = mip.__file__.replace("mip/__init__.py",
                               "test/data/1443_0-9.lp").replace(
                                   "mip\\__init__.py",
                                   "test\\data\\1443_0-9.lp")

m = Model()
if m.solver_name.upper() in ["GRB", "GUROBI"]:
    print("This feature is currently not supported in Gurobi.")
else:
    m.read(lp_path)

    m.verbose = 0
    m.optimize(relax=True)
    print("Original LP bound: {}".format(m.objective_value))

    best_impr = -1
    best_cut = ""

    for ct in CutType:
        print()
        m2 = m.copy()
        m2.verbose = 0
        m2.optimize(relax=True)
        assert (m2.status == OptimizationStatus.OPTIMAL
                and abs(m2.objective_value - m.objective_value) <= 1e-4)
class PythonMIPReader(FileReaderInterface):
    def __init__(self, input_file: str) -> None:
        self.instance_name = input_file.split("/")[-1].split(".")[0]
        self.m = Model()

        print("Reding lp file", self.instance_name)
        self.m.read(input_file)
        print("Reading of ", self.instance_name, " model done!")

        self.vars = self.m.vars
        self.constrs = self.m.constrs

        self.tmp_reader_dir = tempfile.mkdtemp()

    def __del__(self):
        shutil.rmtree(self.tmp_reader_dir)

    def write_model_with_new_bounds(self, lbs: List[float],
                                    ubs: [List[float]]) -> str:
        assert (len(lbs) == len(ubs) == len(self.m.vars))
        for i in range(len(lbs)):
            self.m.vars[i].lb = lbs[i]
            self.m.vars[i].ub = ubs[i]
        out_path = os.path.join(self.tmp_reader_dir,
                                str(self.instance_name) + ".mps")
        self.m.write(out_path)
        return out_path

    def get_n_vars(self) -> int:
        return self.m.num_cols

    def get_n_cons(self) -> int:
        return self.m.num_rows

    def get_nnz(self) -> int:
        return self.m.num_nz

    def get_var_bounds(self) -> Tuple[List[float]]:
        ubs = map(lambda var: var.ub, self.vars)
        lbs = map(lambda var: var.lb, self.vars)
        return list(lbs), list(ubs)

    def get_lrhss(self) -> Tuple[List[float]]:
        lhss = map(
            lambda cons: float('-Inf')
            if cons.expr.sense == '<' else cons.rhs, self.constrs)
        rhss = map(
            lambda cons: float('Inf')
            if cons.expr.sense == '>' else cons.rhs, self.constrs)
        return list(lhss), list(rhss)

    def get_cons_matrix(self) -> Tuple[List[Union[int, float]]]:
        def get_expr_coos(expr: LinExpr, var_indices: Dict[Var,
                                                           int]) -> Generator:
            for var, coeff in expr.expr.items():
                yield coeff, var_indices[var]

        row_indices = []
        row_ptrs = []
        col_indices = []
        coeffs = []

        var_indices = {v: i for i, v in enumerate(self.vars)}

        row_ctr = 0
        row_ptrs.append(row_ctr)

        for row_idx, constr in enumerate(self.constrs):

            for coeff, col_idx in get_expr_coos(constr.expr, var_indices):
                row_ctr += 1
                row_indices.append(row_idx)
                col_indices.append(col_idx)
                coeffs.append(coeff)

            row_ptrs.append(row_ctr)

        return (coeffs, row_ptrs, col_indices)

    def get_SCIP_vartypes(self) -> List[int]:
        conversion_dict = {'B': 0, 'I': 1, 'C': 3}
        python_mip_vartypes = map(lambda var: var.var_type, self.vars)
        return list(map(conversion_dict.get, python_mip_vartypes))