ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/SteepestDescent.cpp
Revision: 1015
Committed: Tue Feb 3 22:54:52 2004 UTC (20 years, 5 months ago) by tim
File size: 1820 byte(s)
Log Message:
NLModel0, NLModel1 pass uit test

File Contents

# User Rev Content
1 tim 1011 #include "SteepestDescent.hpp"
2 tim 1015 #include "Utility.hpp"
3     void SteepestDescent::minimize(){
4     int maxIteration;
5     int nextRestIter;
6     int resetFrq;
7     int nextWriteIter;
8     int writeFrq;
9    
10     if (!isSolvable()){
11     cout << "ConjugateMinimizerBase Error: This nonlinear model can not be solved by " << methodName <<endl;
12 tim 1011
13 tim 1015 exit(1);
14     }
15    
16     printMinizerInfo();
17    
18     resetFrq = paramSet->getResetFrq();
19     nextRestIter = resetFrq;
20    
21     writeFrq = paramSet->getWriteFrq();
22     nextWriteIter = writeFrq;
23    
24     direction = model->calcGrad();
25    
26     maxIteration = paramSet->getMaxIteration();
27    
28     for(currentIter = 0;currentIter < maxIteration; currentIter++){
29    
30     // perform line search to minimize f(x + stepSize * direction) where stepSize > 0
31     lsMinimizer->minimize(direction, 0.0, 1.0);
32    
33     lsStatus = lsMinimizer->getMinimizationStatus();
34    
35     if(lsStatus ==MINSTATUS_ERROR){
36     minStatus = MINSTATUS_ERROR;
37     return;
38     }
39    
40     prevMinX = minX;
41     minX = minX + lsMinimizer->getMinVar() * direction;
42    
43     //calculate the gradient
44    
45     direction = model->calcGrad(minX);
46    
47     // stop if converge
48     if (checkConvergence() > 0){
49     writeOut(minX, currentIter);
50    
51     minStatus = MINSTATUS_CONVERGE;
52     return;
53     }
54    
55     //
56     if (currentIter == nextWriteIter){
57     nextWriteIter += writeFrq;
58     writeOut(minX, currentIter);
59     }
60    
61     if (currentIter == nextResetIter){
62     reset();
63     nextResetIter += resetFrq;
64     }
65    
66     }
67    
68     // if writeFrq is not a multipiler of maxIteration, we need to write the final result
69     // otherwise, we already write it inside the loop, just skip it
70     if(currentIter != (nextWriteIter - writeFrq))
71     writeOut(minX, currentIter);
72    
73     minStatus = MINSTATUS_MAXITER;
74     return;
75     }

Properties

Name Value
svn:executable *