calculation of the gradient
Issue #27
resolved
I noticed that the gradient is calculated using a finite differentiation. That is cool but in function cart?????Error inside minfuncSumSquared / minfuncL2 / constrainfuncm / minfuncDQ is called 3 times.
For example in __minfuncSumSquared
double jump=boost::math::tools::epsilon<float>();
double result[1];
c->cartSumSquaredError(vals, result);
if (!grad.empty()) {
for (uint i=0; i<x.size(); i++) {
double original=vals[i];
vals[i]=original+jump;
double v1[1];
c->cartSumSquaredError(vals, v1);
vals[i]=original-jump;
double v2[1];
c->cartSumSquaredError(vals, v2);
vals[i]=original;
grad[i]=(v1[0]-v2[0])/(2.0*jump);
}
}
I have done some testing and changing the code to this improve the benchmark by 25% with absolutely no impact on the ability to find solutions.
double jump=boost::math::tools::epsilon<float>();
double result[1];
c->cartSumSquaredError(vals, result);
if (!grad.empty()) {
for (uint i=0; i<x.size(); i++) {
double original=vals[i];
vals[i]=original+jump;
double v1[1];
c->cartSumSquaredError(vals, v1);
vals[i]=original;
grad[i]=(v1[0]-result[0])/(jump);
}
}
Comments (2)
-
Account Deactivated -
Account Deactivated - changed status to resolved
Incorporated into master branch. Thanks.
- Log in to comment
Good catch. Running tests, but this looks to be a good speed up.