def spawn_poisson_demand(timestep: int, demand_lambda: float, UserClass, rng: np.random.Generator = rng) -> Sequence[User]: """ One-step demand from homogeneous users, with demand size drawn from a Poisson distribution. Args: timestep (int): Current round demand_lambda (float): Rate of arrival, the :math:`lambda` parameter of a Poisson distribution UserClass (class): The user type Returns: Sequence[User]: An array of users """ demand_size = rng.poisson(demand_lambda) new_users = [UserClass(timestep, rng=rng) for i in range(demand_size)] return new_users
def spawn_poisson_heterogeneous_demand(timestep: int, demand_lambda: float, shares: Dict[type, float], rng: np.random.Generator = rng) -> Sequence[User]: """ One-step demand from heterogeneous users, with demand size drawn from a Poisson distribution. Args: timestep (int): Current round demand_lambda (float): Rate of arrival, the :math:`lambda` parameter of a Poisson distribution shares (Dict[type, float]): Keys are user classes (subclasses of :py:class:`abm1559.users.User`), values are the share of each user class to spawn this round. Shares are expected to sum to 1. Returns: Sequence[User]: An array of users """ new_users = [] demand_size = rng.poisson(demand_lambda) sizes = shares_to_sizes(shares, demand_size) for UserClass, size in sizes.items(): new_users += [UserClass(timestep, rng=rng) for i in range(size)] return new_users