Source code for abcEconomics.expiringgood

from collections import deque
from abcEconomics.notenoughgoods import NotEnoughGoods
from abcEconomics.agents.trader import get_epsilon
epsilon = get_epsilon()


[docs]class ExpiringGood(object): """ A good that expires after X rounds """ def __init__(self, duration): self.duration = duration self.time_structure = deque([0 for _ in range(duration)]) # old to new def _advance_round(self): del self.time_structure[0] self.time_structure.append(0) def __add__(self, other): if isinstance(other, ExpiringGood): self.time_structure = [ s + o for s, o in zip(self.time_structure, other.time_structure)] else: self.time_structure[-1] += other return self def __radd__(self, other): return other + sum(self.time_structure) def __sub__(self, other): if isinstance(other, ExpiringGood): other = float(other) sum_time_structure = sum(self.time_structure) if sum_time_structure < - epsilon: raise NotEnoughGoods("AnAgent", "ExpiringGood", -sum_time_structure) for i in range(len(self.time_structure)): if other >= self.time_structure[i]: other -= self.time_structure[i] self.time_structure[i] = 0 else: self.time_structure[i] -= other break return self def __rsub__(self, other): return other - sum(self.time_structure) def __mul__(self, other): return sum(self.time_structure) * other def __floordiv__(self, other): return sum(self.time_structure) // other def __div__(self, other): return sum(self.time_structure) / other def __mod__(self, other): return sum(self.time_structure) % other def __pow__(self, other): return sum(self.time_structure) ** other def __cmp__(self, other): a = sum(self.time_structure) return (a > other) - (a < other) def __int__(self): return int(sum(self.time_structure)) def __long__(self): return int(sum(self.time_structure)) def __float__(self): return float(sum(self.time_structure)) def __repr__(self): return str(sum(self.time_structure)) def __get__(self, instance, owner=None): return sum(self.time_structure) def __abs__(self): return abs(self.__float__())