92 std::size_t maxiter = 10000) {
94 "pfqn_qdamva requires transcendental arithmetic");
95 const std::size_t M =
static_cast<std::size_t
>(L.
rows());
96 const std::size_t K =
static_cast<std::size_t
>(L.
cols());
98 throw InputError(
"pfqn_qdamva: the population vector must have one entry per class");
99 if (!Z.empty() && Z.size() != K)
100 throw InputError(
"pfqn_qdamva: the think-time vector must have one entry per class");
112 for (std::size_t r = 0; r < K; ++r) Ntot += N[r];
117 if (Q0.
rows() ==
static_cast<int>(M) && Q0.
cols() ==
static_cast<int>(K)) {
124 for (std::size_t r = 0; r < K; ++r) {
126 for (std::size_t k = 0; k < M; ++k) tot += L(k, r);
128 for (std::size_t k = 0; k < M; ++k) out.
Q(k, r) = T(L(k, r) / tot * N[r]);
132 const T delta = T((Ntot - one) / Ntot);
136 for (std::size_t k = 0; k < M; ++k)
137 for (std::size_t r = 0; r < K; ++r)
140 std::vector<T> Ak(M, zero);
141 while (out.
iter < maxiter) {
143 for (std::size_t k = 0; k < M; ++k)
144 for (std::size_t r = 0; r < K; ++r)
147 if (out.
iter > 0 && gap <= tol)
break;
152 for (std::size_t k = 0; k < M; ++k) {
154 for (std::size_t r = 0; r < K; ++r) rowsum += out.
Q(k, r);
155 Ak[k] = T(one + delta * rowsum);
157 const std::vector<T> g =
pfqn_lldfun(Ak, mu, std::vector<double>());
159 for (std::size_t r = 0; r < K; ++r) {
160 for (std::size_t k = 0; k < M; ++k) {
162 for (std::size_t s = 0; s < K; ++s) rowsum += out.
Q(k, s);
163 out.
R(k, r) = T(L(k, r) * g[k] * (one + delta * rowsum));
165 T denom = Z.empty() ? zero : Z[r];
166 for (std::size_t k = 0; k < M; ++k) denom += out.
R(k, r);
168 for (std::size_t k = 0; k < M; ++k) {
169 out.
Q(k, r) = T(out.
X(0, r) * out.
R(k, r));
170 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.