code: public final Result solve(GradientSolver gslvr, double [] coefs){
      return solve(gslvr, coefs, gslvr.getGradient(coefs), new ProgressMonitor(){
        @Override
        public boolean progress(double[] beta, GradientInfo ginfo) {
          return true;
        }
      });
    }
docs: Solve the optimization problem defined by the user-supplied ginfo function using L-BFGS algorithm.
  
  Will result into multiple (10s to 100s or even 1000s) calls of the user-provided ginfo function.
  Outside of that it does only limited single threaded computation (order of number of coefficients).
  The ginfo is likely to be the most expensive part and key for good perfomance.
  
  @param gslvr  - user ginfo function
  @params coefs - intial solution
  @return Optimal solution (coefficients) + ginfo info returned by the user ginfo
  function evaluated at the found optmimum.