90 const std::size_t M = alpha.
rows(), N = alpha.
cols();
91 if (c.size() != M)
throw InputError(
"pfqn_fnc: the offset vector must have one entry per station");
94 const T inf = detail::num_inf_marker<T>();
97 for (std::size_t i = 0; i < M; ++i) {
98 const T d0 = T(one + c[i]);
99 if (d0 == zero)
throw NumericError(
ErrorKind{
"Degenerate"},
"pfqn_fnc: offset -1 makes the first rate undefined");
100 mu(i, 0) = T(alpha(i, 0) / d0);
102 Matrix<T> anum(N + 1, N + 1, zero), aden(N + 1, N + 1, zero);
103 for (std::size_t n = 2; n <= N; ++n) {
104 anum(n, 1) = alpha(i, n - 1);
105 aden(n, 1) = alpha(i, n - 2);
106 for (std::size_t k = 2; k + 1 <= n; ++k) {
107 anum(n, k) = T(anum(n, k - 1) * alpha(i, n - k));
108 aden(n, k) = T(aden(n, k - 1) * alpha(i, n - k - 1));
111 for (std::size_t n = 2; n <= N; ++n) {
112 T rho = zero, muden = one;
114 for (std::size_t k = 1; k + 1 <= n; ++k) {
115 muden *= mu(i, k - 1);
120 rho += T(T(anum(n, k) - aden(n, k)) / muden);
122 if (bad || T(one - rho) == zero) {
126 T v = T(anum(n, n - 1) * alpha(i, 0) / muden);
127 v = T(v / T(one - rho));
133 const double big = 1e15;
134 for (std::size_t i = 0; i < M; ++i) {
135 for (std::size_t n = 0; n < N; ++n) {
137 if (std::isnan(v) || std::fabs(v) > big) mu(i, n) = inf;
139 for (std::size_t n = 0; n < N; ++n) {
140 if (detail::is_inf_marker(mu(i, n))) {
141 for (std::size_t k = n; k < N; ++k) mu(i, k) = inf;