87 for (std::size_t c = 0; c < K; ++c) {
88 if (!std::isfinite(d.
Nchain[c]))
90 "solver_mvac_analyzer: MVAC supports closed models only; use method 'exact' for "
91 "open or mixed networks");
94 "solver_mvac_analyzer: the MVAC recursion removes customers one at a time and has "
95 "no fractional-population form");
98 std::vector<std::size_t> infSET, qSET;
99 for (std::size_t i = 0; i < M; ++i) {
101 case SchedStrategy::EXT:
break;
102 case SchedStrategy::INF: infSET.push_back(i);
break;
103 case SchedStrategy::PS:
104 case SchedStrategy::LCFSPR:
105 case SchedStrategy::FCFS:
106 case SchedStrategy::SIRO: qSET.push_back(i);
break;
108 throw UnsupportedError(std::string(
"solver_mvac_analyzer: MVAC does not support ") +
116 std::vector<std::size_t> rset;
117 for (std::size_t c = 0; c < K; ++c)
118 if (d.
Nchain[c] != 0.0) rset.push_back(c);
120 std::vector<T> Xchain(K, zero);
121 Matrix<T> Qchain(M, K, zero), Tchain(M, K, zero), Wchain(M, K, zero), Rchain(M, K, zero);
122 std::vector<T> Ccycle(K, zero);
125 const std::size_t Mq = qSET.size(), Rr = rset.size();
126 Matrix<T> Lq(Mq, Rr, zero), Zq(1, Rr, zero);
127 std::vector<int> N(Rr, 0);
128 for (std::size_t j = 0; j < Rr; ++j) {
129 const std::size_t c = rset[j];
130 N[j] =
static_cast<int>(std::llround(d.
Nchain[c]));
131 for (std::size_t a = 0; a < Mq; ++a)
134 for (std::size_t i : infSET) Zq(0, j) += T(d.
STchain(i, c) * d.
Vchain(i, c));
138 for (std::size_t j = 0; j < Rr; ++j) {
139 Xchain[rset[j]] = mr.
X[j];
140 for (std::size_t a = 0; a < Mq; ++a) Qchain(qSET[a], rset[j]) = mr.
Q(a, j);
142 for (std::size_t i : infSET)
143 for (std::size_t c = 0; c < K; ++c)
144 Qchain(i, c) = T(Xchain[c] * d.
STchain(i, c) * d.
Vchain(i, c));
146 for (std::size_t c : rset) {
147 for (std::size_t i : infSET) Wchain(i, c) = d.
STchain(i, c);
151 for (std::size_t i : qSET) {
152 if (d.
Vchain(i, c) == zero || Xchain[c] == zero)
continue;
153 Wchain(i, c) = T(Qchain(i, c) / (Xchain[c] * d.
Vchain(i, c)));
160 for (std::size_t c : rset) {
162 for (std::size_t i = 0; i < M; ++i) wsum += Wchain(i, c);
166 for (std::size_t i = 0; i < M; ++i)
167 Ccycle[c] += T(d.
Vchain(i, c) * Wchain(i, c));
170 for (std::size_t i = 0; i < M; ++i) {
171 Qchain(i, c) = T(Xchain[c] * d.
Vchain(i, c) * Wchain(i, c));
172 Tchain(i, c) = T(Xchain[c] * d.
Vchain(i, c));
177 for (std::size_t i = 0; i < M; ++i)
178 for (std::size_t c = 0; c < K; ++c)
179 if (Tchain(i, c) > zero) Rchain(i, c) = T(Qchain(i, c) / Tchain(i, c));
192 out.
lG = std::numeric_limits<double>::quiet_NaN();
ClassResults< T > sn_deaggregate_chain_results(const qn::NetworkStruct< T > &L, const ChainDemands< T > &d, const Matrix< T > &Qchain, const Matrix< T > &Uchain, const Matrix< T > &Rchain, const Matrix< T > &Tchain, const std::vector< T > &Xchain)
Port of sn_deaggregate_chain_results.
MvacResult< T > pfqn_mvac(const Matrix< T > &L, const std::vector< int > &N, const Matrix< T > &Z)
MVAC: exact mean value analysis BY CHAIN of a closed multichain product-form network (Conway,...