00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "QMCBFGSQuasiNewtonLineSearch.h"
00014
00015 QMCBFGSQuasiNewtonLineSearch::QMCBFGSQuasiNewtonLineSearch(
00016 QMCObjectiveFunction * function,
00017 QMCLineSearchStepLengthSelectionAlgorithm * stepAlg,
00018 int maxSteps, double tol):QMCLineSearch(function,stepAlg,maxSteps,tol)
00019 {
00020 }
00021
00022
00023 void QMCBFGSQuasiNewtonLineSearch::calculateHessian()
00024 {
00025
00026 int last = gradient.size() - 1;
00027
00028
00029
00030
00031
00032
00033
00034
00035 if(last <= 0)
00036 return;
00037
00038 Array1D<double> s = x[last] - x[last-1];
00039 Array1D<double> y = gradient[last] - gradient[last-1];
00040
00041
00042
00043
00044
00045 Array2D<double> & approximateInverseHessian = inverseHessian[last];
00046
00047 double rho = 1.0/(s*y);
00048
00049 Array2D<double> tempMatrix1(dim,dim);
00050
00051 for(int i=0; i<dim; i++)
00052 {
00053 for(int j=0; j<dim; j++)
00054 {
00055 tempMatrix1(i,j) = -rho*s(i)*y(j);
00056 }
00057 tempMatrix1(i,i) += 1.0;
00058 }
00059
00060 Array2D<double> tempMatrix2 = tempMatrix1 * approximateInverseHessian;
00061
00062 for(int i=0; i<dim; i++)
00063 {
00064 for(int j=0; j<dim; j++)
00065 {
00066 tempMatrix1(i,j) = -rho*s(j)*y(i);
00067 }
00068 tempMatrix1(i,i) += 1.0;
00069 }
00070
00071 approximateInverseHessian = tempMatrix2 * tempMatrix1;
00072
00073 for(int i=0; i<dim; i++)
00074 {
00075 for(int j=0; j<dim; j++)
00076 {
00077 approximateInverseHessian(i,j) += rho*s(i)*s(j);
00078 }
00079 }
00080 }