| 1 |
|
#include "NLModel.hpp" |
| 2 |
+ |
#include <math.h> |
| 3 |
|
|
| 4 |
|
/** |
| 5 |
|
* calculate gradient using backward finite difference |
| 22 |
|
//tempX[i] = x[i] + hi; |
| 23 |
|
tempX[i] -= hi; |
| 24 |
|
|
| 25 |
< |
fminus = (*objfunc)(tempX); |
| 25 |
> |
fminus = calcF(tempX); |
| 26 |
|
|
| 27 |
|
partialGrad[i] = (fx - fminus) / hi; |
| 28 |
|
|
| 37 |
|
tempX[i] -= hi; |
| 38 |
|
} |
| 39 |
|
|
| 40 |
< |
fminus = (*objfunc)(tempX); |
| 40 |
> |
fminus = calcF(tempX); |
| 41 |
|
|
| 42 |
|
if(procMappingArray[i] == myRank){ |
| 43 |
|
partialGrad[i] = (fx - fminus) / hi; |
| 73 |
|
//tempX[i] = x[i] + hi; |
| 74 |
|
tempX[i] += hi; |
| 75 |
|
|
| 76 |
< |
fplus = (*objfunc)(tempX); |
| 76 |
> |
fplus = calcF(tempX); |
| 77 |
|
|
| 78 |
|
partialGrad[i] = (fplus - fx) / hi; |
| 79 |
|
|
| 89 |
|
tempX[i] += hi; |
| 90 |
|
} |
| 91 |
|
|
| 92 |
< |
fminus = (*objfunc)(tempX); |
| 92 |
> |
fminus = calcF(tempX); |
| 93 |
|
|
| 94 |
|
if(procMappingArray[i] == myRank){ |
| 95 |
|
partialGrad[i] = (fx - fminus) / hi; |
| 125 |
|
//tempX[i] = x[i] + hi |
| 126 |
|
tempX[i] += hi; |
| 127 |
|
|
| 128 |
< |
fplus = (*objfunc)(tempX); |
| 128 |
> |
fplus = calcF(tempX); |
| 129 |
|
|
| 130 |
|
//tempX[i] = x[i] -hi |
| 131 |
|
tempX[i] -= 2*hi; |
| 132 |
< |
fminus = (*objfunc)(tempX); |
| 132 |
> |
fminus = calcF(tempX); |
| 133 |
|
|
| 134 |
|
partialGrad[i] = (fplus + fminus) / (2*hi); |
| 135 |
|
|
| 145 |
|
tempX[i] += hi; |
| 146 |
|
} |
| 147 |
|
|
| 148 |
< |
fplus = (*objfunc)(tempX); |
| 148 |
> |
fplus = calcF(tempX); |
| 149 |
|
|
| 150 |
|
if(procMappingArray[i] == myRank){ |
| 151 |
|
partialGrad[i] = (fx - fminus) / hi; |
| 179 |
|
vector<double> tempX; |
| 180 |
|
vector<double> fi(ndim); |
| 181 |
|
vector<double> hi; |
| 182 |
< |
double fij; |
| 182 |
> |
double fii, fij; |
| 183 |
|
|
| 184 |
|
tempX = x; |
| 185 |
|
|
| 194 |
|
|
| 195 |
|
fi[i] = calcF(tempX); |
| 196 |
|
|
| 197 |
< |
tempX[i] -= hi; |
| 197 |
> |
tempX[i] -= hi[i]; |
| 198 |
|
|
| 199 |
|
#else |
| 200 |
|
|
| 222 |
|
|
| 223 |
|
fii = calcF(tempX); |
| 224 |
|
|
| 225 |
< |
H(i,j) = ((fx - fi[i]) + (fii - fi[i])) / (hi[i]*hi[i]); |
| 225 |
> |
H(i, i) = ((fx - fi[i]) + (fii - fi[i])) / (hi[i]*hi[i]); |
| 226 |
|
|
| 227 |
|
tempX[i] -= hi[i]; |
| 228 |
|
|
| 232 |
|
|
| 233 |
|
fij = calcF(tempX); |
| 234 |
|
|
| 235 |
< |
H(i,j) = ((f - fi[i]) + (fij - fi[j])) / (hi[i]*hi[j]); |
| 235 |
> |
H(i,j) = ((fx - fi[i]) + (fij - fi[j])) / (hi[i]*hi[j]); |
| 236 |
|
|
| 237 |
|
tempX[j] -= hi[j]; |
| 238 |
|
} |
| 249 |
|
|
| 250 |
|
fii = calcF(tempX); |
| 251 |
|
|
| 252 |
< |
H(i,j) = ((fx - fi[i]) + (fii - fi[i])) / (hi[i]*hi[i]); |
| 252 |
> |
H(i,i) = ((fx - fi[i]) + (fii - fi[i])) / (hi[i]*hi[i]); |
| 253 |
|
|
| 254 |
|
if(procMappingArray[i] == myRank){ |
| 255 |
|
tempX[i] -= hi[i]; |
| 262 |
|
} |
| 263 |
|
|
| 264 |
|
fij = calcF(tempX); |
| 265 |
< |
H(i,j) = ((f - fi[i]) + (fij - fi[j])) / (hi[i]*hi[j]); |
| 265 |
> |
H(i,j) = ((fx - fi[i]) + (fij - fi[j])) / (hi[i]*hi[j]); |
| 266 |
|
|
| 267 |
|
if(procMappingArray[j] == myRank){ |
| 268 |
|
tempX[j] -= hi[j]; |