List of Supported Distributions

Ciw allows a number continuous service and inter-arrival time distributions, as well as empirical, user defined, time dependent, and custom discrete distributions. Note that when choosing parameters for these distributions, ensure that no negative numbers may be sampled. The following are currently supported:

The Uniform Distribution

The uniform distribution samples a random number between two numbers a and b. Write a uniform distribution between 4 and 9 as follows:

ciw.dists.Uniform(lower=4.0, upper=9.0)

The Deterministic Distribution

The deterministic distribution is non-stochastic, and produces the same service time repeatedly. Write a deterministic distribution that repeatedly gives a value of 18.2 as follows:

ciw.dists.Deterministic(value=18.2)

The Triangular Distribution

The triangular distribution samples a continuous pdf that rises linearly from its minimum value low to its mode value mode, and then decreases linearly to its highest attainable value high. Write a triangular distribution between 2.1 and 7.6 with mode of 3.4 as follows:

ciw.dists.Triangular(lower=2.1, mode=3.4, upper=7.6)

The Exponential Distribution

The exponential distribution samples a random number from the negative exponential distribution with mean \(1 / \lambda\). Write an exponential distribution with mean 0.2 as follows:

ciw.dists.Exponential(rate=5)

The Gamma Distribution

The gamma distribution samples a random number from the gamma distribution with shape parameter \(\alpha\) and scale parameter \(\beta\). Write a gamma distribution with parameters \(\alpha = 0.6\) and \(\beta = 1.2\) as follows:

ciw.dists.Gamma(shape=0.6, scale=1.2)

The Truncated Normal Distribution

The truncated normal distribution samples a random number from the normal distribution with mean \(\mu\) and standard deviation \(\sigma\). The distribution is truncated at 0, thus if negative numbers are sampled then that observation is resampled until a positive value is sampled. Write a normal distribution with parameters \(\mu = 0.7\) and \(\sigma = 0.4\) as follows:

ciw.dists.Normal(mean=0.7, sd=0.4)

The Lognormal Distribution

The lognormal distribution samples a random number from the log of the normal distribution with mean \(\mu\) and standard deviation \(\sigma\). Write a lognomal distribution, that is a log of the normal distribution with \(\mu = 4.5\) and \(\sigma = 2.0\), as follows:

ciw.dists.Lognormal(mean=4.5, sd=2.0)

The Weibull Distribution

The Weibull distribution samples a random number from the Weibull distribution with scale parameter \(\alpha\) and shape parameter \(\beta\). Write a Weibull distribution with \(\alpha = 0.9\) and \(\beta = 0.8\) as follows:

ciw.dists.Weibull(scale=0.9, shape=0.8)

Empirical Distributions

The empirical distribution randomly selects values from a list. If values appear in the list more frequently, then they will be sampled more frequently. Input list of observations:

ciw.dists.Empirical(observations=[0.3, 0.3, 0.3, 0.4, 0.5, 0.6, 0.8, 0.9, 1.1, 1.1, 1.1, 1.1])

Sequential Distributions

The sequential distribution takes a list, and iteratively returns the next observation in that list over time. The distribution is cyclic, and so once all elements of the list have been sampled, the sequence of sampled values begins again from the beginning of the list:

ciw.dists.Sequential(sequence=[0.1, 0.1, 0.2, 0.1, 0.3, 0.2])

Probability Mass Functions

Ciw allows users to define their own custom PMFs to sample from. This distribution samples from a set of values given a probability for each value, that is sampling the value \(x\) with probability \(P(x)\). For example, if \(P(1.4) = 0.2\), \(P(1.7) = 0.5\), and \(P(1.9) = 0.3\), this is defined in the following way:

ciw.dists.Pmf(values=[1.4, 1.7, 1.9], probs=[0.2, 0.5, 0.3])

Phase-Type Distributions

Phase-Type distributions are defined by an initial state vector and transition matrix of its underlying Markov chain. More information is found on the Guide to Phase-Type distributions:

initial_state = [0.7, 0.2, 0.1, 0.0]
absorbing_matrix = [
    [-6, 2, 0, 4],
    [0, -3, 3, 0],
    [1, 0, -5, 4],
    [0, 0, 0, 0]
]
ciw.dists.PhaseType(initial_state, absorbing_matrix)

The Erlang Distribution

