81 "cache_xi_iter requires transcendental arithmetic");
82 const std::size_t n = gamma.
rows();
83 const std::size_t h = m.size();
84 if (gamma.
cols() != h)
85 throw InputError(
"cache_xi_iter: gamma and m disagree on the number of lists");
86 if (n == 0)
throw InputError(
"cache_xi_iter: no items");
93 std::vector<T> f(h, zero);
94 for (std::size_t l = 0; l < h; ++l) f[l] = num_traits<T>::from_int(
static_cast<long>(m[l])) / nT;
98 for (std::size_t l = 0; l < h; ++l)
99 for (std::size_t k = 0; k < n; ++k) pp(l + 1, k) = gamma(k, l);
101 std::vector<T> z(h + 1, one), zold(h + 1, zero);
104 for (
int sweep = 0;; ++sweep) {
105 T dmax = zero, omax = zero;
106 for (std::size_t l = 0; l <= h; ++l) {
107 const T d =
num_abs(T(z[l] - zold[l]));
108 if (d > dmax) dmax = d;
110 if (o > omax) omax = o;
112 if (!(dmax > reltol * omax))
break;
114 throw NumericError(
"cache_xi_iter: the Gauss-Seidel sweep did not converge");
118 std::vector<T> temp(n, zero);
119 for (std::size_t k = 0; k < n; ++k) {
121 for (std::size_t l = 0; l <= h; ++l) s += z[l] * pp(l, k);
125 for (std::size_t l = 0; l < h; ++l) {
126 std::vector<T> ppl(n), a(n);
127 for (std::size_t k = 0; k < n; ++k) {
128 ppl[k] = pp(l + 1, k);
129 a[k] = temp[k] - nT * z[l + 1] * ppl[k];
132 const T Fi = detail::xi_iter_occupancy(ppl, a, one,
static_cast<long>(n));
140 while (detail::xi_iter_occupancy(ppl, a, zmax,
static_cast<long>(n)) < f[l]) {
145 for (
int b = 0; b < 50; ++b) {
146 const T mid = (zmin + zmax) / two;
148 if (detail::xi_iter_occupancy(ppl, a, mid,
static_cast<long>(n)) < f[l])
156 return std::vector<T>(z.begin() + 1, z.end());