parent
31ca45036a
commit
1397937f03
@ -0,0 +1,26 @@
|
||||
# MIPLearn: Extensible Framework for Learning-Enhanced Mixed-Integer Optimization
|
||||
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
||||
# Released under the modified BSD license. See COPYING.md for more details.
|
||||
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from miplearn.types import ModelFeatures
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from miplearn import InternalSolver
|
||||
|
||||
|
||||
class ModelFeaturesExtractor:
|
||||
def __init__(
|
||||
self,
|
||||
internal_solver: "InternalSolver",
|
||||
) -> None:
|
||||
self.internal_solver = internal_solver
|
||||
|
||||
def extract(self) -> ModelFeatures:
|
||||
rhs = {}
|
||||
for cid in self.internal_solver.get_constraint_ids():
|
||||
rhs[cid] = self.internal_solver.get_constraint_rhs(cid)
|
||||
return {
|
||||
"ConstraintRHS": rhs,
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
# MIPLearn: Extensible Framework for Learning-Enhanced Mixed-Integer Optimization
|
||||
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
||||
# Released under the modified BSD license. See COPYING.md for more details.
|
||||
|
||||
from miplearn import BasePyomoSolver, GurobiSolver, InternalSolver, Instance
|
||||
from miplearn.problems.knapsack import KnapsackInstance, GurobiKnapsackInstance
|
||||
from miplearn.solvers.learning import LearningSolver
|
||||
from tests.solvers import _is_subclass_or_instance
|
||||
|
||||
|
||||
def get_test_pyomo_instances():
|
||||
instances = [
|
||||
KnapsackInstance(
|
||||
weights=[23.0, 26.0, 20.0, 18.0],
|
||||
prices=[505.0, 352.0, 458.0, 220.0],
|
||||
capacity=67.0,
|
||||
),
|
||||
KnapsackInstance(
|
||||
weights=[25.0, 30.0, 22.0, 18.0],
|
||||
prices=[500.0, 365.0, 420.0, 150.0],
|
||||
capacity=70.0,
|
||||
),
|
||||
]
|
||||
models = [instance.to_model() for instance in instances]
|
||||
solver = LearningSolver()
|
||||
for i in range(len(instances)):
|
||||
solver.solve(instances[i], models[i])
|
||||
return instances, models
|
||||
|
||||
|
||||
def get_knapsack_instance(solver: InternalSolver) -> 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,
|
||||
)
|
||||
elif _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,
|
||||
)
|
||||
else:
|
||||
assert False
|
@ -0,0 +1,23 @@
|
||||
# MIPLearn: Extensible Framework for Learning-Enhanced Mixed-Integer Optimization
|
||||
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
||||
# Released under the modified BSD license. See COPYING.md for more details.
|
||||
from miplearn.features import ModelFeaturesExtractor
|
||||
from tests.fixtures.knapsack import get_knapsack_instance
|
||||
from tests.solvers import get_internal_solvers
|
||||
|
||||
|
||||
def test_knapsack() -> None:
|
||||
for solver_factory in get_internal_solvers():
|
||||
# Initialize model, instance and internal solver
|
||||
solver = solver_factory()
|
||||
instance = get_knapsack_instance(solver)
|
||||
model = instance.to_model()
|
||||
solver.set_instance(instance, model)
|
||||
|
||||
# Extract all model features
|
||||
extractor = ModelFeaturesExtractor(solver)
|
||||
features = extractor.extract()
|
||||
|
||||
# Test constraint features
|
||||
print(solver, features)
|
||||
assert features["ConstraintRHS"]["eq_capacity"] == 67.0
|
Loading…
Reference in new issue