An Erlang distribution with parameters \(\lambda\) and \(n\) is the sum of \(n\) Exponential distributions with parameter \(\lambda\). Write an Erlang distribution with \(\lambda = 9\) and \(n = 4\) as follows:

ciw.dists.Erlang(rate=9, num_phases=4)

The HyperExponential Distribution

An HyperExponential distribution is defined by a probability vector \(\mathbf{p}\) and rate vector \(\mathbf{\lambda}\), and samples an Exponential distribution with parameter \(\lambda_i\) with probability \(p_i\). Write a HyperExponential distribution with \(\mathbf{\lambda} = \left(9, 5, 6, 1\right)\) and \(\mathbf{p} = \left(0.2, 0.1, 0.6, 0.1\right)\) as follows:

ciw.dists.HyperExponential(rates=[9, 5, 6, 1], probs=[0.2, 0.1, 0.6, 0.1])

The HyperErlang Distribution

A HyperErlang distribution is defined by parameters \(\mathbf{\lambda}\), \(\mathbf{p}\), and \(\mathbf{n}\), and samples an Erlang distribution of size \(n_i\) with parameter \(\lambda_i\) with probability \(p_i\). Write a HyperErlang distribution with \(\mathbf{\lambda} = \left(5, 2, 3\right)\), \(\mathbf{p} = \left(0.5, 0.25, 0.25\right)\), and \(n = \left(2, 1, 2\right)\) as follows:

ciw.dists.HyperErlang(rates=[5, 2, 3], probs=[0.5, 0.25, 0.25], phase_lengths=[2, 1, 2])

Coxian Distributions

A Coxian distribution is a specific type of Phase-Type distribution defined by parameters \(\mathbf{\lambda}\), the rates of each phase, and \(\mathbf{p}\), the probability of going to the absorbing state after each phase. Write a Coxian distribution with \(\mathbf{\lambda} = \left(5, 2, 3, 7\right)\) and \(\mathbf{p} = \left(0.5, 0.3, 0.65, 1\right)\) as follows:

ciw.dists.Coxian(rates=[5, 2, 3, 7], probs=[0.5, 0.3, 0.65, 1])

Poisson Intervals Distribution

The Poisson Intervals Distribution is a time-dependent distribution, where different time intervals sample arrivals from Poisson distributions, or inter-arrival times from Exponential distributions. It is used to overcome the problem of skipping arrivals accross interval thresholds.

For Exponential arrivals with rate 3 in the time interval (0, 4.8), rate 5.5 in the time interval (4.8, 9.3), and rate 0.1 in the time interval (9.3, 12), and repeating in the same manner thereafter until the time 100:

ciw.dists.PoissonIntervals(rates=[3, 5.5, 0.1], endpoints=[4.8, 9.3, 12], max_sample_date=100)

The Poisson Distribution

The Poisson distribution samples a random integer from the Poisson distribution with mean \(\lambda\). Write an Poisson distribution with mean 1.7 as follows:

ciw.dists.Poisson(rate=1.7)

The Geometric Distribution

The Geometric distribution samples a random integer from the Geometric distribution with parameter \(p\). That is, the number of Bernoulli trials until a success, when each independent Bernoulli trial has probability \(p\) of succes. Write an Geometric distribution with success probability of 0.3 as follows:

ciw.dists.Geometric(prob=0.3)

The Binomial Distribution

The Binomial distribution samples a random integer from the Binomial distribution with parameters \(n\) and \(p\). That is, the number of successful Bernoulli trials out of a total of \(n\) trials, when each independent Bernoulli trial has probability \(p\) of succes. Write an Geometric distribution with success probability of 0.3 and 20 trials as follows:

ciw.dists.Binomial(n=20, prob=0.3)

Mixture Distributions

A countable and finite mixture distriubtion, which probabilistically chooses to sample from one of a number of given distributions. Given a number of distributions each with PDF \(D_i(x)\), each with a probability \(p_i\), such that \(\sum_i p_i = 1\), then the Mixture distribution has PMF \(f(x) = \sum_i p_i D_i(x)\)

Write an Mixture distribution that samples from an Exponential distribution with probability 0.3 and Uniform distribution with probability 0.7:

U = ciw.dists.Exponential(rate=0.1)
T = ciw.dists.Uniform(lower=2, upper=6)
ciw.dists.MixtureDistribution(dists=[U, T], probs=[0.3, 0.7])