From 851b8001bb94c60bd3c710666e0af83febf1122d Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Wed, 14 Jul 2021 08:23:52 -0500 Subject: [PATCH] Move features to its own package --- miplearn/components/component.py | 2 +- miplearn/components/dynamic_common.py | 2 +- miplearn/components/dynamic_lazy.py | 2 +- miplearn/components/dynamic_user_cuts.py | 2 +- miplearn/components/objective.py | 2 +- miplearn/components/primal.py | 2 +- miplearn/components/static_lazy.py | 2 +- miplearn/features/__init__.py | 3 +++ .../{features.py => features/extractor.py} | 21 ++-------------- miplearn/features/sample.py | 24 +++++++++++++++++++ miplearn/instance/base.py | 2 +- miplearn/instance/picklegz.py | 2 +- miplearn/solvers/internal.py | 2 +- miplearn/solvers/learning.py | 3 ++- tests/components/test_dynamic_lazy.py | 2 +- tests/components/test_objective.py | 2 +- tests/components/test_primal.py | 2 +- tests/components/test_static_lazy.py | 2 +- tests/test_features.py | 6 ++--- 19 files changed, 47 insertions(+), 38 deletions(-) create mode 100644 miplearn/features/__init__.py rename miplearn/{features.py => features/extractor.py} (96%) create mode 100644 miplearn/features/sample.py diff --git a/miplearn/components/component.py b/miplearn/components/component.py index cf7e104..22a1cda 100644 --- a/miplearn/components/component.py +++ b/miplearn/components/component.py @@ -7,7 +7,7 @@ from typing import Any, List, TYPE_CHECKING, Tuple, Dict, Hashable, Optional import numpy as np from p_tqdm import p_umap -from miplearn.features import Sample +from miplearn.features.sample import Sample from miplearn.instance.base import Instance from miplearn.types import LearningSolveStats diff --git a/miplearn/components/dynamic_common.py b/miplearn/components/dynamic_common.py index e6ca2d2..3f69156 100644 --- a/miplearn/components/dynamic_common.py +++ b/miplearn/components/dynamic_common.py @@ -12,7 +12,7 @@ from miplearn.classifiers import Classifier from miplearn.classifiers.threshold import Threshold from miplearn.components import classifier_evaluation_dict from miplearn.components.component import Component -from miplearn.features import Sample +from miplearn.features.sample import Sample from miplearn.instance.base import Instance logger = logging.getLogger(__name__) diff --git a/miplearn/components/dynamic_lazy.py b/miplearn/components/dynamic_lazy.py index a30ec5e..fdf56aa 100644 --- a/miplearn/components/dynamic_lazy.py +++ b/miplearn/components/dynamic_lazy.py @@ -13,7 +13,7 @@ from miplearn.classifiers.counting import CountingClassifier from miplearn.classifiers.threshold import MinProbabilityThreshold, Threshold from miplearn.components.component import Component from miplearn.components.dynamic_common import DynamicConstraintsComponent -from miplearn.features import Sample +from miplearn.features.sample import Sample from miplearn.instance.base import Instance from miplearn.types import LearningSolveStats diff --git a/miplearn/components/dynamic_user_cuts.py b/miplearn/components/dynamic_user_cuts.py index fd8b141..4db64e0 100644 --- a/miplearn/components/dynamic_user_cuts.py +++ b/miplearn/components/dynamic_user_cuts.py @@ -13,7 +13,7 @@ from miplearn.classifiers.counting import CountingClassifier from miplearn.classifiers.threshold import Threshold, MinProbabilityThreshold from miplearn.components.component import Component from miplearn.components.dynamic_common import DynamicConstraintsComponent -from miplearn.features import Sample +from miplearn.features.sample import Sample from miplearn.instance.base import Instance from miplearn.types import LearningSolveStats diff --git a/miplearn/components/objective.py b/miplearn/components/objective.py index 1c66ab8..de2852c 100644 --- a/miplearn/components/objective.py +++ b/miplearn/components/objective.py @@ -12,7 +12,7 @@ from sklearn.linear_model import LinearRegression from miplearn.classifiers import Regressor from miplearn.classifiers.sklearn import ScikitLearnRegressor from miplearn.components.component import Component -from miplearn.features import Sample +from miplearn.features.sample import Sample from miplearn.instance.base import Instance from miplearn.types import LearningSolveStats diff --git a/miplearn/components/primal.py b/miplearn/components/primal.py index 2abc798..b9d141f 100644 --- a/miplearn/components/primal.py +++ b/miplearn/components/primal.py @@ -21,7 +21,7 @@ from miplearn.classifiers.adaptive import AdaptiveClassifier from miplearn.classifiers.threshold import MinPrecisionThreshold, Threshold from miplearn.components import classifier_evaluation_dict from miplearn.components.component import Component -from miplearn.features import Sample +from miplearn.features.sample import Sample from miplearn.instance.base import Instance from miplearn.types import ( LearningSolveStats, diff --git a/miplearn/components/static_lazy.py b/miplearn/components/static_lazy.py index c27f0ee..2cad2a3 100644 --- a/miplearn/components/static_lazy.py +++ b/miplearn/components/static_lazy.py @@ -12,7 +12,7 @@ from miplearn.classifiers import Classifier from miplearn.classifiers.counting import CountingClassifier from miplearn.classifiers.threshold import MinProbabilityThreshold, Threshold from miplearn.components.component import Component -from miplearn.features import Sample +from miplearn.features.sample import Sample from miplearn.solvers.internal import Constraints from miplearn.instance.base import Instance from miplearn.types import LearningSolveStats diff --git a/miplearn/features/__init__.py b/miplearn/features/__init__.py new file mode 100644 index 0000000..5fbccb1 --- /dev/null +++ b/miplearn/features/__init__.py @@ -0,0 +1,3 @@ +# MIPLearn: Extensible Framework for Learning-Enhanced Mixed-Integer Optimization +# Copyright (C) 2020-2021, UChicago Argonne, LLC. All rights reserved. +# Released under the modified BSD license. See COPYING.md for more details. diff --git a/miplearn/features.py b/miplearn/features/extractor.py similarity index 96% rename from miplearn/features.py rename to miplearn/features/extractor.py index eec166b..b26f97f 100644 --- a/miplearn/features.py +++ b/miplearn/features/extractor.py @@ -9,30 +9,13 @@ from typing import TYPE_CHECKING, Dict, Optional, List, Hashable, Any import numpy as np +from miplearn.features.sample import Sample + if TYPE_CHECKING: from miplearn.solvers.internal import InternalSolver from miplearn.instance.base import Instance -class Sample: - def __init__( - self, - data: Optional[Dict[str, Any]] = None, - ) -> None: - if data is None: - data = {} - self._data: Dict[str, Any] = data - - def get(self, key: str) -> Optional[Any]: - if key in self._data: - return self._data[key] - else: - return None - - def put(self, key: str, value: Any) -> None: - self._data[key] = value - - class FeaturesExtractor: def __init__( self, diff --git a/miplearn/features/sample.py b/miplearn/features/sample.py new file mode 100644 index 0000000..ae85c72 --- /dev/null +++ b/miplearn/features/sample.py @@ -0,0 +1,24 @@ +# MIPLearn: Extensible Framework for Learning-Enhanced Mixed-Integer Optimization +# Copyright (C) 2020-2021, UChicago Argonne, LLC. All rights reserved. +# Released under the modified BSD license. See COPYING.md for more details. + +from typing import Dict, Optional, Any + + +class Sample: + def __init__( + self, + data: Optional[Dict[str, Any]] = None, + ) -> None: + if data is None: + data = {} + self._data: Dict[str, Any] = data + + def get(self, key: str) -> Optional[Any]: + if key in self._data: + return self._data[key] + else: + return None + + def put(self, key: str, value: Any) -> None: + self._data[key] = value diff --git a/miplearn/instance/base.py b/miplearn/instance/base.py index c14df41..17817cf 100644 --- a/miplearn/instance/base.py +++ b/miplearn/instance/base.py @@ -6,7 +6,7 @@ import logging from abc import ABC, abstractmethod from typing import Any, List, Hashable, TYPE_CHECKING, Dict -from miplearn.features import Sample +from miplearn.features.sample import Sample logger = logging.getLogger(__name__) diff --git a/miplearn/instance/picklegz.py b/miplearn/instance/picklegz.py index 9cb4e2e..80ebcc6 100644 --- a/miplearn/instance/picklegz.py +++ b/miplearn/instance/picklegz.py @@ -10,7 +10,7 @@ from typing import Optional, Any, List, Hashable, cast, IO, TYPE_CHECKING, Dict from overrides import overrides -from miplearn.features import Sample +from miplearn.features.sample import Sample from miplearn.instance.base import Instance if TYPE_CHECKING: diff --git a/miplearn/solvers/internal.py b/miplearn/solvers/internal.py index 1cdcfad..f2e20d2 100644 --- a/miplearn/solvers/internal.py +++ b/miplearn/solvers/internal.py @@ -18,7 +18,7 @@ from miplearn.types import ( logger = logging.getLogger(__name__) if TYPE_CHECKING: - from miplearn.features import Sample + from miplearn.features.sample import Sample @dataclass diff --git a/miplearn/solvers/learning.py b/miplearn/solvers/learning.py index 04b8f89..986afdb 100644 --- a/miplearn/solvers/learning.py +++ b/miplearn/solvers/learning.py @@ -14,7 +14,8 @@ from miplearn.components.dynamic_lazy import DynamicLazyConstraintsComponent from miplearn.components.dynamic_user_cuts import UserCutsComponent from miplearn.components.objective import ObjectiveValueComponent from miplearn.components.primal import PrimalSolutionComponent -from miplearn.features import FeaturesExtractor, Sample +from miplearn.features.extractor import FeaturesExtractor +from miplearn.features.sample import Sample from miplearn.instance.base import Instance from miplearn.instance.picklegz import PickleGzInstance from miplearn.solvers import _RedirectOutput diff --git a/tests/components/test_dynamic_lazy.py b/tests/components/test_dynamic_lazy.py index 3963df6..f29dc47 100644 --- a/tests/components/test_dynamic_lazy.py +++ b/tests/components/test_dynamic_lazy.py @@ -11,7 +11,7 @@ from miplearn.classifiers import Classifier from miplearn.classifiers.threshold import MinProbabilityThreshold from miplearn.components import classifier_evaluation_dict from miplearn.components.dynamic_lazy import DynamicLazyConstraintsComponent -from miplearn.features import Sample +from miplearn.features.sample import Sample from miplearn.instance.base import Instance from miplearn.solvers.tests import assert_equals diff --git a/tests/components/test_objective.py b/tests/components/test_objective.py index 1a02dc7..84f5bc6 100644 --- a/tests/components/test_objective.py +++ b/tests/components/test_objective.py @@ -10,7 +10,7 @@ from numpy.testing import assert_array_equal from miplearn.classifiers import Regressor from miplearn.components.objective import ObjectiveValueComponent -from miplearn.features import Sample +from miplearn.features.sample import Sample from miplearn.solvers.learning import LearningSolver from miplearn.solvers.pyomo.gurobi import GurobiPyomoSolver diff --git a/tests/components/test_primal.py b/tests/components/test_primal.py index e00ece3..16b6c2d 100644 --- a/tests/components/test_primal.py +++ b/tests/components/test_primal.py @@ -12,7 +12,7 @@ from miplearn.classifiers import Classifier from miplearn.classifiers.threshold import Threshold from miplearn.components import classifier_evaluation_dict from miplearn.components.primal import PrimalSolutionComponent -from miplearn.features import Sample +from miplearn.features.sample import Sample from miplearn.problems.tsp import TravelingSalesmanGenerator from miplearn.solvers.learning import LearningSolver from miplearn.solvers.tests import assert_equals diff --git a/tests/components/test_static_lazy.py b/tests/components/test_static_lazy.py index 727df8d..ed4f91d 100644 --- a/tests/components/test_static_lazy.py +++ b/tests/components/test_static_lazy.py @@ -11,7 +11,7 @@ from numpy.testing import assert_array_equal from miplearn.classifiers import Classifier from miplearn.classifiers.threshold import Threshold, MinProbabilityThreshold from miplearn.components.static_lazy import StaticLazyConstraintsComponent -from miplearn.features import Sample +from miplearn.features.sample import Sample from miplearn.instance.base import Instance from miplearn.solvers.internal import InternalSolver, Constraints from miplearn.solvers.learning import LearningSolver diff --git a/tests/test_features.py b/tests/test_features.py index 2aa563c..c7b5557 100644 --- a/tests/test_features.py +++ b/tests/test_features.py @@ -4,10 +4,8 @@ import numpy as np -from miplearn.features import ( - FeaturesExtractor, - Sample, -) +from miplearn.features.extractor import FeaturesExtractor +from miplearn.features.sample import Sample from miplearn.solvers.internal import Variables, Constraints from miplearn.solvers.gurobi import GurobiSolver from miplearn.solvers.tests import assert_equals