ultraopt.hdl.hp_def 源代码

import math
from typing import Any, List

from ConfigSpace import CategoricalHyperparameter, \
    UniformFloatHyperparameter, UniformIntegerHyperparameter, Constant, \
    OrdinalHyperparameter

from ultraopt.utils.math_ import float_gcd


def _encode(value: Any) -> str:
    if isinstance(value, str):
        return value
    return f'{value}:{(value).__class__.__name__}'


def _decode(str_value: str) -> Any:
    if str_value == "None":
        return None
    ix = str_value.rfind(":")
    if ix < 0:
        return str_value
    else:
        value_ = str_value[:ix]
        type_ = str_value[ix + 1:]
        try:
            return eval(value_)
        except Exception:
            return str_value


[文档]def choice(label: str, options: List, default=None): if len(options) == 1: return Constant(label, _encode(options[0])) choices = [] for option in options: choices.append(_encode(option)) kwargs = {} if default: kwargs.update({'default_value': _encode(default)}) hp = CategoricalHyperparameter(label, choices, **kwargs) return hp
[文档]def ordinal(label: str, sequence: List, default=None): if len(sequence) == 1: return Constant(label, _encode(sequence[0])) choices = [] for option in sequence: choices.append(_encode(option)) kwargs = {} if default: kwargs.update({'default_value': _encode(default)}) hp = OrdinalHyperparameter(label, choices, **kwargs) return hp
[文档]def int_quniform(label: str, low: int, high: int, q: int = None, default=None): if not q: q = math.gcd(low, high) kwargs = {} if default: kwargs.update({'default_value': default}) return UniformIntegerHyperparameter(label, low, high, q=q, **kwargs)
[文档]def int_uniform(label: str, low: int, high: int, default=None): kwargs = {} if default: kwargs.update({'default_value': default}) return UniformIntegerHyperparameter(label, low, high, **kwargs)
[文档]def quniform(label: str, low: float, high: float, q: float = None, default=None): if not q: q = float_gcd(low, high) kwargs = {} if default: kwargs.update({'default_value': default}) return UniformFloatHyperparameter(label, low, high, q=q, **kwargs)
[文档]def uniform(label: str, low: float, high: float, default=None): kwargs = {} if default: kwargs.update({'default_value': default}) return UniformFloatHyperparameter(label, low, high, **kwargs)
# fixme: have some bug in practice
[文档]def qloguniform(label: str, low: float, high: float, q: float = None, default=None): if not q: q = float_gcd(low, high) kwargs = {'log': True} if default: kwargs.update({'default_value': default}) return UniformFloatHyperparameter(label, low, high, q=q, **kwargs)
[文档]def loguniform(label: str, low: float, high: float, default=None): kwargs = {'log': True} if default: kwargs.update({'default_value': default}) return UniformFloatHyperparameter(label, low, high, **kwargs)
[文档]def int_qloguniform(label: str, low: int, high: int, q: int = None, default=None): if not q: q = min(low, 1) kwargs = {'log': True} if default: kwargs.update({'default_value': default}) return UniformIntegerHyperparameter(label, low, high, q=q, **kwargs)
[文档]def int_loguniform(label: str, low: int, high: int, default=None): kwargs = {'log': True} if default: kwargs.update({'default_value': default}) return UniformIntegerHyperparameter(label, low, high, **kwargs)