174 "pfqn_kt requires transcendental arithmetic (steepest-descent expansion of log G)");
182 for (
const T& v : N0) Nt0 += v;
183 if (L0.
empty() || N0.empty() || Nt0 == zero) {
188 const std::size_t Rorig = L0.
cols(), Morig = L0.
rows();
189 std::vector<T> Zin = Z0;
190 if (Zin.empty()) Zin.assign(Rorig, zero);
191 if (Zin.size() != Rorig || N0.size() != Rorig)
192 throw InputError(
"pfqn_kt: L, N and Z disagree on the class count");
197 std::size_t nkeep = 0;
198 for (std::size_t r = 0; r < Rorig; ++r)
199 if (N0[r] > zero) ++nkeep;
200 if (nkeep > 0 && nkeep < Rorig) {
202 std::vector<T> Nk, Zk;
206 for (std::size_t r = 0; r < Rorig; ++r) {
207 if (!(N0[r] > zero))
continue;
208 for (std::size_t i = 0; i < Morig; ++i) Lk(i, c) = L0(i, r);
210 Zk.push_back(Zin[r]);
217 T slcdemandfactor = zero;
218 std::vector<bool> isslc(Rorig,
false);
219 std::vector<std::vector<T>> rows;
220 for (std::size_t i = 0; i < Morig; ++i) {
221 std::vector<T> row(Rorig);
222 for (std::size_t r = 0; r < Rorig; ++r) row[r] = L0(i, r);
225 std::vector<std::size_t> slcstation(Rorig, 0);
227 for (std::size_t r = 0; r < Rorig; ++r) {
228 std::size_t nnz = 0, ist = 0;
229 for (std::size_t i = 0; i < Morig; ++i)
230 if (L0(i, r) != zero) {
234 if (nnz != 1 || Zin[r] != zero)
continue;
240 std::vector<bool> done(Rorig,
false);
241 for (std::size_t r = 0; r < Rorig; ++r) {
242 if (!isslc[r] || done[r])
continue;
243 const std::size_t ist = slcstation[r];
245 for (std::size_t s = r; s < Rorig; ++s) {
246 if (!isslc[s] || slcstation[s] != ist)
continue;
249 slcdemandfactor += T(N0[s] * log(L0(ist, s))) - detail::num_factln<T>(N0[s]);
251 slcdemandfactor += detail::num_factln<T>(ntot);
253 for (
long k = 0; k < reps; ++k) {
254 std::vector<T> row(Rorig);
255 for (std::size_t s = 0; s < Rorig; ++s) row[s] = L0(ist, s);
260 std::vector<std::size_t> keep;
261 for (std::size_t r = 0; r < Rorig; ++r)
262 if (!isslc[r]) keep.push_back(r);
264 res.
lG = slcdemandfactor;
265 res.
G = exp(slcdemandfactor);
268 const std::size_t M = rows.size(), R = keep.size();
270 for (std::size_t i = 0; i < M; ++i)
271 for (std::size_t r = 0; r < R; ++r) L(i, r) = rows[i][keep[r]];
272 std::vector<T> N(R), Z(R);
273 for (std::size_t r = 0; r < R; ++r) {
278 for (
const T& v : N) Ntot += v;
280 res.
lG = slcdemandfactor;
281 res.
G = exp(slcdemandfactor);
288 std::vector<T> u0(R);
290 for (std::size_t r = 0; r < R; ++r) {
292 for (std::size_t k = 0; k < M; ++k) colsum += L(k, r);
293 if (colsum < epsT) colsum = epsT;
297 if (!detail::pfqn_kt_newton(L, Z, N, u0, Ntot, us)) {
300 if (!detail::pfqn_kt_newton(L, Z, N, amva.
XN, Ntot, us))
308 for (std::size_t k = 0; k < M; ++k) {
310 for (std::size_t r = 0; r < R; ++r) s += L(k, r) * us[r];
312 if (den < fineTol) den = fineTol;
313 for (std::size_t r = 0; r < R; ++r) res.
Q(k, r) = T(L(k, r) * us[r] / den);
317 std::vector<T> Uk(M), D(M);
318 for (std::size_t k = 0; k < M; ++k) {
320 for (std::size_t r = 0; r < R; ++r) s += L(k, r) * us[r];
323 if (den < fineTol) den = fineTol;
327 for (std::size_t r = 0; r < R; ++r) {
328 if (us[r] == zero)
throw NumericError(
ErrorKind{
"Degenerate"},
"pfqn_kt: zero saddle-point coordinate");
329 H(r, r) = T(N[r] / T(us[r] * us[r]));
330 for (std::size_t s = 0; s < R; ++s) {
332 for (std::size_t k = 0; k < M; ++k) acc += L(k, r) * T(D[k] * D[k]) * L(k, s);
337 for (std::size_t r = 0; r < R; ++r) F += Z[r] * us[r];
338 for (std::size_t k = 0; k < M; ++k) {
339 T den = T(one - Uk[k]);
340 if (den < fineTol) den = fineTol;
343 for (std::size_t r = 0; r < R; ++r) F -= N[r] * log(us[r]);
347 for (std::size_t r = 0; r < R; ++r) lG -= log(us[r]);
350 lG += slcdemandfactor;