54 const std::vector<T>& cs,
const std::vector<T>& ES3 = std::vector<T>()) {
55 const std::size_t R = lambda.size();
56 if (mu.size() != R || cs.size() != R)
57 throw InputError(
ErrorKind(
"Argument"),
"qsys_mg1_prio_pr: lambda, mu and cs must have the same length");
60 for (std::size_t i = 0; i < R; ++i)
61 if (lambda[i] <= zero || mu[i] <= zero || cs[i] < zero)
63 "qsys_mg1_prio_pr: lambda and mu must be positive and cs non-negative");
64 std::vector<T> ES(R), ES2(R), rho_i(R);
66 for (std::size_t i = 0; i < R; ++i) {
67 ES[i] = T(one / mu[i]);
68 ES2[i] = T((one + cs[i] * cs[i]) / (mu[i] * mu[i]));
69 rho_i[i] = T(lambda[i] * ES[i]);
73 std::vector<T> sig(R + 1, zero), M2(R + 1, zero);
74 for (std::size_t i = 0; i < R; ++i) {
75 sig[i + 1] = T(sig[i] + rho_i[i]);
76 M2[i + 1] = T(M2[i] + lambda[i] * ES2[i]);
81 for (std::size_t i = 0; i < R; ++i) {
82 r.
W[i] = T(ES[i] / (one - sig[i]) + M2[i + 1] / (two * (one - sig[i]) * (one - sig[i + 1])));
83 Q += T(lambda[i] * r.
W[i]);
85 r.
rho = T(Q / (one + Q));
86 std::vector<T> Wq(R), Qi(R);
87 for (std::size_t i = 0; i < R; ++i) {
88 Wq[i] = T(r.
W[i] - ES[i]);
89 Qi[i] = T(lambda[i] * r.
W[i]);
91 r.
res.
set(
"meanSojournTime", r.
W);
92 r.
res.
set(
"meanWaitingTime", Wq);
93 r.
res.
set(
"meanQueueLength", Qi);
94 r.
res.
set(
"utilization", rhoSum);
97 throw InputError(
ErrorKind(
"Argument"),
"qsys_mg1_prio_pr: ES3 must have one entry per class");
98 std::vector<T> M3(R + 1, zero);
99 for (std::size_t i = 0; i < R; ++i) M3[i + 1] = T(M3[i] + lambda[i] * ES3[i]);
101 for (std::size_t i = 0; i < R; ++i) {
102 const T a = T(one - sig[i]), b = T(one - sig[i + 1]);
103 V[i] = T((ES2[i] - ES[i] * ES[i]) / (a * a) + ES[i] * M2[i] / (a * a * a) +
104 M3[i + 1] / (three * a * a * b) + M2[i + 1] * M2[i + 1] / (four * a * a * b * b) +
105 M2[i + 1] * M2[i] / (two * a * a * a * b));
107 r.
res.
set(
"varSojournTime", V);
Mg1PrioPrResult< T > qsys_mg1_prio_pr(const std::vector< T > &lambda, const std::vector< T > &mu, const std::vector< T > &cs, const std::vector< T > &ES3=std::vector< T >())
M/G/1 with preemptive-resume priorities.