78 "me_gegecn requires transcendental arithmetic: the state law is assembled in "
79 "logarithms so that a saturated queue with a large buffer does not overflow");
86 if (c < 1)
throw InputError(
"me_gegecn: requires a finite number of servers c >= 1.");
87 if (N <= K)
throw InputError(
"me_gegecn: requires N > K.");
91 "me_gegecn: requires Ca >= 1 and Cs >= 1: the GE distribution is not defined for "
93 if (!(mu > zero))
throw InputError(
"me_gegecn: requires a positive service rate.");
95 const T tau = T(two / (Ca + one));
96 const T sigma = T(two / (Cs + one));
98 const T rho = T(lambda / (cT * mu));
100 const long J = std::max(c, K + 1);
101 const T den1 = T(sigma * (one - tau) + tau);
102 const T den2 = T(tau * rho * (one - sigma) + sigma);
106 std::vector<T> g(
static_cast<std::size_t
>(J) + 1, one);
109 g[
static_cast<std::size_t
>(K + 1)] = T(tau * cT * rho / (Kp1 * den1));
110 }
else if (K == c - 1) {
111 g[
static_cast<std::size_t
>(K + 1)] = T(tau * sigma * rho / den2);
113 g[
static_cast<std::size_t
>(K + 1)] = T((den1 / den2) * tau * rho);
115 for (
long l = K + 2; l <= J; ++l) {
119 g[
static_cast<std::size_t
>(l)] =
120 T((tau * cT * rho + lm1 * sigma * (one - tau)) / (lT * den1));
124 g[
static_cast<std::size_t
>(l)] =
125 T(sigma * (tau * cT * rho + Jm1 * sigma * (one - tau)) / (JT * den2));
129 const T x = T((tau * rho + sigma * (one - tau)) / den2);
130 const T y = T(one / (one - (one - sigma) * x));
133 const std::size_t ng =
static_cast<std::size_t
>(J - K);
134 std::vector<T> cumlogg(ng, zero);
137 for (std::size_t i = 0; i < ng; ++i) {
138 acc += T(log(g[
static_cast<std::size_t
>(K + 1) + i]));
143 const std::size_t nn =
static_cast<std::size_t
>(N - K + 1);
144 const T logx = T(log(x));
145 const T logy = T(log(y));
146 std::vector<T> logp(nn, zero);
147 for (std::size_t idx = 0; idx < nn; ++idx) {
148 const long n = K +
static_cast<long>(idx);
150 const long m = std::max(K + 1, std::min(c, n));
151 logp[idx] = cumlogg[
static_cast<std::size_t
>(m - K) - 1];
153 const long h = std::max<long>(0, n - J);
154 const long f = std::max<long>(0, n - N + 1);
160 for (
const T& v : logp)
163 res.
p.assign(nn, zero);
165 for (std::size_t idx = 0; idx < nn; ++idx) {
166 res.
p[idx] = T(exp(T(logp[idx] - mx)));
169 for (T& v : res.
p) v = T(v / tot);
171 T L = zero, Ebusy = zero;
172 for (std::size_t idx = 0; idx < nn; ++idx) {
173 const long n = K +
static_cast<long>(idx);
178 res.
U = T(Ebusy / cT);
179 res.
Lq = T(L - Ebusy);
GegecnResult< T > me_gegecn(const T &lambda, const T &Ca, const T &mu, const T &Cs, long c, long K, long N)
Port of me_gegecn.