Implement PrimalSolutionComponent; remove deprecated predictors

This commit is contained in:
2020-02-24 10:01:21 -06:00
parent ccd694af9b
commit a2fbb9f8d8
12 changed files with 140 additions and 669 deletions

View File

@@ -2,7 +2,7 @@
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
# Released under the modified BSD license. See COPYING.md for more details.
from miplearn import LearningSolver, BenchmarkRunner, KnnWarmStartPredictor
from miplearn import LearningSolver, BenchmarkRunner
from miplearn.problems.stab import MaxWeightStableSetGenerator
from scipy.stats import randint
import numpy as np

View File

@@ -4,10 +4,10 @@
from miplearn.problems.knapsack import KnapsackInstance
from miplearn import (LearningSolver,
UserFeaturesExtractor,
SolutionExtractor,
CombinedExtractor,
InstanceFeaturesExtractor
InstanceFeaturesExtractor,
VariableFeaturesExtractor,
)
import numpy as np
import pyomo.environ as pe
@@ -31,16 +31,6 @@ def _get_instances():
return instances, models
def test_user_features_extractor():
instances, models = _get_instances()
extractor = UserFeaturesExtractor()
features = extractor.extract(instances)
assert isinstance(features, dict)
assert "default" in features.keys()
assert isinstance(features["default"], np.ndarray)
assert features["default"].shape == (6, 4)
def test_solution_extractor():
instances, models = _get_instances()
features = SolutionExtractor().extract(instances, models)
@@ -60,16 +50,25 @@ def test_solution_extractor():
def test_combined_extractor():
instances, models = _get_instances()
extractor = CombinedExtractor(extractors=[UserFeaturesExtractor(),
extractor = CombinedExtractor(extractors=[VariableFeaturesExtractor(),
SolutionExtractor()])
features = extractor.extract(instances, models)
assert isinstance(features, dict)
assert "default" in features.keys()
assert isinstance(features["default"], np.ndarray)
assert features["default"].shape == (6, 6)
assert features["default"].shape == (6, 7)
def test_instance_features_extractor():
instances, models = _get_instances()
features = InstanceFeaturesExtractor().extract(instances)
assert features.shape == (2,3)
assert features.shape == (2,3)
def test_variable_features_extractor():
instances, models = _get_instances()
features = VariableFeaturesExtractor().extract(instances)
assert isinstance(features, dict)
assert "default" in features
assert features["default"].shape == (6,5)

View File

@@ -2,7 +2,7 @@
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
# Released under the modified BSD license. See COPYING.md for more details.
from miplearn import LearningSolver, BranchPriorityComponent, WarmStartComponent
from miplearn import LearningSolver, BranchPriorityComponent
from miplearn.problems.knapsack import KnapsackInstance
@@ -16,50 +16,52 @@ def _get_instance():
def test_solver():
instance = _get_instance()
for internal_solver in ["cplex", "gurobi"]:
solver = LearningSolver(time_limit=300,
gap_tolerance=1e-3,
threads=1,
solver=internal_solver,
)
results = solver.solve(instance)
assert instance.solution["x"][0] == 1.0
assert instance.solution["x"][1] == 0.0
assert instance.solution["x"][2] == 1.0
assert instance.solution["x"][3] == 1.0
assert instance.lower_bound == 1183.0
assert instance.upper_bound == 1183.0
assert round(instance.lp_solution["x"][0], 3) == 1.000
assert round(instance.lp_solution["x"][1], 3) == 0.923
assert round(instance.lp_solution["x"][2], 3) == 1.000
assert round(instance.lp_solution["x"][3], 3) == 0.000
assert round(instance.lp_value, 3) == 1287.923
solver.fit()
solver.solve(instance)
for mode in ["exact", "heuristic"]:
for internal_solver in ["cplex", "gurobi"]:
solver = LearningSolver(time_limit=300,
gap_tolerance=1e-3,
threads=1,
solver=internal_solver,
mode=mode,
)
results = solver.solve(instance)
assert instance.solution["x"][0] == 1.0
assert instance.solution["x"][1] == 0.0
assert instance.solution["x"][2] == 1.0
assert instance.solution["x"][3] == 1.0
assert instance.lower_bound == 1183.0
assert instance.upper_bound == 1183.0
assert round(instance.lp_solution["x"][0], 3) == 1.000
assert round(instance.lp_solution["x"][1], 3) == 0.923
assert round(instance.lp_solution["x"][2], 3) == 1.000
assert round(instance.lp_solution["x"][3], 3) == 0.000
assert round(instance.lp_value, 3) == 1287.923
solver.fit()
solver.solve(instance)
def test_solve_save_load_state():
instance = _get_instance()
components_before = {
"warm-start": WarmStartComponent(),
}
solver = LearningSolver(components=components_before)
solver.solve(instance)
solver.fit()
solver.save_state("/tmp/knapsack_train.bin")
prev_x_train_len = len(solver.components["warm-start"].x_train)
prev_y_train_len = len(solver.components["warm-start"].y_train)
# def test_solve_save_load_state():
# instance = _get_instance()
# components_before = {
# "warm-start": WarmStartComponent(),
# }
# solver = LearningSolver(components=components_before)
# solver.solve(instance)
# solver.fit()
# solver.save_state("/tmp/knapsack_train.bin")
# prev_x_train_len = len(solver.components["warm-start"].x_train)
# prev_y_train_len = len(solver.components["warm-start"].y_train)
components_after = {
"warm-start": WarmStartComponent(),
}
solver = LearningSolver(components=components_after)
solver.load_state("/tmp/knapsack_train.bin")
assert len(solver.components.keys()) == 1
assert len(solver.components["warm-start"].x_train) == prev_x_train_len
assert len(solver.components["warm-start"].y_train) == prev_y_train_len
# components_after = {
# "warm-start": WarmStartComponent(),
# }
# solver = LearningSolver(components=components_after)
# solver.load_state("/tmp/knapsack_train.bin")
# assert len(solver.components.keys()) == 1
# assert len(solver.components["warm-start"].x_train) == prev_x_train_len
# assert len(solver.components["warm-start"].y_train) == prev_y_train_len
def test_parallel_solve():
@@ -67,8 +69,6 @@ def test_parallel_solve():
solver = LearningSolver()
results = solver.parallel_solve(instances, n_jobs=3)
assert len(results) == 10
# assert len(solver.components["warm-start"].x_train["default"]) == 40
# assert len(solver.components["warm-start"].y_train["default"]) == 40
for instance in instances:
assert len(instance.solution["x"].keys()) == 4