Remove obsolete methods

This commit is contained in:
2021-04-13 09:42:25 -05:00
parent c26b852c67
commit c4a6665825
22 changed files with 93 additions and 499 deletions

View File

@@ -9,8 +9,8 @@ from miplearn.features import Features
from miplearn.instance.base import Instance
def test_xy_instance_old() -> None:
def _sample_xy_old(features: Features, sample: str) -> Tuple[Dict, Dict]:
def test_xy_instance() -> None:
def _sample_xy(features: Features, sample: str) -> Tuple[Dict, Dict]:
x = {
"s1": {
"category_a": [
@@ -55,12 +55,10 @@ def test_xy_instance_old() -> None:
comp = Component()
instance_1 = Mock(spec=Instance)
instance_1.training_data = ["s1", "s2"]
instance_1.features = {}
instance_1.samples = ["s1", "s2"]
instance_2 = Mock(spec=Instance)
instance_2.training_data = ["s3"]
instance_2.features = {}
comp.sample_xy_old = _sample_xy_old # type: ignore
instance_2.samples = ["s3"]
comp.sample_xy = _sample_xy # type: ignore
x_expected = {
"category_a": [
[1, 2, 3],
@@ -96,6 +94,6 @@ def test_xy_instance_old() -> None:
[11],
],
}
x_actual, y_actual = comp.xy_instances_old([instance_1, instance_2])
x_actual, y_actual = comp.xy_instances([instance_1, instance_2])
assert x_actual == x_expected
assert y_actual == y_expected

View File

@@ -13,7 +13,6 @@ from miplearn.classifiers.threshold import MinProbabilityThreshold
from miplearn.components import classifier_evaluation_dict
from miplearn.components.dynamic_lazy import DynamicLazyConstraintsComponent
from miplearn.features import (
TrainingSample,
Features,
InstanceFeatures,
Sample,
@@ -24,60 +23,6 @@ from miplearn.solvers.tests import assert_equals
E = 0.1
@pytest.fixture
def training_instances_old() -> List[Instance]:
instances = [cast(Instance, Mock(spec=Instance)) for _ in range(2)]
instances[0].features = Features(
instance=InstanceFeatures(
user_features=[50.0],
),
)
instances[0].training_data = [
TrainingSample(lazy_enforced={"c1", "c2"}),
TrainingSample(lazy_enforced={"c2", "c3"}),
]
instances[0].get_constraint_category = Mock( # type: ignore
side_effect=lambda cid: {
"c1": "type-a",
"c2": "type-a",
"c3": "type-b",
"c4": "type-b",
}[cid]
)
instances[0].get_constraint_features = Mock( # type: ignore
side_effect=lambda cid: {
"c1": [1.0, 2.0, 3.0],
"c2": [4.0, 5.0, 6.0],
"c3": [1.0, 2.0],
"c4": [3.0, 4.0],
}[cid]
)
instances[1].features = Features(
instance=InstanceFeatures(
user_features=[80.0],
),
)
instances[1].training_data = [
TrainingSample(lazy_enforced={"c3", "c4"}),
]
instances[1].get_constraint_category = Mock( # type: ignore
side_effect=lambda cid: {
"c1": None,
"c2": "type-a",
"c3": "type-b",
"c4": "type-b",
}[cid]
)
instances[1].get_constraint_features = Mock( # type: ignore
side_effect=lambda cid: {
"c2": [7.0, 8.0, 9.0],
"c3": [5.0, 6.0],
"c4": [7.0, 8.0],
}[cid]
)
return instances
@pytest.fixture
def training_instances() -> List[Instance]:
instances = [cast(Instance, Mock(spec=Instance)) for _ in range(2)]

View File

@@ -12,7 +12,7 @@ from gurobipy import GRB
from networkx import Graph
from overrides import overrides
from miplearn import InternalSolver
from miplearn.solvers.learning import InternalSolver
from miplearn.components.dynamic_user_cuts import UserCutsComponent
from miplearn.instance.base import Instance
from miplearn.solvers.gurobi import GurobiSolver

View File

@@ -38,17 +38,21 @@ def test_instance() -> None:
)
instance = TravelingSalesmanInstance(n_cities, distances)
solver = LearningSolver()
stats = solver.solve(instance)
solution = instance.training_data[0].solution
assert solution is not None
assert solution["x[(0, 1)]"] == 1.0
assert solution["x[(0, 2)]"] == 0.0
assert solution["x[(0, 3)]"] == 1.0
assert solution["x[(1, 2)]"] == 1.0
assert solution["x[(1, 3)]"] == 0.0
assert solution["x[(2, 3)]"] == 1.0
assert stats["mip_lower_bound"] == 4.0
assert stats["mip_upper_bound"] == 4.0
solver.solve(instance)
assert len(instance.samples) == 1
assert instance.samples[0].after_mip is not None
features = instance.samples[0].after_mip
assert features is not None
assert features.variables is not None
assert features.variables["x[(0, 1)]"].value == 1.0
assert features.variables["x[(0, 2)]"].value == 0.0
assert features.variables["x[(0, 3)]"].value == 1.0
assert features.variables["x[(1, 2)]"].value == 1.0
assert features.variables["x[(1, 3)]"].value == 0.0
assert features.variables["x[(2, 3)]"].value == 1.0
assert features.mip_solve is not None
assert features.mip_solve.mip_lower_bound == 4.0
assert features.mip_solve.mip_upper_bound == 4.0
def test_subtour() -> None:
@@ -67,18 +71,20 @@ def test_subtour() -> None:
instance = TravelingSalesmanInstance(n_cities, distances)
solver = LearningSolver()
solver.solve(instance)
assert len(instance.samples) == 1
assert instance.samples[0].after_mip is not None
assert instance.samples[0].after_mip.extra is not None
lazy_enforced = instance.samples[0].after_mip.extra["lazy_enforced"]
features = instance.samples[0].after_mip
assert features.extra is not None
assert "lazy_enforced" in features.extra
lazy_enforced = features.extra["lazy_enforced"]
assert lazy_enforced is not None
assert len(lazy_enforced) > 0
solution = instance.training_data[0].solution
assert solution is not None
assert solution["x[(0, 1)]"] == 1.0
assert solution["x[(0, 4)]"] == 1.0
assert solution["x[(1, 2)]"] == 1.0
assert solution["x[(2, 3)]"] == 1.0
assert solution["x[(3, 5)]"] == 1.0
assert solution["x[(4, 5)]"] == 1.0
assert features.variables is not None
assert features.variables["x[(0, 1)]"].value == 1.0
assert features.variables["x[(0, 4)]"].value == 1.0
assert features.variables["x[(1, 2)]"].value == 1.0
assert features.variables["x[(2, 3)]"].value == 1.0
assert features.variables["x[(3, 5)]"].value == 1.0
assert features.variables["x[(4, 5)]"].value == 1.0
solver.fit([instance])
solver.solve(instance)

View File

@@ -34,29 +34,38 @@ def test_learning_solver(
)
solver.solve(instance)
assert hasattr(instance, "features")
assert len(instance.samples) > 0
sample = instance.samples[0]
sample = instance.training_data[0]
assert sample.solution is not None
assert sample.solution["x[0]"] == 1.0
assert sample.solution["x[1]"] == 0.0
assert sample.solution["x[2]"] == 1.0
assert sample.solution["x[3]"] == 1.0
assert sample.lower_bound == 1183.0
assert sample.upper_bound == 1183.0
assert sample.lp_solution is not None
assert sample.lp_solution["x[0]"] is not None
assert sample.lp_solution["x[1]"] is not None
assert sample.lp_solution["x[2]"] is not None
assert sample.lp_solution["x[3]"] is not None
assert round(sample.lp_solution["x[0]"], 3) == 1.000
assert round(sample.lp_solution["x[1]"], 3) == 0.923
assert round(sample.lp_solution["x[2]"], 3) == 1.000
assert round(sample.lp_solution["x[3]"], 3) == 0.000
assert sample.lp_value is not None
assert round(sample.lp_value, 3) == 1287.923
assert sample.mip_log is not None
assert len(sample.mip_log) > 100
after_mip = sample.after_mip
assert after_mip is not None
assert after_mip.variables is not None
assert after_mip.mip_solve is not None
assert after_mip.variables["x[0]"].value == 1.0
assert after_mip.variables["x[1]"].value == 0.0
assert after_mip.variables["x[2]"].value == 1.0
assert after_mip.variables["x[3]"].value == 1.0
assert after_mip.mip_solve.mip_lower_bound == 1183.0
assert after_mip.mip_solve.mip_upper_bound == 1183.0
assert after_mip.mip_solve.mip_log is not None
assert len(after_mip.mip_solve.mip_log) > 100
after_lp = sample.after_lp
assert after_lp is not None
assert after_lp.variables is not None
assert after_lp.lp_solve is not None
assert after_lp.variables["x[0]"].value is not None
assert after_lp.variables["x[1]"].value is not None
assert after_lp.variables["x[2]"].value is not None
assert after_lp.variables["x[3]"].value is not None
assert round(after_lp.variables["x[0]"].value, 3) == 1.000
assert round(after_lp.variables["x[1]"].value, 3) == 0.923
assert round(after_lp.variables["x[2]"].value, 3) == 1.000
assert round(after_lp.variables["x[3]"].value, 3) == 0.000
assert after_lp.lp_solve.lp_value is not None
assert round(after_lp.lp_solve.lp_value, 3) == 1287.923
assert after_lp.lp_solve.lp_log is not None
assert len(after_lp.lp_solve.lp_log) > 100
solver.fit([instance])
solver.solve(instance)
@@ -90,9 +99,7 @@ def test_parallel_solve(
results = solver.parallel_solve(instances, n_jobs=3)
assert len(results) == 10
for instance in instances:
data = instance.training_data[0]
assert data.solution is not None
assert len(data.solution.keys()) == 5
assert len(instance.samples) == 1
def test_solve_fit_from_disk(
@@ -111,19 +118,13 @@ def test_solve_fit_from_disk(
solver = LearningSolver(solver=internal_solver)
solver.solve(instances[0])
instance_loaded = read_pickle_gz(cast(PickleGzInstance, instances[0]).filename)
assert len(instance_loaded.training_data) > 0
assert instance_loaded.features.instance is not None
assert instance_loaded.features.variables is not None
assert instance_loaded.features.constraints is not None
assert len(instance_loaded.samples) > 0
# Test: parallel_solve
solver.parallel_solve(instances)
for instance in instances:
instance_loaded = read_pickle_gz(cast(PickleGzInstance, instance).filename)
assert len(instance_loaded.training_data) > 0
assert instance_loaded.features.instance is not None
assert instance_loaded.features.variables is not None
assert instance_loaded.features.constraints is not None
assert len(instance_loaded.samples) > 0
# Delete temporary files
for instance in instances: