|
|
|
@ -11,35 +11,10 @@ from numpy.testing import assert_array_equal
|
|
|
|
|
from miplearn.instance import Instance
|
|
|
|
|
from miplearn.classifiers import Regressor
|
|
|
|
|
from miplearn.components.objective import ObjectiveValueComponent
|
|
|
|
|
from miplearn.types import TrainingSample
|
|
|
|
|
from miplearn.types import TrainingSample, Features
|
|
|
|
|
from tests.fixtures.knapsack import get_test_pyomo_instances
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_xy_sample() -> None:
|
|
|
|
|
instance = cast(Instance, Mock(spec=Instance))
|
|
|
|
|
instance.features = {
|
|
|
|
|
"Instance": {
|
|
|
|
|
"User features": [1.0, 2.0],
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
sample: TrainingSample = {
|
|
|
|
|
"Lower bound": 1.0,
|
|
|
|
|
"Upper bound": 2.0,
|
|
|
|
|
"LP value": 3.0,
|
|
|
|
|
}
|
|
|
|
|
x_expected = {
|
|
|
|
|
"Lower bound": [[1.0, 2.0, 3.0]],
|
|
|
|
|
"Upper bound": [[1.0, 2.0, 3.0]],
|
|
|
|
|
}
|
|
|
|
|
y_expected = {
|
|
|
|
|
"Lower bound": [[1.0]],
|
|
|
|
|
"Upper bound": [[2.0]],
|
|
|
|
|
}
|
|
|
|
|
x_actual, y_actual = ObjectiveValueComponent.xy_sample(instance, sample)
|
|
|
|
|
assert x_actual == x_expected
|
|
|
|
|
assert y_actual == y_expected
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_x_y_predict() -> None:
|
|
|
|
|
# Construct instance
|
|
|
|
|
instance = cast(Instance, Mock(spec=Instance))
|
|
|
|
@ -125,3 +100,54 @@ def test_obj_evaluate():
|
|
|
|
|
"R2": -5.012843605607331,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_xy_sample_with_lp() -> None:
|
|
|
|
|
features: Features = {
|
|
|
|
|
"Instance": {
|
|
|
|
|
"User features": [1.0, 2.0],
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
sample: TrainingSample = {
|
|
|
|
|
"Lower bound": 1.0,
|
|
|
|
|
"Upper bound": 2.0,
|
|
|
|
|
"LP value": 3.0,
|
|
|
|
|
}
|
|
|
|
|
x_expected = {
|
|
|
|
|
"Lower bound": [[1.0, 2.0, 3.0]],
|
|
|
|
|
"Upper bound": [[1.0, 2.0, 3.0]],
|
|
|
|
|
}
|
|
|
|
|
y_expected = {
|
|
|
|
|
"Lower bound": [[1.0]],
|
|
|
|
|
"Upper bound": [[2.0]],
|
|
|
|
|
}
|
|
|
|
|
xy = ObjectiveValueComponent.xy_sample(features, sample)
|
|
|
|
|
assert xy is not None
|
|
|
|
|
x_actual, y_actual = xy
|
|
|
|
|
assert x_actual == x_expected
|
|
|
|
|
assert y_actual == y_expected
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_xy_sample_without_lp() -> None:
|
|
|
|
|
features: Features = {
|
|
|
|
|
"Instance": {
|
|
|
|
|
"User features": [1.0, 2.0],
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
sample: TrainingSample = {
|
|
|
|
|
"Lower bound": 1.0,
|
|
|
|
|
"Upper bound": 2.0,
|
|
|
|
|
}
|
|
|
|
|
x_expected = {
|
|
|
|
|
"Lower bound": [[1.0, 2.0]],
|
|
|
|
|
"Upper bound": [[1.0, 2.0]],
|
|
|
|
|
}
|
|
|
|
|
y_expected = {
|
|
|
|
|
"Lower bound": [[1.0]],
|
|
|
|
|
"Upper bound": [[2.0]],
|
|
|
|
|
}
|
|
|
|
|
xy = ObjectiveValueComponent.xy_sample(features, sample)
|
|
|
|
|
assert xy is not None
|
|
|
|
|
x_actual, y_actual = xy
|
|
|
|
|
assert x_actual == x_expected
|
|
|
|
|
assert y_actual == y_expected
|
|
|
|
|