88 throw InputError(
"pfqn_comomrm: the solver accepts at most a single queueing station");
89 if (m < 1)
throw InputError(
"pfqn_comomrm: the multiplicity must be at least one");
96 const std::size_t R = san.
N.size();
102 res.
basis.assign(1, one);
106 std::vector<T> Lv(R, zero), Zv(R, zero);
107 for (std::size_t r = 0; r < R; ++r) {
108 if (!san.
L.empty()) Lv[r] = san.
L(0, r);
109 for (std::size_t k = 0; k < san.
Z.rows(); ++k) Zv[r] += san.
Z(k, r);
115 while (nzt < R && Zv[nzt] == zero) ++nzt;
118 std::vector<int> nvec(R, 0);
119 for (std::size_t z = 0; z < nzt; ++z) nvec[z] = san.
N[z];
120 const auto headTerm = [&](
const std::vector<int>& v,
int extra) {
122 for (
int x : v) tot += x;
130 h.assign(2 + 2 * nzt, zero);
132 h[k++] = headTerm(nvec, m);
133 for (std::size_t z = 0; z < nzt; ++z) {
134 std::vector<int> v = nvec;
136 h[k++] = headTerm(v, m);
138 h[k++] = headTerm(nvec, m - 1);
139 for (std::size_t z = 0; z < nzt; ++z) {
140 std::vector<int> v = nvec;
142 h[k++] = headTerm(v, m - 1);
151 res.
G = san.
Gremaind * h[h.size() - R - 1];
157 std::vector<T> hprev = h;
159 for (std::size_t r = nzt; r < R; ++r) {
160 const std::size_t rr = r + 1;
161 for (
int Nr = 1; Nr <= san.
N[r]; ++Nr) {
166 const std::size_t p = rr - 1;
167 std::vector<T> hr(2 * rr, zero);
168 for (std::size_t i = 0; i < p; ++i) hr[i] = h[i];
169 for (std::size_t i = 0; i < p; ++i) hr[rr + i] = h[p + i];
171 hr[2 * rr - 1] = hprev[p];
177 for (std::size_t s = 0; s + 1 < rr; ++s) {
179 A12(1 + s, 1 + s) = -Zv[s];
183 for (std::size_t i = 0; i < rr; ++i) {
184 B2r(i, i) = mT * Lv[r];
185 B2r(i, rr + i) = Zv[r];
189 const T minv = -one / mT;
190 for (std::size_t j = 0; j < rr; ++j) iC(0, j) = minv;
191 for (std::size_t i = 1; i < rr; ++i) iC(i, i) = minv;
196 for (std::size_t i = 0; i < rr; ++i)
197 for (std::size_t j = 0; j < rr; ++j) {
199 for (std::size_t k = 0; k < rr; ++k) s += iC(i, k) * A12(k, j);
203 for (std::size_t i = 0; i < rr; ++i)
204 for (std::size_t j = 0; j < 2 * rr; ++j) {
206 for (std::size_t k = 0; k < rr; ++k) s += W(i, k) * B2r(k, j);
209 for (std::size_t i = 0; i < rr; ++i)
210 for (std::size_t j = 0; j < 2 * rr; ++j) F2(rr + i, j) = B2r(i, j);
216 std::vector<T> hn(2 * rr, zero);
217 for (std::size_t i = 0; i < 2 * rr; ++i) {
219 for (std::size_t j = 0; j < 2 * rr; ++j) s += (F1(i, j) + F2(i, j) * inv) * hprev[j];
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,...
ComomResult< T > pfqn_comomrm(const Matrix< T > &L, const std::vector< int > &N, const Matrix< T > &Z, int m)
CoMoM (class-oriented method of moments) for the finite repairman model: one queueing station of mult...