Spaces:
Sleeping
Sleeping
from abc import ABC, abstractmethod | |
from typing import Dict | |
import numpy as np | |
from ibydmt.utils import _get_cls, _register_cls | |
class Wealth(ABC): | |
def __init__(self, config): | |
self.significance_level = config.significance_level | |
self.rejected = False | |
def update(self, payoff): | |
pass | |
_WEALTH: Dict[str, Wealth] = {} | |
def register_wealth(name): | |
return _register_cls(name, dict=_WEALTH) | |
def get_wealth(name): | |
return _get_cls(name, dict=_WEALTH) | |
class Mixture(Wealth): | |
def __init__(self, config): | |
super().__init__(config) | |
self.grid_size = grid_size = config.grid_size | |
self.wealth = np.ones((grid_size,)) | |
self.wealth_flag = np.ones(grid_size, dtype=bool) | |
self.v = np.linspace(0.05, 0.95, grid_size) | |
def update(self, payoff): | |
raise NotImplementedError | |
class ONS(Wealth): | |
def __init__(self, config): | |
super().__init__(config) | |
self._w = 1.0 | |
self._v = 0 | |
self._a = 1 | |
self._min_v, self._max_v = config.get("min_v", 0), config.get("max_v", 1 / 2) | |
self._wealth_flag = False | |
self._wealth = [self._w] | |
def _update_v(self, payoff): | |
z = payoff / (1 + self._v * payoff) | |
self._a += z**2 | |
self._v = max( | |
self._min_v, min(self._max_v, self._v + 2 / (2 - np.log(3)) * z / self._a) | |
) | |
def update(self, payoff): | |
w = self._w * (1 + self._v * payoff) | |
if w >= 0 and not self._wealth_flag: | |
self._w = w | |
self._wealth.append(self._w) | |
if self._w >= 1 / self.significance_level: | |
self.rejected = True | |
self._update_v(payoff) | |
else: | |
self._wealth_flag = True | |