54 const std::size_t n = A.
rows();
58 for (std::size_t i = 0; i < n; ++i)
59 for (std::size_t j = 0; j < n; ++j) V(i, j) = (i == j) ? one : zero;
60 for (
int sweep = 0; sweep < 100; ++sweep) {
62 for (std::size_t p = 0; p + 1 < n; ++p)
63 for (std::size_t q = p + 1; q < n; ++q) off += A(p, q) * A(p, q);
65 for (std::size_t p = 0; p + 1 < n; ++p) {
66 for (std::size_t q = p + 1; q < n; ++q) {
68 T theta = T((A(q, q) - A(p, p)) / (A(p, q) + A(p, q)));
69 T t = T(one / T(abs(theta) + sqrt(T(theta * theta + one))));
71 T c = T(one / sqrt(T(t * t + one)));
73 for (std::size_t k = 0; k < n; ++k) {
74 T akp = A(k, p), akq = A(k, q);
75 A(k, p) = T(c * akp - s * akq);
76 A(k, q) = T(s * akp + c * akq);
78 for (std::size_t k = 0; k < n; ++k) {
79 T apk = A(p, k), aqk = A(q, k);
80 A(p, k) = T(c * apk - s * aqk);
81 A(q, k) = T(s * apk + c * aqk);
83 for (std::size_t k = 0; k < n; ++k) {
84 T vkp = V(k, p), vkq = V(k, q);
85 V(k, p) = T(c * vkp - s * vkq);
86 V(k, q) = T(s * vkp + c * vkq);
92 for (std::size_t i = 0; i < n; ++i) d[i] = A(i, i);
93 for (std::size_t i = 0; i + 1 < n; ++i) {
95 for (std::size_t j = i + 1; j < n; ++j)
101 for (std::size_t k = 0; k < n; ++k) {
112void golub_welsch(
const std::vector<T>& off,
const T& mu0, std::vector<T>& x,
114 const std::size_t n = off.size() + 1;
117 for (std::size_t i = 0; i < n; ++i)
118 for (std::size_t j = 0; j < n; ++j) J(i, j) = zero;
119 for (std::size_t k = 0; k + 1 < n; ++k) {
120 J(k, k + 1) = off[k];
121 J(k + 1, k) = off[k];
126 for (std::size_t k = 0; k < n; ++k) w[k] = T(mu0 * V(0, k) * V(0, k));
149 w.assign(1, sqrt(twopi));
152 std::vector<T> off(q - 1);
153 for (std::size_t k = 1; k < q; ++k)
194Radial<T> radial(
const std::vector<T>& c,
const std::vector<T>& N,
const std::vector<T>& Z,
197 "radial requires transcendental arithmetic (quadrature of an integral)");
202 const std::size_t R = c.size();
207 static std::vector<T> vg, wg;
211 for (std::size_t r = 0; r < R; ++r) Ntot += N[r];
212 T t = log(T(Ntot + Md));
213 for (
int it = 0; it < 200; ++it) {
215 T f1 = T(Md - v), f2 = T(zero - v);
216 for (std::size_t r = 0; r < R; ++r) {
217 T d = T(Z[r] + v * c[r]);
219 f1 += N[r] * T(v * c[r]) / d;
220 f2 += N[r] * T(v * c[r]) * Z[r] / T(d * d);
224 if (stepd > 2.0) stepd = 2.0;
225 if (stepd < -2.0) stepd = -2.0;
227 if (stepd < 1e-13 && stepd > -1e-13)
break;
231 for (std::size_t r = 0; r < R; ++r) {
232 T d = T(Z[r] + v * c[r]);
234 f2 += N[r] * T(v * c[r]) * Z[r] / T(d * d);
243 for (
int k = 0; k < 60; ++k) {
252 for (
int k = 0; k < 60; ++k) {
259 const std::size_t nq = 2 * vg.size();
260 std::vector<T> tt(nq), W(nq), vv(nq), fv(nq);
261 for (std::size_t k = 0; k < vg.size(); ++k) {
262 tt[k] = T(half * a * vg[k] + T(t - half * a));
263 W[k] = T(half * a * wg[k]);
264 tt[vg.size() + k] = T(half * b * vg[k] + T(t + half * b));
265 W[vg.size() + k] = T(half * b * wg[k]);
269 for (std::size_t k = 0; k < nq; ++k) {
271 T f = T(T(zero - vv[k]) + Md * tt[k]);
272 for (std::size_t r = 0; r < R; ++r) {
273 T d = T(Z[r] + vv[k] * c[r]);
282 std::vector<T> e(nq);
284 for (std::size_t k = 0; k < nq; ++k) {
285 e[k] = T(W[k] * exp(T(fv[k] - mxT)));
289 out.
lJ = T(mxT + log(se));
290 out.
G.assign(R, zero);
293 std::vector<T> p(nq);
294 for (std::size_t k = 0; k < nq; ++k) {
296 out.
vbar += p[k] * vv[k];
297 for (std::size_t r = 0; r < R; ++r) {
298 Tm(k, r) = T(N[r] * vv[k] / D(k, r));
299 out.
G[r] += p[k] * Tm(k, r);
303 for (std::size_t r = 0; r < R; ++r)
304 for (std::size_t s = 0; s < R; ++s) et2(r, s) = zero;
305 for (std::size_t k = 0; k < nq; ++k)
306 for (std::size_t r = 0; r < R; ++r) {
307 T pt = T(p[k] * Tm(k, r));
308 for (std::size_t s = 0; s < R; ++s) et2(r, s) += pt * Tm(k, s);
311 for (std::size_t r = 0; r < R; ++r) {
312 for (std::size_t s = 0; s < R; ++s)
313 out.
Lam(r, s) = T(et2(r, s) - out.
G[r] * out.
G[s]);
315 out.
Lam(r, r) = T(out.
Lam(r, r) - et2(r, r) / N[r]);
317 for (std::size_t r = 0; r < R; ++r)
318 for (std::size_t s = r + 1; s < R; ++s) {
319 T m = T(half * T(out.
Lam(r, s) + out.
Lam(s, r)));
346 const std::size_t M = L.
rows(), R = L.
cols();
353 for (
int it = 0; it < 10000; ++it) {
355 for (std::size_t i = 0; i < M; ++i)
357 if (diff <= 1e-11)
break;
359 std::vector<T> c(R, zero);
360 for (std::size_t r = 0; r < R; ++r)
361 for (std::size_t i = 0; i < M; ++i) c[r] += x1[i] * L(i, r);
364 for (std::size_t i = 0; i < M; ++i) {
366 for (std::size_t r = 0; r < R; ++r) lg += L(i, r) * rad.
G[r];
367 x[i] = T(T(one + x1[i] * lg) / rad.
vbar);
370 for (std::size_t i = 0; i < M; ++i) x[i] = T(x[i] / s);
372 std::vector<T> c(R, zero);
373 for (std::size_t r = 0; r < R; ++r)
374 for (std::size_t i = 0; i < M; ++i) c[r] += x[i] * L(i, r);
378 for (std::size_t i = 0; i < M; ++i) {
379 for (std::size_t j = 0; j < M; ++j) {
381 for (std::size_t r = 0; r < R; ++r) {
383 for (std::size_t s = 0; s < R; ++s) lr += rad.
Lam(r, s) * L(j, s);
388 P(i, i) = T(P(i, i) - one / T(x[i] * x[i]));
390 const std::size_t d = M - 1;
392 for (std::size_t i = 0; i < M; ++i)
393 for (std::size_t aI = 0; aI < d; ++aI)
394 Jm(i, aI) = T((i == aI ? x[i] : zero) - x[i] * x[aI]);
397 for (std::size_t aI = 0; aI < d; ++aI)
398 for (std::size_t bI = 0; bI < d; ++bI) {
400 for (std::size_t i = 0; i < M; ++i) {
402 for (std::size_t j = 0; j < M; ++j) pj += P(i, j) * Jm(j, bI);
403 acc += Jm(i, aI) * pj;
405 out.
A(aI, bI) = T(zero - acc);
408 for (std::size_t i = 0; i < d; ++i)
409 for (std::size_t j = i + 1; j < d; ++j) {
410 T m = T(half * T(out.
A(i, j) + out.
A(j, i)));
415 out.
ld = (d == 0) ? zero : detail::pfqn_logdet(out.
A);
417 for (std::size_t i = 0; i < M; ++i) sum_lx += log(x[i]);
418 out.
h0 = T(rad.
lJ + sum_lx);
451 std::size_t q, std::size_t d) {
456 if (d == 0)
return zero;
457 double nodesd = std::pow(
static_cast<double>(q),
static_cast<double>(d));
459 throw InputError(
"pfqn_aghq: the tensor rule needs more than 1e7 nodes; reduce q or use pfqn_le");
460 const std::size_t nodes =
static_cast<std::size_t
>(nodesd);
465 for (std::size_t j = 0; j < d; ++j) {
467 throw InputError(
"pfqn_aghq: the curvature at the mode is not positive definite");
469 for (std::size_t i = 0; i < d; ++i) B(i, j) = T(V(i, j) * sc);
471 std::vector<T> z, wt;
473 std::vector<T> lwt(q);
474 for (std::size_t k = 0; k < q; ++k) lwt[k] = log(wt[k]);
475 std::vector<std::size_t> idx(d, 0);
476 double lmax = -1e308;
478 std::vector<T> zz(d), w(d);
480 for (std::size_t k = 0; k < nodes; ++k) {
481 T lw = zero, zsq = zero;
482 for (std::size_t j = 0; j < d; ++j) {
485 zsq += zz[j] * zz[j];
487 for (std::size_t i = 0; i < d; ++i) {
489 for (std::size_t j = 0; j < d; ++j) acc += B(i, j) * zz[j];
494 if (first || ltd > lmax) {
503 for (std::size_t j = d; j-- > 0;) {
504 if (++idx[j] < q)
break;