81 const std::vector<long>& c,
const std::vector<long>& refstat,
84 detail::check_dims(M, R, mu, Cs, P, c, insens,
"me_mqn");
85 if (open_classes.size() != R)
throw InputError(
"me_mqn: one open flag per class");
86 if (N.size() != R)
throw InputError(
"me_mqn: one population per class");
87 if (refstat.size() != R)
throw InputError(
"me_mqn: one reference station per class");
90 std::vector<std::size_t> oc, cc;
91 for (std::size_t r = 0; r < R; ++r) (open_classes[r] ? oc : cc).push_back(r);
100 out.
X.assign(R, zero);
104 std::vector<T> rho_o(M, zero);
106 std::vector<Matrix<T>> Po;
107 for (std::size_t k = 0; k < oc.size(); ++k) Po.push_back(P[oc[k]]);
109 me_oqn(M, oc.size(), detail::select_cols(lambda0, oc), detail::select_cols(Ca0, oc),
110 detail::select_cols(mu, oc), detail::select_cols(Cs, oc), Po, c, insens,
opt);
113 for (std::size_t i = 0; i < M; ++i)
114 for (std::size_t k = 0; k < oc.size(); ++k) {
115 out.
L(i, oc[k]) = ro.
L(i, k);
116 out.
Ca(i, oc[k]) = ro.
Ca(i, k);
117 out.
Cd(i, oc[k]) = ro.
Cd(i, k);
119 out.
rho(i, oc[k]) = ro.
rho(i, k);
121 for (std::size_t i = 0; i < M; ++i) {
122 if (detail::is_is(c, i))
continue;
123 for (std::size_t k = 0; k < oc.size(); ++k) rho_o[i] += ro.
rho(i, k);
125 for (std::size_t k = 0; k < oc.size(); ++k) out.
X[oc[k]] = ro.
X[k];
130 Matrix<T> mu_c = detail::select_cols(mu, cc);
131 for (std::size_t i = 0; i < M; ++i) {
132 if (detail::is_is(c, i))
continue;
133 T fac = one - rho_o[i];
134 if (fac < zero) fac = zero;
135 for (std::size_t k = 0; k < cc.size(); ++k) mu_c(i, k) *= fac;
137 std::vector<Matrix<T>> Pc;
138 std::vector<long> Nc, refc;
139 for (std::size_t k = 0; k < cc.size(); ++k) {
140 Pc.push_back(P[cc[k]]);
141 Nc.push_back(N[cc[k]]);
142 refc.push_back(refstat[cc[k]]);
144 const MeResult<T> rc =
me_cqn(M, cc.size(), Nc, mu_c, detail::select_cols(Cs, cc), Pc, c,
148 for (std::size_t i = 0; i < M; ++i)
149 for (std::size_t k = 0; k < cc.size(); ++k) {
150 out.
L(i, cc[k]) = rc.
L(i, k);
151 out.
W(i, cc[k]) = rc.
W(i, k);
152 out.
Ca(i, cc[k]) = rc.
Ca(i, k);
153 out.
Cd(i, cc[k]) = rc.
Cd(i, k);
155 if (detail::is_is(c, i)) {
156 out.
rho(i, cc[k]) = rc.
rho(i, k);
158 T fac = one - rho_o[i];
159 if (fac < zero) fac = zero;
160 out.
rho(i, cc[k]) = rc.
rho(i, k) * fac;
163 for (std::size_t k = 0; k < cc.size(); ++k) out.
X[cc[k]] = rc.
X[k];
167 if (!oc.empty() && !cc.empty()) {
168 for (std::size_t i = 0; i < M; ++i) {
169 if (detail::is_is(c, i))
continue;
171 for (std::size_t k = 0; k < cc.size(); ++k) Lc_i += out.
L(i, cc[k]);
172 for (std::size_t k = 0; k < oc.size(); ++k) out.
L(i, oc[k]) *= (one + Lc_i);
175 for (std::size_t i = 0; i < M; ++i)
176 for (std::size_t k = 0; k < oc.size(); ++k)
177 if (out.
lambda(i, oc[k]) > zero)
178 out.
W(i, oc[k]) = out.
L(i, oc[k]) / out.
lambda(i, oc[k]);
MeResult< T > me_mqn(std::size_t M, std::size_t R, const std::vector< char > &open_classes, const Matrix< T > &lambda0, const Matrix< T > &Ca0, const std::vector< long > &N, const Matrix< T > &mu, const Matrix< T > &Cs, const std::vector< Matrix< T > > &P, const std::vector< long > &c, const std::vector< long > &refstat, const std::vector< char > &insens, const MeOptions &opt=MeOptions())
Maximum-entropy algorithm for mixed open/closed multiclass networks.
MeResult< T > me_cqn(std::size_t M, std::size_t R, const std::vector< long > &N, const Matrix< T > &mu, const Matrix< T > &Cs, const std::vector< Matrix< T > > &P, const std::vector< long > &c, const std::vector< long > &refstat_in, const std::vector< char > &insens, const MeOptions &opt=MeOptions())
Maximum-entropy algorithm for closed multiclass queueing networks.
MeResult< T > me_oqn(std::size_t M, std::size_t R, const Matrix< T > &lambda0, const Matrix< T > &Ca0, const Matrix< T > &mu, const Matrix< T > &Cs, const std::vector< Matrix< T > > &P, const std::vector< long > &c, const std::vector< char > &insens, const MeOptions &opt=MeOptions())
Maximum-entropy algorithm for open multiclass queueing networks.