Remove EnforceOverrides; automatically convert np.ndarray features

master
Alinson S. Xavier 5 years ago
parent 157825a345
commit 6330354c47

@ -28,8 +28,6 @@
def get_variable_category(self, var_name: str) -> Optional[Hashable]:
pass
````
- Features are now represented as a list of floating point numbers, as indicated in the snippet above. This change was required for performance reasons. Returning numpy arrays is no longer supported, and raises an error.
- Internal solvers must now be specified as objects, instead of strings. For example,
```python
solver = LearningSolver(

@ -13,6 +13,13 @@ from .components.dynamic_user_cuts import UserCutsComponent
from .components.objective import ObjectiveValueComponent
from .components.primal import PrimalSolutionComponent
from .components.static_lazy import StaticLazyConstraintsComponent
from .features import (
Features,
TrainingSample,
ConstraintFeatures,
VariableFeatures,
InstanceFeatures,
)
from .instance.base import Instance
from .instance.picklegz import (
PickleGzInstance,
@ -27,6 +34,3 @@ from .solvers.learning import LearningSolver
from .solvers.pyomo.base import BasePyomoSolver
from .solvers.pyomo.cplex import CplexPyomoSolver
from .solvers.pyomo.gurobi import GurobiPyomoSolver
# noinspection PyUnresolvedReferences
from overrides import overrides

@ -16,7 +16,7 @@ if TYPE_CHECKING:
# noinspection PyMethodMayBeStatic
class Component(EnforceOverrides):
class Component:
"""
A Component is an object which adds functionality to a LearningSolver.

@ -8,6 +8,7 @@ from dataclasses import dataclass
from typing import TYPE_CHECKING, Dict, Optional, Set, List, Hashable
from miplearn.types import Solution, VariableName, Category
import numpy as np
if TYPE_CHECKING:
from miplearn.solvers.internal import InternalSolver
@ -83,6 +84,8 @@ class FeaturesExtractor:
f"Found {type(category).__name__} instead for var={var_name}."
)
user_features = instance.get_variable_features(var_name)
if isinstance(user_features, np.ndarray):
user_features = user_features.tolist()
assert isinstance(user_features, list), (
f"Variable features must be a list. "
f"Found {type(user_features).__name__} instead for "
@ -115,6 +118,8 @@ class FeaturesExtractor:
f"Found {type(category).__name__} instead for cid={cid}.",
)
user_features = instance.get_constraint_features(cid)
if isinstance(user_features, np.ndarray):
user_features = user_features.tolist()
assert isinstance(user_features, list), (
f"Constraint features must be a list. "
f"Found {type(user_features).__name__} instead for cid={cid}."
@ -141,6 +146,8 @@ class FeaturesExtractor:
) -> InstanceFeatures:
assert features.constraints is not None
user_features = instance.get_instance_features()
if isinstance(user_features, np.ndarray):
user_features = user_features.tolist()
assert isinstance(user_features, list), (
f"Instance features must be a list. "
f"Found {type(user_features).__name__} instead."

@ -15,7 +15,7 @@ logger = logging.getLogger(__name__)
# noinspection PyMethodMayBeStatic
class Instance(ABC, EnforceOverrides):
class Instance(ABC):
"""
Abstract class holding all the data necessary to generate a concrete model of the
proble.

@ -24,7 +24,7 @@ from miplearn.types import (
logger = logging.getLogger(__name__)
class InternalSolver(ABC, EnforceOverrides):
class InternalSolver(ABC):
"""
Abstract class representing the MIP solver used internally by LearningSolver.
"""

Loading…
Cancel
Save