unsigned int OneDimensionOptimizationTools::lineMinimization(DirectionFunction & f1dim, ParameterList & parameters, vector<double> & xi, double tolerance, ostream * profiler, ostream * messenger, int verbose)
{
  // Initial guess for brackets:
  double ax = 0.;
  double xx = 0.01;
  
  f1dim.setConstraintPolicy(AutoParameter::CONSTRAINTS_AUTO);
  f1dim.setMessageHandler(messenger);
  f1dim.init(parameters, xi);
  BrentOneDimension bod(&f1dim);
  bod.setMessageHandler(messenger);
  bod.setProfiler(profiler);
  bod.setVerbose(verbose >= 1 ? 1 : 0);
  bod.setOptimizationProgressCharacter(".");
  bod.getStopCondition()->setTolerance(0.01);
  bod.setInitialInterval(ax, xx);
  bod.setConstraintPolicy(AutoParameter::CONSTRAINTS_KEEP);
  ParameterList singleParameter;
  singleParameter.addParameter(Parameter("x", 0.0));
  bod.init(singleParameter);
  bod.optimize();
  //Update parameters:
  //parameters.matchParametersValues(f1dim.getFunction()->getParameters());
  
  double xmin = f1dim.getParameters()[0]->getValue();
  for(unsigned int j = 0; j < parameters.size(); j++)
  {
    xi[j] *= xmin;
    parameters[j]->setValue(parameters[j]->getValue() + xi[j]);
  }
  return bod.getNumberOfEvaluations();
}
unsigned int OneDimensionOptimizationTools::lineSearch(DirectionFunction& f1dim,
        ParameterList& parameters,
        std::vector<double>& xi,
        std::vector<double>& gradient,
        OutputStream* profiler,
        OutputStream* messenger,
        int verbose)
{
    size_t size = xi.size();

    f1dim.setConstraintPolicy(AutoParameter::CONSTRAINTS_AUTO);
    f1dim.setMessageHandler(messenger);
    f1dim.init(parameters, xi);

    double slope=0;
    for (unsigned int i=0; i<size; i++)
        slope+=xi[i]*gradient[i];

    //  if (slope>=0)
    //  throw Exception("Slope problem in OneDimensionOptimizationTools::lineSearch. Slope="+TextTools::toString(slope));

    double x, temp, test=0;
    for (unsigned int i=0; i<size; i++) {
        x=abs(parameters[i].getValue());
        temp=abs(xi[i]);
        if (x>1.0)
            temp/=x;
        if (temp>test)
            test=temp;
    }

    NewtonBacktrackOneDimension nbod(&f1dim, slope, test);

    nbod.setMessageHandler(messenger);
    nbod.setProfiler(profiler);
    nbod.setVerbose(verbose >= 1 ? 1 : 0);
    nbod.setOptimizationProgressCharacter(".");
    nbod.getStopCondition()->setTolerance(0.0001);
    //  nbod.setInitialInterval(ax, xx);
    nbod.setConstraintPolicy(AutoParameter::CONSTRAINTS_KEEP);
    ParameterList singleParameter;
    singleParameter.addParameter(Parameter("x", 0.0));
    nbod.init(singleParameter);
    nbod.optimize();
    //Update parameters:
    //parameters.matchParametersValues(f1dim.getFunction()->getParameters());

    double xmin = f1dim.getParameters()[0].getValue();
    for(unsigned int j = 0; j < parameters.size(); j++)
    {
        xi[j] *= xmin;
        parameters[j].setValue(parameters[j].getValue() + xi[j]);
    }

    return nbod.getNumberOfEvaluations();
}