90 std::size_t maxiter = 10000) {
92 "pfqn_qdamva requires transcendental arithmetic");
93 const std::size_t M =
static_cast<std::size_t
>(L.
rows());
94 const std::size_t K =
static_cast<std::size_t
>(L.
cols());
96 throw InputError(
"pfqn_qdamva: the population vector must have one entry per class");
97 if (!Z.empty() && Z.size() != K)
98 throw InputError(
"pfqn_qdamva: the think-time vector must have one entry per class");
110 for (std::size_t r = 0; r < K; ++r) Ntot += N[r];
115 if (Q0.
rows() ==
static_cast<int>(M) && Q0.
cols() ==
static_cast<int>(K)) {
122 for (std::size_t r = 0; r < K; ++r) {
124 for (std::size_t k = 0; k < M; ++k) tot += L(k, r);
126 for (std::size_t k = 0; k < M; ++k) out.
Q(k, r) = T(L(k, r) / tot * N[r]);
130 const T delta = T((Ntot - one) / Ntot);
134 for (std::size_t k = 0; k < M; ++k)
135 for (std::size_t r = 0; r < K; ++r)
138 std::vector<T> Ak(M, zero);
139 while (out.
iter < maxiter) {
141 for (std::size_t k = 0; k < M; ++k)
142 for (std::size_t r = 0; r < K; ++r)
145 if (out.
iter > 0 && gap <= tol)
break;
150 for (std::size_t k = 0; k < M; ++k) {
152 for (std::size_t r = 0; r < K; ++r) rowsum += out.
Q(k, r);
153 Ak[k] = T(one + delta * rowsum);
155 const std::vector<T> g =
pfqn_lldfun(Ak, mu, std::vector<double>());
157 for (std::size_t r = 0; r < K; ++r) {
158 for (std::size_t k = 0; k < M; ++k) {
160 for (std::size_t s = 0; s < K; ++s) rowsum += out.
Q(k, s);
161 out.
R(k, r) = T(L(k, r) * g[k] * (one + delta * rowsum));
163 T denom = Z.empty() ? zero : Z[r];
164 for (std::size_t k = 0; k < M; ++k) denom += out.
R(k, r);
166 for (std::size_t k = 0; k < M; ++k) {
167 out.
Q(k, r) = T(out.
X(0, r) * out.
R(k, r));
168 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.