ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/ConjugateMinimizer.cpp
(Generate patch)

Comparing trunk/OOPSE/libmdtools/ConjugateMinimizer.cpp (file contents):
Revision 1022 by tim, Tue Feb 3 22:54:52 2004 UTC vs.
Revision 1023 by tim, Wed Feb 4 22:26:00 2004 UTC

# Line 1 | Line 1
1   #include "ConjugateMinimizer.hpp"
2   #include "Utility.hpp"
3 + ConjugateMinimizerBase::ConjugateMinimizerBase(NLModel1* nlmodel, MinimizerParameterSet* param)
4 +                                : MinimizerUsingLineSearch(param){
5 +  int dim;
6 +  
7 +  model = nlmodel;
8 +  //set the dimension
9  
10 + #ifndef IS_MPI
11 +  dim = model->getDim();
12 + #else
13 +
14 + #endif
15 +  prevGrad.resize(dim);    
16 +  gradient.resize(dim);
17 +  prevDirection.resize(dim);
18 +  direction.resize(dim);
19 + }
20 +
21   bool ConjugateMinimizerBase::isSolvable(){
22  
23    //conjuage gradient can only solve unconstrained nonlinear model
# Line 11 | Line 28 | bool ConjugateMinimizerBase::isSolvable(){
28      return false;
29   }
30  
14 void ConjugateMinimizerBase::Init(){
15
16 }
17
31   void ConjugateMinimizerBase::printMinizerInfo(){
32  
33   }
34  
35 < void ConjugateMinimizerBase::Minimize(){
35 > void ConjugateMinimizerBase::minimize(){
36    int maxIteration;
37    int nextResetIter;
38    int resetFrq;
# Line 43 | Line 56 | void ConjugateMinimizerBase::Minimize(){
56  
57    writeFrq = paramSet->getWriteFrq();
58    nextWriteIter = writeFrq;
46  
47  prevGrad = model->calcGrad();
59  
60 <  direction = prevGrad;
60 >  minX = model->getX();
61 >  gradient = model->calcGrad();
62 >
63 >  for(int i = 0; i < direction.size(); i++)
64 >    direction[i] = -gradient[i];
65    
66    maxIteration = paramSet->getMaxIteration();
67  
68    for(currentIter = 0;currentIter < maxIteration; currentIter++){
69  
70 <    // perform line search to minimize f(x + stepSize * direction) where stepSize > 0
70 >    // perform line search to minimize f(x + lamda * direction) where stepSize > 0
71      lsMinimizer->minimize(direction, 0.0, 1.0);
72      
73      lsStatus = lsMinimizer->getMinimizationStatus();
# Line 70 | Line 85 | void ConjugateMinimizerBase::Minimize(){
85  
86      //calculate the gradient
87      prevGrad = gradient;
88 <    
88 >
89 >    model->setX(minX);
90      gradient = model->calcGrad();
91  
92      // stop if converge
# Line 89 | Line 105 | void ConjugateMinimizerBase::Minimize(){
105      prevDirection = direction;
106  
107      for(int i = 0; i < direction.size(); i++)  
108 <      direction[i] += gamma * direction[i];
108 >      direction[i] = -gradient[i] + gamma * direction[i];
109  
110      //
111      if (currentIter == nextWriteIter){
# Line 117 | Line 133 | int ConjugateMinimizerBase::checkConvergence(){
133  
134    //test absolute gradient tolerance
135    
136 <  if (sqrt(dot(gradient, gradient)) < paramSet->getGradTol())
136 >  if (sqrt(dotProduct(gradient, gradient)) < paramSet->getGradTol())
137      return 1;
138    else
139      return -1;
# Line 128 | Line 144 | double FRCGMinimizer::calcGamma(vector<double>& newGra
144   }
145  
146   double FRCGMinimizer::calcGamma(vector<double>& newGrad, vector<double>& oldGrad){
147 <  return dot(newGrad, newGrad) / dot(oldGrad, newGrad);
147 >  return dotProduct(newGrad, newGrad) / dotProduct(oldGrad, newGrad);
148   }
149  
150   double PRCGMinimizer::calcGamma(vector<double>& newGrad, vector<double>& oldGrad){
# Line 138 | Line 154 | double PRCGMinimizer::calcGamma(vector<double>& newGra
154    for(int i = 0; i < newGrad.size(); i++)
155      deltaGrad.push_back(newGrad[i] - oldGrad[i]);
156  
157 <  return dot(deltaGrad, newGrad) / dot(oldGrad, oldGrad);
157 >  return dotProduct(deltaGrad, newGrad) / dotProduct(oldGrad, oldGrad);
158    
159   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines