Move instance fixtures into the main source; remove duplication

This commit is contained in:
2021-04-09 18:45:06 -05:00
parent f3fd1e0cda
commit a8224b5a38
15 changed files with 188 additions and 225 deletions

View File

@@ -1,33 +0,0 @@
# MIPLearn: Extensible Framework for Learning-Enhanced Mixed-Integer Optimization
# Copyright (C) 2020-2021, UChicago Argonne, LLC. All rights reserved.
# Released under the modified BSD license. See COPYING.md for more details.
from inspect import isclass
from typing import Any
from miplearn.instance.base import Instance
from miplearn.problems.knapsack import KnapsackInstance, GurobiKnapsackInstance
from miplearn.solvers.gurobi import GurobiSolver
from miplearn.solvers.pyomo.base import BasePyomoSolver
def _is_subclass_or_instance(obj: Any, parent_class: Any) -> bool:
return isinstance(obj, parent_class) or (
isclass(obj) and issubclass(obj, parent_class)
)
def _get_knapsack_instance(solver: Any) -> Instance:
if _is_subclass_or_instance(solver, BasePyomoSolver):
return KnapsackInstance(
weights=[23.0, 26.0, 20.0, 18.0],
prices=[505.0, 352.0, 458.0, 220.0],
capacity=67.0,
)
if _is_subclass_or_instance(solver, GurobiSolver):
return GurobiKnapsackInstance(
weights=[23.0, 26.0, 20.0, 18.0],
prices=[505.0, 352.0, 458.0, 220.0],
capacity=67.0,
)
assert False

View File

@@ -13,11 +13,9 @@ from miplearn import InternalSolver
from miplearn.solvers import _RedirectOutput
from miplearn.solvers.gurobi import GurobiSolver
from miplearn.solvers.pyomo.base import BasePyomoSolver
from . import _get_knapsack_instance
# noinspection PyUnresolvedReferences
from .. import internal_solvers
from ..fixtures.infeasible import get_infeasible_instance
logger = logging.getLogger(__name__)
@@ -38,7 +36,7 @@ def test_internal_solver_warm_starts(
) -> None:
for solver in internal_solvers:
logger.info("Solver: %s" % solver)
instance = _get_knapsack_instance(solver)
instance = solver.build_test_instance_knapsack()
model = instance.to_model()
solver.set_instance(instance, model)
solver.set_warm_start({"x[0]": 1.0, "x[1]": 0.0, "x[2]": 0.0, "x[3]": 1.0})
@@ -64,7 +62,7 @@ def test_internal_solver(
for solver in internal_solvers:
logger.info("Solver: %s" % solver)
instance = _get_knapsack_instance(solver)
instance = solver.build_test_instance_knapsack()
model = instance.to_model()
solver.set_instance(instance, model)
@@ -169,7 +167,7 @@ def test_relax(
internal_solvers: List[InternalSolver],
) -> None:
for solver in internal_solvers:
instance = _get_knapsack_instance(solver)
instance = solver.build_test_instance_knapsack()
solver.set_instance(instance)
solver.relax()
stats = solver.solve()
@@ -181,7 +179,7 @@ def test_infeasible_instance(
internal_solvers: List[InternalSolver],
) -> None:
for solver in internal_solvers:
instance = get_infeasible_instance(solver)
instance = solver.build_test_instance_infeasible()
solver.set_instance(instance)
mip_stats = solver.solve()
@@ -200,7 +198,7 @@ def test_iteration_cb(
) -> None:
for solver in internal_solvers:
logger.info("Solver: %s" % solver)
instance = _get_knapsack_instance(solver)
instance = solver.build_test_instance_knapsack()
solver.set_instance(instance)
count = 0

View File

@@ -7,14 +7,13 @@ from typing import Any
from miplearn import InternalSolver
from miplearn.solvers.gurobi import GurobiSolver
from . import _get_knapsack_instance
logger = logging.getLogger(__name__)
def test_lazy_cb() -> None:
solver = GurobiSolver()
instance = _get_knapsack_instance(solver)
instance = solver.build_test_instance_knapsack()
model = instance.to_model()
def lazy_cb(cb_solver: InternalSolver, cb_model: Any) -> None:

View File

@@ -13,7 +13,6 @@ from miplearn import Instance, InternalSolver
from miplearn.instance.picklegz import PickleGzInstance, write_pickle_gz, read_pickle_gz
from miplearn.solvers.gurobi import GurobiSolver
from miplearn.solvers.learning import LearningSolver
from . import _get_knapsack_instance
# noinspection PyUnresolvedReferences
from tests import internal_solvers
@@ -27,7 +26,7 @@ def test_learning_solver(
for mode in ["exact", "heuristic"]:
for internal_solver in internal_solvers:
logger.info("Solver: %s" % internal_solver)
instance = _get_knapsack_instance(internal_solver)
instance = internal_solver.build_test_instance_knapsack()
solver = LearningSolver(
solver=internal_solver,
mode=mode,
@@ -71,7 +70,7 @@ def test_solve_without_lp(
) -> None:
for internal_solver in internal_solvers:
logger.info("Solver: %s" % internal_solver)
instance = _get_knapsack_instance(internal_solver)
instance = internal_solver.build_test_instance_knapsack()
solver = LearningSolver(
solver=internal_solver,
solve_lp=False,
@@ -85,7 +84,7 @@ def test_parallel_solve(
internal_solvers: List[InternalSolver],
) -> None:
for internal_solver in internal_solvers:
instances = [_get_knapsack_instance(internal_solver) for _ in range(10)]
instances = [internal_solver.build_test_instance_knapsack() for _ in range(10)]
solver = LearningSolver(solver=internal_solver)
results = solver.parallel_solve(instances, n_jobs=3)
assert len(results) == 10
@@ -102,7 +101,7 @@ def test_solve_fit_from_disk(
# Create instances and pickle them
instances: List[Instance] = []
for k in range(3):
instance = _get_knapsack_instance(internal_solver)
instance = internal_solver.build_test_instance_knapsack()
with tempfile.NamedTemporaryFile(suffix=".pkl", delete=False) as file:
instances += [PickleGzInstance(file.name)]
write_pickle_gz(instance, file.name)
@@ -132,7 +131,7 @@ def test_solve_fit_from_disk(
def test_simulate_perfect() -> None:
internal_solver = GurobiSolver()
instance = _get_knapsack_instance(internal_solver)
instance = internal_solver.build_test_instance_knapsack()
with tempfile.NamedTemporaryFile(suffix=".pkl", delete=False) as tmp:
write_pickle_gz(instance, tmp.name)
solver = LearningSolver(