111 const std::vector<T>& Z,
WsScheme scheme,
double tol = 1e-6,
112 std::size_t max_iter = 1000) {
113 const std::size_t M = L.
rows(), R = L.
cols();
114 if (M == 0 || R == 0)
throw InputError(
"pfqn_wangsevcik: the demand matrix is empty");
115 if (N.size() != R)
throw InputError(
"pfqn_wangsevcik: N has the wrong length");
116 if (!Z.empty() && Z.size() != R)
throw InputError(
"pfqn_wangsevcik: Z has the wrong length");
123 out.
X.assign(R, zero);
124 out.
C.assign(R, zero);
127 for (std::size_t r = 0; r < R; ++r) Ntot += N[r];
130 out.
Q = wsdetail::proportional_start(L, N);
132 for (std::size_t k = 0; k < M; ++k)
133 for (std::size_t r = 0; r < R; ++r)
138 for (std::size_t k = 0; k < M; ++k)
139 for (std::size_t r = 0; r < R; ++r)
141 if (gap <= tol)
break;
148 std::vector<T> Qtot(M, zero);
149 for (std::size_t k = 0; k < M; ++k)
150 for (std::size_t s = 0; s < R; ++s) Qtot[k] += Qprev(k, s);
152 for (std::size_t r = 0; r < R; ++r) {
157 for (std::size_t m = 0; m < M; ++m)
159 qliden += L(m, r) * (one + Qtot[m] - Qprev(m, r));
161 for (std::size_t k = 0; k < M; ++k) {
164 const T qlinum = L(k, r) * (one + Qtot[k] - Qprev(k, r));
172 qseen = T(Qtot[k] - Qprev(k, r));
174 qseen = T(Qtot[k] - (one / (N[r] - one)) * (Qprev(k, r) - qlinum / qliden));
184 out.
R(k, r) = L(k, r) * (one + qseen);
188 for (std::size_t k = 0; k < M; ++k) Rtot += out.
R(k, r);
189 const T zr = Z.empty() ? zero : Z[r];
191 for (std::size_t k = 0; k < M; ++k) {
192 out.
Q(k, r) = out.
X[r] * out.
R(k, r);
193 out.
U(k, r) = out.
X[r] * L(k, r);
WsResult< T > pfqn_wangsevcik(const Matrix< T > &L, const std::vector< T > &N, const std::vector< T > &Z, WsScheme scheme, double tol=1e-6, std::size_t max_iter=1000)
One approximate MVA sweep, by the chosen arrival-queue correction.
WsResult< T > pfqn_fli(const Matrix< T > &L, const std::vector< T > &N, const std::vector< T > &Z, double tol=1e-6, std::size_t max_iter=1000)
Wang-Sevcik Fraction-Line.
WsResult< T > pfqn_qli(const Matrix< T > &L, const std::vector< T > &N, const std::vector< T > &Z, double tol=1e-6, std::size_t max_iter=1000)
Wang-Sevcik Queue-Line.