91 std::size_t maxiter = 10000) {
93 "pfqn_qdamva requires transcendental arithmetic");
94 const std::size_t M =
static_cast<std::size_t
>(L.
rows());
95 const std::size_t K =
static_cast<std::size_t
>(L.
cols());
97 throw InputError(
"pfqn_qdamva: the population vector must have one entry per class");
98 if (!Z.empty() && Z.size() != K)
99 throw InputError(
"pfqn_qdamva: the think-time vector must have one entry per class");
111 for (std::size_t r = 0; r < K; ++r) Ntot += N[r];
116 if (Q0.
rows() ==
static_cast<int>(M) && Q0.
cols() ==
static_cast<int>(K)) {
123 for (std::size_t r = 0; r < K; ++r) {
125 for (std::size_t k = 0; k < M; ++k) tot += L(k, r);
127 for (std::size_t k = 0; k < M; ++k) out.
Q(k, r) = T(L(k, r) / tot * N[r]);
131 const T delta = T((Ntot - one) / Ntot);
135 for (std::size_t k = 0; k < M; ++k)
136 for (std::size_t r = 0; r < K; ++r)
139 std::vector<T> Ak(M, zero);
140 while (out.
iter < maxiter) {
142 for (std::size_t k = 0; k < M; ++k)
143 for (std::size_t r = 0; r < K; ++r)
146 if (out.
iter > 0 && gap <= tol)
break;
151 for (std::size_t k = 0; k < M; ++k) {
153 for (std::size_t r = 0; r < K; ++r) rowsum += out.
Q(k, r);
154 Ak[k] = T(one + delta * rowsum);
156 const std::vector<T> g =
pfqn_lldfun(Ak, mu, std::vector<double>());
158 for (std::size_t r = 0; r < K; ++r) {
159 for (std::size_t k = 0; k < M; ++k) {
161 for (std::size_t s = 0; s < K; ++s) rowsum += out.
Q(k, s);
162 out.
R(k, r) = T(L(k, r) * g[k] * (one + delta * rowsum));
164 T denom = Z.empty() ? zero : Z[r];
165 for (std::size_t k = 0; k < M; ++k) denom += out.
R(k, r);
167 for (std::size_t k = 0; k < M; ++k) {
168 out.
Q(k, r) = T(out.
X(0, r) * out.
R(k, r));
169 out.
U(k, r) = T(L(k, r) * g[k] * out.
X(0, r));
QdAmvaResult< T > pfqn_qdamva(const Matrix< T > &L, const std::vector< T > &N, const std::vector< T > &Z, const Matrix< T > &mu, const Matrix< T > &Q0, double tol=1e-6, std::size_t maxiter=10000)
QD-AMVA: queue-dependent approximate mean value analysis.
std::vector< T > pfqn_lldfun(const std::vector< T > &n, const Matrix< T > &lldscaling, const std::vector< double > &nservers)
AMVA-QD limited-load-dependence function.