57 const std::size_t R = N.size();
63 if (v < 0)
throw InputError(
"pfqn_comomrm_ld: negative population");
68 if (M > 0 && L.
cols() != R)
69 throw InputError(
"pfqn_comomrm_ld: L and N disagree on the class count");
72 std::vector<T> Zsum(R, zero);
75 if (Z.
cols() != R)
throw InputError(
"pfqn_comomrm_ld: Z and N disagree on the class count");
76 for (std::size_t k = 0; k < Z.
rows(); ++k)
77 for (std::size_t r = 0; r < R; ++r) Zsum[r] += Z(k, r);
79 for (std::size_t r = 0; r < R; ++r) Ztot += Zsum[r];
83 if (Ztot == zero && M > 0) {
85 throw InputError(
"pfqn_comomrm_ld: mu and L disagree on the station count");
87 std::vector<std::size_t> queues, delays;
88 for (std::size_t i = 0; i < M; ++i) {
89 bool isDelay = Nt > 0;
90 for (
int k = 1; k <= Nt; ++k)
95 (isDelay ? delays : queues).push_back(i);
97 if (!delays.empty()) {
98 for (std::size_t d = 0; d < delays.size(); ++d)
99 for (std::size_t r = 0; r < R; ++r) Zsum[r] += L(delays[d], r);
102 for (std::size_t q = 0; q < queues.size(); ++q) {
103 for (std::size_t r = 0; r < R; ++r) Lq(q, r) = L(queues[q], r);
104 for (std::size_t k = 0; k < mu.
cols(); ++k) muq(q, k) = mu(queues[q], k);
111 for (std::size_t r = 0; r < R; ++r) Zmat(0, r) = Zsum[r];
114 for (std::size_t i = 0; i < M; ++i)
115 for (std::size_t r = 0; r < R; ++r) Lsum += Lq(i, r);
116 if (M == 0 || Lsum == zero) {
122 res.
prob.assign(
static_cast<std::size_t
>(Nt) + 1, zero);
123 res.
prob.back() = one;
128 if (san.
L.rows() > 1)
129 throw InputError(
"pfqn_comomrm_ld: the solver accepts at most a single queueing station");
132 for (
int v : san.
N) Ntk += v;
133 if (Ntk == 0 || san.
L.empty()) {
137 res.
prob.assign(
static_cast<std::size_t
>(Nt) + 1, zero);
142 const std::size_t Rk = san.
N.size();
143 std::vector<T> Lv(Rk, zero), Zv(Rk, zero);
144 for (std::size_t r = 0; r < Rk; ++r) {
146 for (std::size_t k = 0; k < san.
Z.rows(); ++k) Zv[r] += san.
Z(k, r);
148 std::vector<T> muv(
static_cast<std::size_t
>(Ntk), one);
149 for (
int k = 0; k < Ntk; ++k) muv[static_cast<std::size_t>(k)] = muq(0,
static_cast<std::size_t
>(k));
151 return detail::comomrm_finish(detail::comomrm_bidiag(Lv, san.
N, Zv, muv), san.
Gremaind);
NcSanitizeResult< T > pfqn_nc_sanitize(const std::vector< T > &lambda, const Matrix< T > &L, const std::vector< int > &N, const Matrix< T > &Z, const T &atol)
Preprocessing shared by the normalizing-constant solvers: drop the classes that cannot contribute,...
NcResult< T > pfqn_ca(const Matrix< T > &L, const std::vector< int > &N, const Matrix< T > &Z)
Convolution algorithm for the exact normalizing constant of a closed product-form network (Buzen 1973...
ComomRmResult< T > pfqn_comomrm_ld(const Matrix< T > &L, const std::vector< int > &N, const Matrix< T > &Z, const Matrix< T > &mu)
CoMoM for the repairman model with an arbitrary LOAD-DEPENDENT rate lattice at the single queueing st...