mirror of
https://github.com/ANL-CEEESA/MIPLearn.git
synced 2025-12-06 09:28:51 -06:00
Move instance fixtures into the main source; remove duplication
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user