vec bokhoven::solve(const vec& q, const stop& s, vec x ) const { const natural n = lcp.dim(); assert(q.rows() == int(n)); if(x.empty()) { x = vec::Zero(n); } assert( x.rows() == q.rows() ); const mat& M = lcp.M; algo::iter_eps(s, [&](real& eps) { x.each([&](natural i ) { const real x_i = x(i); x(i) = (q(i) - this->P.row(i).dot(x) + std::abs( x(i) ) - M.row(i).dot(x.array().abs().matrix()) ) / this->d(i); const real diff = x(i) - x_i; eps += diff * diff; }); eps = std::sqrt(eps); }); return (x.array().abs() + x.array()); }
static void print_vec(const vec& eta) { mat zob = mat::Zero(eta.rows(), 2); eta.each([&](natural i) { zob.col(0)(i) = i; zob.col(1)(i) = eta(i); }); core::log()("Cumulative variance:"); core::log()(zob); }
vec pca::cumul(const vec& eig) { vec res = vec::Zero(eig.rows()); real sum = 0; eig.each([&](natural i ) { sum += eig(i) * eig(i); res(i) = sum; }); assert( sum > 0 ); res /= sum; return res; }
real cond( const vec& eigen) { real min = 1e42; real max = 0; eigen.each([&](natural i) { real ei = std::abs( eigen(i) ); if( ei < min ) min = ei; if( ei > max ) max = ei; }); assert( min ); return max / min; }