from abc import ABC, abstractmethod
from typing import List, Optional, Union
import numpy as np
[docs]class DurationDistribution(ABC):
    """Base class for a duration distribution."""
[docs]    @abstractmethod
    def sample(self, size: int) -> np.ndarray:
        """Sample from the duration distribution.
        :param size: amount of samples to draw.
        :returns: samples from the distribution
        """
        raise NotImplementedError  
[docs]class EmpiricalBootstrap(DurationDistribution):
    """This distribution will bootstrap from an empirical
    distribution.
    :param replace: if sample w/ replacement or not
    """
    def __init__(self, samples: Union[List[int], np.ndarray],
                 replace: bool = True):
        self.samples = np.asarray(samples)
        self.replace = replace
[docs]    def sample(self, size: Optional[int] = None) -> np.ndarray:
        """Sample from the duration distribution.
        :param size: amount of samples to draw.
        :returns: samples from the distribution
        """
        size = size or len(self.samples)
        samples = np.random.choice(self.samples,
                                   size=size,
                                   replace=self.replace)
        return samples