100 const std::size_t M = rates.
rows();
101 const std::size_t K = rates.
cols();
102 if (M == 0)
throw InputError(
"fes_build_isolated: empty station subset");
103 if (K == 0)
throw InputError(
"fes_build_isolated: no classes");
104 if (stochCompS.
rows() < M * K || stochCompS.
cols() < M * K)
106 "fes_build_isolated: the stochastic complement is too small for the subset; it must be "
107 "at least (M_sub*K) square, indexed (station-1)*K + class over the SUBSET");
118 for (std::size_t k = 0; k < K; ++k) {
121 for (std::size_t i = 0; i < M; ++i)
122 for (std::size_t j = 0; j < M; ++j) P(i, j) = stochCompS(i * K + k, j * K + k);
126 for (std::size_t i = 0; i < M; ++i) {
128 for (std::size_t j = 0; j < M; ++j) rowsum += P(i, j);
129 if (rowsum > fineTol &&
num_abs(T(rowsum - one)) > fineTol) {
130 for (std::size_t j = 0; j < M; ++j) P(i, j) /= rowsum;
131 }
else if (rowsum < fineTol) {
132 for (std::size_t j = 0; j < M; ++j) P(i, j) = zero;
139 for (std::size_t i = 0; i < M; ++i)
140 for (std::size_t j = 0; j < M; ++j) {
141 const T
id = (i == j) ? one : zero;
142 A(i, j) =
id - P(j, i) + one / Mt;
144 std::vector<T> rhs(M, T(one / Mt));
153 pi.assign(M, T(one / Mt));
156 for (std::size_t i = 0; i < M; ++i)
157 if (pi[i] < zero) pi[i] = zero;
159 for (std::size_t i = 0; i < M; ++i) s += pi[i];
161 for (std::size_t i = 0; i < M; ++i) pi[i] /= s;
163 pi.assign(M, T(one / Mt));
166 for (std::size_t i = 0; i < M; ++i) out.
visits(i, k) = pi[i];
170 for (std::size_t i = 0; i < M; ++i)
171 for (std::size_t k = 0; k < K; ++k) {
172 const T r = rates(i, k);
176 out.
L(i, k) = out.
visits(i, k) / r;
181 for (std::size_t k = 0; k < K; ++k) {
182 const T v0 = out.
visits(0, k);
184 for (std::size_t i = 0; i < M; ++i) out.
L(i, k) /= v0;
Dense linear algebra over the templated number type: products, identity, inverse, and powers.
std::vector< T > solve(const Matrix< T > &A, const std::vector< T > &b)
Convenience: solve Ax = b, leaving A and b untouched.