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()); }
// Return true if V is between MIN and MAX. static bool within_bounds(const vecref v, const vec& min, const vec& max) { return (v.array() >= min.array()).all() && (v.array() <= max.array()).all(); }