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{ 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef DenseIndex Index; 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar eps = sqrt(NumTraits<Scalar>::epsilon()); 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar epsf = chkder_factor * NumTraits<Scalar>::epsilon(); 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar epslog = chkder_log10e * log(eps); 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar temp; 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index m = fvec.size(), n = x.size(); 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (mode != 2) { 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /* mode = 1. */ 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath xp.resize(n); 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index j = 0; j < n; ++j) { 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp = eps * abs(x[j]); 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (temp == 0.) 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp = eps; 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath xp[j] = x[j] + temp; 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else { 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /* mode = 2. */ 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath err.setZero(m); 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index j = 0; j < n; ++j) { 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp = abs(x[j]); 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (temp == 0.) 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp = 1.; 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath err += temp * fjac.col(j); 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index i = 0; i < m; ++i) { 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp = 1.; 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (fvec[i] != 0. && fvecp[i] != 0. && abs(fvecp[i] - fvec[i]) >= epsf * abs(fvec[i])) 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp = eps * abs((fvecp[i] - fvec[i]) / eps - err[i]) / (abs(fvec[i]) + abs(fvecp[i])); 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath err[i] = 1.; 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (temp > NumTraits<Scalar>::epsilon() && temp < eps) 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath err[i] = (chkder_log10e * log(temp) - epslog) / epslog; 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (temp >= eps) 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath err[i] = 0.; 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 63