Source code for leaspy.models.utils.attributes
from .abstract_attributes import AbstractAttributes
from .linear_attributes import LinearAttributes
from .logistic_attributes import LogisticAttributes
from .logistic_parallel_attributes import LogisticParallelAttributes
__all__ = [
"AttributesFactory",
"LinearAttributes",
"LogisticAttributes",
"LogisticParallelAttributes",
]
[docs]
class AttributesFactory:
"""
Return an `Attributes` class object based on the given parameters.
"""
_attributes = {
"logistic": LogisticAttributes,
"univariate_logistic": LogisticAttributes,
"logistic_parallel": LogisticParallelAttributes,
"linear": LinearAttributes,
"univariate_linear": LinearAttributes,
#'mixed_linear-logistic': ... # TODO
}
[docs]
@classmethod
def attributes(
cls, name: str, dimension: int, source_dimension: int = None
) -> AbstractAttributes:
"""
Class method to build correct model attributes depending on model `name`.
Parameters
----------
name : str
dimension : int
source_dimension : int, optional (default None)
Returns
-------
:class:`.AbstractAttributes`
Raises
------
:exc:`.LeaspyModelInputError`
if any inconsistent parameter.
"""
from leaspy.exceptions import LeaspyModelInputError
if isinstance(name, str):
name = name.lower()
else:
raise LeaspyModelInputError("The `name` argument must be a string!")
if name not in cls._attributes:
raise LeaspyModelInputError(
f"The name '{name}' you provided for the attributes is not supported."
f"Valid choices are: {list(cls._attributes.keys())}"
)
if not (("univariate" in name) ^ (dimension != 1)):
raise LeaspyModelInputError(
f"Name `{name}` should contain 'univariate', if and only if `dimension` equals 1."
)
return cls._attributes[name](name, dimension, source_dimension)