From fe47b0825fd93616f3801776b3489dcb9c24f649 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Tue, 26 Jan 2021 22:20:18 -0600 Subject: [PATCH] Remove unused extractors --- miplearn/__init__.py | 7 +--- miplearn/extractors.py | 84 ---------------------------------------- tests/test_extractors.py | 37 +----------------- 3 files changed, 2 insertions(+), 126 deletions(-) diff --git a/miplearn/__init__.py b/miplearn/__init__.py index 5afc454..b6525a0 100644 --- a/miplearn/__init__.py +++ b/miplearn/__init__.py @@ -19,12 +19,7 @@ from .components.primal import PrimalSolutionComponent from .components.steps.convert_tight import ConvertTightIneqsIntoEqsStep from .components.steps.drop_redundant import DropRedundantInequalitiesStep from .components.steps.relax_integrality import RelaxIntegralityStep -from .extractors import ( - SolutionExtractor, - InstanceFeaturesExtractor, - ObjectiveValueExtractor, - VariableFeaturesExtractor, -) +from .extractors import InstanceFeaturesExtractor from .instance import Instance from .log import setup_logger from .solvers.gurobi import GurobiSolver diff --git a/miplearn/extractors.py b/miplearn/extractors.py index 25c0194..4e2c755 100644 --- a/miplearn/extractors.py +++ b/miplearn/extractors.py @@ -67,61 +67,6 @@ class Extractor(ABC): return result -class VariableFeaturesExtractor(Extractor): - def extract(self, instances): - result = {} - for instance in tqdm( - InstanceIterator(instances), - desc="Extract (vars)", - disable=len(instances) < 5, - ): - instance_features = instance.get_instance_features() - var_split = self.split_variables(instance) - lp_solution = instance.training_data[0]["LP solution"] - for (category, var_index_pairs) in var_split.items(): - if category not in result: - result[category] = [] - for (var_name, index) in var_index_pairs: - result[category] += [ - instance_features.tolist() - + instance.get_variable_features(var_name, index).tolist() - + [lp_solution[var_name][index]] - ] - for category in result: - result[category] = np.array(result[category]) - return result - - -class SolutionExtractor(Extractor): - def __init__(self, relaxation=False): - self.relaxation = relaxation - - def extract(self, instances): - result = {} - for instance in tqdm( - InstanceIterator(instances), - desc="Extract (solution)", - disable=len(instances) < 5, - ): - var_split = self.split_variables(instance) - if self.relaxation: - solution = instance.training_data[0]["LP solution"] - else: - solution = instance.training_data[0]["Solution"] - for (category, var_index_pairs) in var_split.items(): - if category not in result: - result[category] = [] - for (var_name, index) in var_index_pairs: - v = solution[var_name][index] - if v is None: - result[category] += [[0, 0]] - else: - result[category] += [[1 - v, v]] - for category in result: - result[category] = np.array(result[category]) - return result - - class InstanceFeaturesExtractor(Extractor): def extract(self, instances): return np.vstack( @@ -135,32 +80,3 @@ class InstanceFeaturesExtractor(Extractor): for instance in InstanceIterator(instances) ] ) - - -class ObjectiveValueExtractor(Extractor): - def __init__(self, kind="lp"): - assert kind in ["lower bound", "upper bound", "lp"] - self.kind = kind - - def extract(self, instances): - if self.kind == "lower bound": - return np.array( - [ - [instance.training_data[0]["Lower bound"]] - for instance in InstanceIterator(instances) - ] - ) - if self.kind == "upper bound": - return np.array( - [ - [instance.training_data[0]["Upper bound"]] - for instance in InstanceIterator(instances) - ] - ) - if self.kind == "lp": - return np.array( - [ - [instance.training_data[0]["LP value"]] - for instance in InstanceIterator(instances) - ] - ) diff --git a/tests/test_extractors.py b/tests/test_extractors.py index 2d501db..e36dcd8 100644 --- a/tests/test_extractors.py +++ b/tests/test_extractors.py @@ -3,11 +3,7 @@ # Released under the modified BSD license. See COPYING.md for more details. import numpy as np -from miplearn.extractors import ( - SolutionExtractor, - InstanceFeaturesExtractor, - VariableFeaturesExtractor, -) +from miplearn.extractors import InstanceFeaturesExtractor from miplearn.problems.knapsack import KnapsackInstance from miplearn.solvers.learning import LearningSolver @@ -32,38 +28,7 @@ def _get_instances(): return instances, models -def test_solution_extractor(): - instances, models = _get_instances() - features = SolutionExtractor().extract(instances) - assert isinstance(features, dict) - assert "default" in features.keys() - assert isinstance(features["default"], np.ndarray) - assert features["default"].shape == (6, 2) - assert features["default"].ravel().tolist() == [ - 1.0, - 0.0, - 0.0, - 1.0, - 1.0, - 0.0, - 1.0, - 0.0, - 0.0, - 1.0, - 1.0, - 0.0, - ] - - def test_instance_features_extractor(): instances, models = _get_instances() features = InstanceFeaturesExtractor().extract(instances) 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)