Spaces:
Sleeping
Sleeping
File size: 1,868 Bytes
eaf2e33 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
"""
General utility functions for machine learning.
"""
import abc
import math
import numpy as np
class ScalarSchedule(object, metaclass=abc.ABCMeta):
@abc.abstractmethod
def get_value(self, t):
pass
class ConstantSchedule(ScalarSchedule):
def __init__(self, value):
self._value = value
def get_value(self, t):
return self._value
class LinearSchedule(ScalarSchedule):
"""
Linearly interpolate and then stop at a final value.
"""
def __init__(
self,
init_value,
final_value,
ramp_duration,
):
self._init_value = init_value
self._final_value = final_value
self._ramp_duration = ramp_duration
def get_value(self, t):
return (
self._init_value
+ (self._final_value - self._init_value)
* min(1.0, t * 1.0 / self._ramp_duration)
)
class IntLinearSchedule(LinearSchedule):
"""
Same as RampUpSchedule but round output to an int
"""
def get_value(self, t):
return int(super().get_value(t))
class PiecewiseLinearSchedule(ScalarSchedule):
"""
Given a list of (x, t) value-time pairs, return value x at time t,
and linearly interpolate between the two
"""
def __init__(
self,
x_values,
y_values,
):
self._x_values = x_values
self._y_values = y_values
def get_value(self, t):
return np.interp(t, self._x_values, self._y_values)
class IntPiecewiseLinearSchedule(PiecewiseLinearSchedule):
def get_value(self, t):
return int(super().get_value(t))
def none_to_infty(bounds):
if bounds is None:
bounds = -math.inf, math.inf
lb, ub = bounds
if lb is None:
lb = -math.inf
if ub is None:
ub = math.inf
return lb, ub
|