1 |
tim |
1002 |
#ifndef _MINIMIZER1D_H_
|
2 |
|
|
#define _MINIMIZER1D_H_
|
3 |
|
|
|
4 |
|
|
#include "MinimizerBase.hpp"
|
5 |
|
|
|
6 |
|
|
//abstract class of one dimension minimizer for line searching
|
7 |
|
|
// optimize f(x+val*direction)
|
8 |
|
|
//some potential problem, such as which class is responsible for deleting NLModel,
|
9 |
|
|
//can be resolved by using smart pointer
|
10 |
|
|
class Minimizer1D : public MinimizerBase{
|
11 |
|
|
|
12 |
|
|
public:
|
13 |
|
|
Minimizer1D(NLModel* nlp) {model = nlp;}
|
14 |
|
|
virtual ~Minimizer1D() {}
|
15 |
|
|
|
16 |
|
|
virtual void init() {}
|
17 |
tim |
1023 |
virtual bool isSolvable() {return true;}
|
18 |
|
|
|
19 |
tim |
1015 |
virtual void minimize() = 0;
|
20 |
tim |
1023 |
virtual void minimize(vector<double>& direction, double left, double right) = 0;
|
21 |
tim |
1002 |
|
22 |
tim |
1010 |
void setRange(double left, double right) {leftVar = left, rightVar= right;}
|
23 |
tim |
1002 |
void setDirection(vector<double>& direction) {this->direction = direction;}
|
24 |
|
|
double getMinVar() {return minVar;}
|
25 |
|
|
double getPrevMinVar() {return prevMinVar;}
|
26 |
|
|
|
27 |
|
|
void setMaxIteration(int iter) {maxIteration = iter;}
|
28 |
|
|
|
29 |
|
|
int getMaxIteration() {return maxIteration;}
|
30 |
|
|
int getCurrentIteration() {return currentIter;}
|
31 |
|
|
|
32 |
|
|
void setStepTol(double tol) {stepTol =tol;}
|
33 |
|
|
double getStepTol() {return stepTol;}
|
34 |
|
|
protected:
|
35 |
|
|
|
36 |
|
|
NLModel* model;
|
37 |
|
|
double leftVar;
|
38 |
|
|
double rightVar;
|
39 |
|
|
double minVar;
|
40 |
tim |
1023 |
double prevMinVar;
|
41 |
tim |
1005 |
|
42 |
tim |
1002 |
vector<double> direction;
|
43 |
|
|
|
44 |
|
|
int maxIteration;
|
45 |
|
|
int currentIter;
|
46 |
tim |
1023 |
double stepTol;
|
47 |
tim |
1002 |
};
|
48 |
|
|
|
49 |
|
|
class GoldenSectionMinimizer : public Minimizer1D{
|
50 |
|
|
|
51 |
|
|
public:
|
52 |
|
|
|
53 |
tim |
1005 |
GoldenSectionMinimizer(NLModel* nlp);
|
54 |
tim |
1010 |
void minimize();
|
55 |
tim |
1023 |
virtual void minimize(vector<double>& direction, double left, double right){
|
56 |
|
|
setRange(left, right);
|
57 |
|
|
setDirection(direction);
|
58 |
|
|
minimize();
|
59 |
|
|
}
|
60 |
tim |
1005 |
virtual int checkConvergence();
|
61 |
|
|
|
62 |
|
|
protected:
|
63 |
tim |
1002 |
|
64 |
tim |
1005 |
double fMinVar;
|
65 |
|
|
double fPrevMinVar;
|
66 |
tim |
1002 |
|
67 |
|
|
double fAlpha;
|
68 |
|
|
double fBeta;
|
69 |
|
|
double alpha;
|
70 |
|
|
double beta;
|
71 |
|
|
|
72 |
|
|
};
|
73 |
|
|
|
74 |
|
|
class BrentMinimizer : public Minimizer1D{
|
75 |
|
|
public:
|
76 |
tim |
1005 |
|
77 |
tim |
1002 |
BrentMinimizer(NLModel* nlp);
|
78 |
tim |
1005 |
|
79 |
tim |
1002 |
void minimize();
|
80 |
tim |
1031 |
virtual void minimize(vector<double>& direction, double left, double right);
|
81 |
tim |
1005 |
virtual int checkConvergence();
|
82 |
tim |
1031 |
|
83 |
tim |
1002 |
protected:
|
84 |
tim |
1005 |
|
85 |
tim |
1031 |
void bracket(double& cx, double& fc, double& ax, double& fa, double& bx, double& fb);
|
86 |
tim |
1005 |
double fMinVar;
|
87 |
|
|
double fPrevMinVar;
|
88 |
|
|
double midVar;
|
89 |
tim |
1002 |
|
90 |
|
|
};
|
91 |
|
|
#endif
|