stlbfgs icon indicating copy to clipboard operation
stlbfgs copied to clipboard

Divide by zero error in line search

Open dspoel opened this issue 10 months ago • 2 comments

At line 40 in the linesearch.cpp code there is a divide by zero occurring.

    double find_quadratic_minimizer(double a, double ga, double b, double gb) {
        return b + ((b - a)*gb)/(ga - gb);
    }

I tried to code a work around with an if (ga == gb) statement, but don't know what the return value should be in that case. Suggestions?

    double find_quadratic_minimizer(double a, double ga, double b, double gb) {
        if (ga == gb) {
          return 0;
        }
        else {
          return b + ((b - a)*gb)/(ga - gb);
        }
    }

dspoel avatar Apr 15 '24 14:04 dspoel

This functions looks for the minimizer of a quadratic function f(x) defined over the interval [a,b] with given derivatives f'(a) and f'(b). In order to have the problem well-posed the derivatives must obey the condition f'(a)<0 and f'(b)>0.

find_quadratic_minimizer is called from lines 51 and 46 ; 51 should not pose any problem since the condition is verified explicitly, and a call from 46 guarantees two different values f(a) and f(b), and therefore the derivatives must differ.

It does seem that you are working beyond the limits of machine precision.

It is a bad idea to have this workaround. Linesearch must fail in this case. Division by zero is supposed to be checked in lines 90-98 of linesearch.cpp, it would be a good idea to investigate. Do you get an exception?

ssloy avatar Apr 15 '24 14:04 ssloy

Yes, the code crashes with some specific input with a 1/0 error.

I do think precision may be the issue and will try to move to an integer x vector.

dspoel avatar Apr 15 '24 15:04 dspoel