Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include "PlayaSimpleBacktracking.hpp"
00044 #include "PlayaOut.hpp"
00045 #include "PlayaTabs.hpp"
00046 #include "PlayaLinearCombinationImpl.hpp"
00047
00048
00049 namespace Playa
00050 {
00051 using std::endl;
00052
00053 SimpleBacktracking::SimpleBacktracking(const ParameterList& params)
00054 : LineSearchBase(params)
00055 {;}
00056
00057 std::string SimpleBacktracking::description() const
00058 {
00059 std::ostringstream oss;
00060 oss << "SimpleBacktracking(maxSteps=" << maxSteps()
00061 << ", minStepSize=" << minStepSize() << ")";
00062 return oss.str();
00063 }
00064
00065 LineSearchStatus SimpleBacktracking::search(const RCP<ObjectiveBase>& obj,
00066 const Vector<double>& x0,
00067 const double& f0,
00068 const Vector<double>& direction,
00069 const double& alphaMax,
00070 Vector<double>& xn,
00071 Vector<double>& gradF,
00072 double& fVal) const
00073 {
00074 Tabs tab(0);
00075 try
00076 {
00077 if (verb() > 0)
00078 {
00079 Out::root() << tab << "backtracking line search" << endl;
00080 }
00081 double alpha = alphaMax;
00082 if (verb() > 3)
00083 {
00084 Out::root() << tab << "line search initial vector " << endl;
00085 Out::os() << x0 << endl;
00086 Out::root() << tab << "line search direction " << endl;
00087 Out::os() << direction << endl;
00088 Out::root() << tab << "line search initial value " << f0 << endl;
00089 }
00090
00091 for (int i = 0; i < maxSteps(); i++)
00092 {
00093 Tabs tab1;
00094 if (verb() > 1)
00095 {
00096 Out::root() << tab1 << "line search step "
00097 << i << " alpha=" << alpha << endl;
00098 }
00099
00100 xn = x0 + alpha * direction;
00101
00102 if (verb() > 3)
00103 {
00104 Out::root() << tab1 << "line search trial vector " << endl;
00105 Out::os() << xn << endl;
00106 }
00107
00108 obj->evalGrad(xn, fVal, gradF);
00109
00110 if (verb() > 1)
00111 {
00112 Out::root() << tab1 << "f=" << fVal << " f0=" << f0 << endl;
00113 }
00114
00115 if (alpha < minStepSize()) return LS_StepTooSmall;
00116
00117 if (fVal < f0)
00118 {
00119 if (verb() > 0)
00120 {
00121 Out::root() << tab1 << "Line search successful: steps = " << i << endl;
00122 }
00123 return LS_Success;
00124 }
00125 alpha = alpha/2.0;
00126 }
00127 return LS_ExceededMaxiters;
00128 }
00129
00130 catch(std::exception& e)
00131 {
00132 Out::root() << "Exception detected in SimpleBacktracking::search(): "
00133 << e.what() << endl;
00134 return LS_Crashed;
00135 }
00136 }
00137
00138
00139
00140 }