calculation of the gradient

Issue #27 resolved
Davide Faconti created an issue

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)

  1. Log in to comment