示例#1
0
    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());
    }
示例#2
0
// 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();
}