-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGradient.cpp
91 lines (69 loc) · 2.31 KB
/
Gradient.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "Gradient.h"
#include <math.h>
#include <iostream>
#include <functional>
#include <vector>
Gradient::Gradient() {
m_nDimensions = 0;
m_stepSize = 0.0;
m_maxIterations = 1;
m_gradientStepSize = 0.001;
m_gradientThreshold = 1e-09;
}
Gradient::~Gradient(){
}
void Gradient::setObjectFn(std::function<double(std::vector<double>*)> objFn){
m_objectFunction = objFn;
}
void Gradient::setStartPoint(const std::vector<double> startPoint){
m_startPoint = startPoint;
m_nDimensions = startPoint.size();
}
void Gradient::setStepSize(double stepSize){
m_stepSize = stepSize;
}
void Gradient::setMaxIterations(int maxIterations){
m_maxIterations = maxIterations;
}
void Gradient::setGradientThreshold(double gradientThreshold){
m_gradientThreshold = gradientThreshold;
}
bool Gradient::Optimize(std::vector<double> *funcLoc, double *funcVal){
m_currentPoint = m_startPoint;
int iterCount =0;
double gradientMagnitude = 1.0;
while((iterCount < m_maxIterations) && (gradientMagnitude > m_gradientThreshold)){
std::vector<double> gradientVector = computeGradientVector();
gradientMagnitude = computeGradientMagnitude(gradientVector);
std::vector<double> newPoint = m_currentPoint;
for(int i = 0;i < m_nDimensions;i++){
newPoint[i] += -(gradientVector[i] * m_stepSize);
}
m_currentPoint = newPoint;
iterCount++;
}
*funcLoc = m_currentPoint;
*funcVal = m_objectFunction(&m_currentPoint);
return true;
}
double Gradient::computeGradient(int dim){
std::vector<double> newPoint = m_currentPoint;
newPoint[dim] += m_gradientStepSize;
double funcVal1 = m_objectFunction(&m_currentPoint);
double funcVal2 = m_objectFunction(&newPoint);
return (funcVal2 - funcVal1) / m_gradientStepSize;
}
std::vector<double> Gradient::computeGradientVector(){
std::vector<double> gradientVector = m_currentPoint;
for (int i = 0; i < m_nDimensions; i++) {
gradientVector[i] = computeGradient(i);
}
return gradientVector;
}
double Gradient::computeGradientMagnitude(std::vector<double> gradientVector){
double gradientMagnitude = 0.0;
for (int i = 0; i < m_nDimensions; i++) {
gradientMagnitude += gradientVector[i] * gradientVector[i];
}
return sqrt(gradientMagnitude);
}