Add first model feature (constraint RHS)

This commit is contained in:
2021-03-02 17:21:05 -06:00
parent 31ca45036a
commit 1397937f03
17 changed files with 167 additions and 47 deletions

View File

@@ -3,7 +3,7 @@
# Released under the modified BSD license. See COPYING.md for more details.
from inspect import isclass
from typing import List, Callable
from typing import List, Callable, Any
from miplearn.problems.knapsack import KnapsackInstance, GurobiKnapsackInstance
from miplearn.solvers.gurobi import GurobiSolver
@@ -13,7 +13,7 @@ from miplearn.solvers.pyomo.gurobi import GurobiPyomoSolver
from miplearn.solvers.pyomo.xpress import XpressPyomoSolver
def _is_subclass_or_instance(obj, parent_class):
def _is_subclass_or_instance(obj: Any, parent_class: Any) -> bool:
return isinstance(obj, parent_class) or (
isclass(obj) and issubclass(obj, parent_class)
)
@@ -35,5 +35,5 @@ def _get_knapsack_instance(solver):
assert False
def _get_internal_solvers() -> List[Callable[[], InternalSolver]]:
def get_internal_solvers() -> List[Callable[[], InternalSolver]]:
return [GurobiPyomoSolver, GurobiSolver, XpressPyomoSolver]

View File

@@ -13,7 +13,7 @@ from miplearn.solvers.gurobi import GurobiSolver
from miplearn.solvers.pyomo.base import BasePyomoSolver
from . import (
_get_knapsack_instance,
_get_internal_solvers,
get_internal_solvers,
)
from ..fixtures.infeasible import get_infeasible_instance
@@ -32,7 +32,7 @@ def test_redirect_output():
def test_internal_solver_warm_starts():
for solver_class in _get_internal_solvers():
for solver_class in get_internal_solvers():
logger.info("Solver: %s" % solver_class)
instance = _get_knapsack_instance(solver_class)
model = instance.to_model()
@@ -83,7 +83,7 @@ def test_internal_solver_warm_starts():
def test_internal_solver():
for solver_class in _get_internal_solvers():
for solver_class in get_internal_solvers():
logger.info("Solver: %s" % solver_class)
instance = _get_knapsack_instance(solver_class)
@@ -175,7 +175,7 @@ def test_internal_solver():
def test_relax():
for solver_class in _get_internal_solvers():
for solver_class in get_internal_solvers():
instance = _get_knapsack_instance(solver_class)
solver = solver_class()
solver.set_instance(instance)
@@ -185,7 +185,7 @@ def test_relax():
def test_infeasible_instance():
for solver_class in _get_internal_solvers():
for solver_class in get_internal_solvers():
instance = get_infeasible_instance(solver_class)
solver = solver_class()
solver.set_instance(instance)
@@ -203,7 +203,7 @@ def test_infeasible_instance():
def test_iteration_cb():
for solver_class in _get_internal_solvers():
for solver_class in get_internal_solvers():
logger.info("Solver: %s" % solver_class)
instance = _get_knapsack_instance(solver_class)
solver = solver_class()

View File

@@ -10,14 +10,14 @@ import os
from miplearn.solvers.gurobi import GurobiSolver
from miplearn.solvers.learning import LearningSolver
from . import _get_knapsack_instance, _get_internal_solvers
from . import _get_knapsack_instance, get_internal_solvers
logger = logging.getLogger(__name__)
def test_learning_solver():
for mode in ["exact", "heuristic"]:
for internal_solver in _get_internal_solvers():
for internal_solver in get_internal_solvers():
logger.info("Solver: %s" % internal_solver)
instance = _get_knapsack_instance(internal_solver)
solver = LearningSolver(
@@ -26,6 +26,9 @@ def test_learning_solver():
)
solver.solve(instance)
assert hasattr(instance, "model_features")
data = instance.training_data[0]
assert data["Solution"]["x"][0] == 1.0
assert data["Solution"]["x"][1] == 0.0
@@ -49,7 +52,7 @@ def test_learning_solver():
def test_solve_without_lp():
for internal_solver in _get_internal_solvers():
for internal_solver in get_internal_solvers():
logger.info("Solver: %s" % internal_solver)
instance = _get_knapsack_instance(internal_solver)
solver = LearningSolver(
@@ -62,7 +65,7 @@ def test_solve_without_lp():
def test_parallel_solve():
for internal_solver in _get_internal_solvers():
for internal_solver in get_internal_solvers():
instances = [_get_knapsack_instance(internal_solver) for _ in range(10)]
solver = LearningSolver(solver=internal_solver)
results = solver.parallel_solve(instances, n_jobs=3)
@@ -73,7 +76,7 @@ def test_parallel_solve():
def test_solve_fit_from_disk():
for internal_solver in _get_internal_solvers():
for internal_solver in get_internal_solvers():
# Create instances and pickle them
filenames = []
for k in range(3):