1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define chkder_log10e 0.43429448190325182765 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define chkder_factor 100. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid chkder( 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Matrix< Scalar, Dynamic, 1 > &x, 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Matrix< Scalar, Dynamic, 1 > &fvec, 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Matrix< Scalar, Dynamic, Dynamic > &fjac, 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Matrix< Scalar, Dynamic, 1 > &xp, 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Matrix< Scalar, Dynamic, 1 > &fvecp, 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int mode, 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Matrix< Scalar, Dynamic, 1 > &err 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ) 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez using std::sqrt; 207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez using std::abs; 217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez using std::log; 227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef DenseIndex Index; 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar eps = sqrt(NumTraits<Scalar>::epsilon()); 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar epsf = chkder_factor * NumTraits<Scalar>::epsilon(); 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar epslog = chkder_log10e * log(eps); 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar temp; 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index m = fvec.size(), n = x.size(); 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (mode != 2) { 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /* mode = 1. */ 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath xp.resize(n); 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index j = 0; j < n; ++j) { 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp = eps * abs(x[j]); 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (temp == 0.) 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp = eps; 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath xp[j] = x[j] + temp; 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else { 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /* mode = 2. */ 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath err.setZero(m); 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index j = 0; j < n; ++j) { 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp = abs(x[j]); 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (temp == 0.) 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp = 1.; 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath err += temp * fjac.col(j); 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index i = 0; i < m; ++i) { 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp = 1.; 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (fvec[i] != 0. && fvecp[i] != 0. && abs(fvecp[i] - fvec[i]) >= epsf * abs(fvec[i])) 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp = eps * abs((fvecp[i] - fvec[i]) / eps - err[i]) / (abs(fvec[i]) + abs(fvecp[i])); 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath err[i] = 1.; 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (temp > NumTraits<Scalar>::epsilon() && temp < eps) 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath err[i] = (chkder_log10e * log(temp) - epslog) / epslog; 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (temp >= eps) 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath err[i] = 0.; 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 67