104 m.
validate(
"polling_qsys_exhaustive");
105 const std::size_t n = m.
size();
108 const detail::PollingAggregates<T> a =
109 detail::polling_aggregates(m,
"polling_qsys_exhaustive");
110 const std::vector<T>& rho1 = a.rho1;
111 const T rho = a.rho, r = a.R;
113 const std::size_t nn = n * n;
115 std::vector<T> rhs(nn, zero);
117 for (std::size_t i = 1; i <= n; ++i) {
118 for (std::size_t j = 1; j <= n; ++j, ++row) {
120 for (std::size_t k = i + 1; k <= n; ++k) A(row, (j - 1) * n + k - 1) -= one;
121 for (std::size_t k = 1; k + 1 <= j; ++k) A(row, (j - 1) * n + k - 1) -= one;
122 for (std::size_t k = j; k + 1 <= i; ++k) A(row, (k - 1) * n + j - 1) -= one;
123 A(row, (i - 1) * n + j - 1) += (one - rho1[i - 1]) / rho1[i - 1];
125 for (std::size_t k = i + 1; k + 1 <= j; ++k) A(row, (j - 1) * n + k - 1) -= one;
126 for (std::size_t k = j; k <= n; ++k) A(row, (k - 1) * n + j - 1) -= one;
127 for (std::size_t k = 1; k + 1 <= i; ++k) A(row, (k - 1) * n + j - 1) -= one;
128 A(row, (i - 1) * n + j - 1) += (one - rho1[i - 1]) / rho1[i - 1];
130 A(row, (i - 1) * n + i - 1) += one;
131 for (std::size_t k = 1; k <= n; ++k)
132 if (k != i) A(row, (i - 1) * n + k - 1) -= rho1[i - 1] / (one - rho1[i - 1]);
135 const T dprev = (i > 1) ? m.
delta2[i - 2] : m.
delta2[n - 1];
136 const T omr = one - rho1[i - 1];
137 rhs[row] = dprev / (omr * omr) +
138 m.
lambda[i - 1] * m.
b2[i - 1] * r * omr / ((one - rho) * omr * omr * omr);
143 const std::vector<T> f =
solve(A, rhs);
146 for (std::size_t i = 1; i <= n; ++i) {
147 const T omr = one - rho1[i - 1];
148 T w = m.
lambda[i - 1] * m.
b2[i - 1] / (two * omr);
149 w += r * omr / (two * (one - rho));
151 for (std::size_t j = 1; j <= n; ++j)
152 if (j != i) s += f[(i - 1) * n + j - 1];
153 s *= omr / rho1[i - 1];
155 s /= r * omr * two / (one - rho);
172 const std::size_t n = m.
size();
175 const detail::PollingAggregates<T> a = detail::polling_aggregates(m,
"polling_qsys_gated");
176 const std::vector<T>& rho1 = a.rho1;
177 const T rho = a.rho, r = a.R;
179 const std::size_t nn = n * n;
181 std::vector<T> rhs(nn, zero);
183 for (std::size_t i = 1; i <= n; ++i) {
184 for (std::size_t j = 1; j <= n; ++j, ++row) {
186 for (std::size_t k = i; k <= n; ++k) A(row, (j - 1) * n + k - 1) = -one;
187 for (std::size_t k = 1; k + 1 <= j; ++k) A(row, (j - 1) * n + k - 1) = -one;
188 for (std::size_t k = j; k + 1 <= i; ++k) A(row, (k - 1) * n + j - 1) = -one;
189 A(row, (i - 1) * n + j - 1) = one / rho1[i - 1];
191 for (std::size_t k = i; k + 1 <= j; ++k) A(row, (j - 1) * n + k - 1) = -one;
192 for (std::size_t k = j; k <= n; ++k) A(row, (k - 1) * n + j - 1) = -one;
193 for (std::size_t k = 1; k + 1 <= i; ++k) A(row, (k - 1) * n + j - 1) = -one;
194 A(row, (i - 1) * n + j - 1) = one / rho1[i - 1];
196 A(row, (i - 1) * n + i - 1) += one;
197 for (std::size_t k = 1; k <= n; ++k)
198 if (k != i) A(row, (i - 1) * n + k - 1) = -rho1[i - 1];
199 for (std::size_t k = 1; k <= n; ++k)
200 A(row, (k - 1) * n + i - 1) -= rho1[i - 1] * rho1[i - 1];
201 rhs[row] = m.
delta2[i - 1] + m.
lambda[i - 1] * m.
b2[i - 1] * r / (one - rho);
206 const std::vector<T> f =
solve(A, rhs);
209 for (std::size_t i = 1; i <= n; ++i) {
210 T w = (one + rho1[i - 1]) * r / (two * (one - rho));
212 for (std::size_t j = 1; j <= n; ++j)
213 if (j != i) s += f[(i - 1) * n + j - 1];
215 for (std::size_t j = 1; j <= n; ++j) s += f[(j - 1) * n + i - 1];
216 w += (one - rho) * (one + rho1[i - 1]) * s / (two * r);
std::vector< T > solve(const Matrix< T > &A, const std::vector< T > &b)
Convenience: solve Ax = b, leaving A and b untouched.