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(); }