54 MnPrint print(
"Numerical2PGradientCalculator");
58 double fcnmin = par.
Fval();
66 double dfmin = 8. * eps2 * (std::fabs(fcnmin) +
fFcn.Up());
67 double vrysml = 8. * eps * eps;
73 unsigned int n = (par.
Vec()).size();
74 unsigned int ncycle =
fStrategy.GradientNCycles();
80 print.
Debug(
"Calculating gradient around function value", fcnmin,
"\n\t at point", par.
Vec());
93 for (
unsigned int i = startElementIndex; i < endElementIndex; i++) {
99#pragma omp parallel for if (fDoParallelOMP)
104 for (
int i = 0; i <
int(
n); i++) {
115 double epspri = eps2 + std::fabs(grd(i) * eps2);
117 for (
unsigned int j = 0; j < ncycle; j++) {
118 double optstp = std::sqrt(dfmin / (std::fabs(g2(i)) + epspri));
119 double step = std::max(optstp, std::fabs(0.1 * gstep(i)));
125 double stpmax = 10. * std::fabs(gstep(i));
129 double stpmin = std::max(vrysml, 8. * std::fabs(eps2 *
x(i)));
134 if (std::fabs((step - stepb4) / step) <
fStrategy.GradientStepTolerance()) {
144 double fs1 = mfcnCaller(
x);
146 double fs2 = mfcnCaller(
x);
149 double grdb4 = grd(i);
150 grd(i) = 0.5 * (fs1 - fs2) / step;
151 g2(i) = (fs1 + fs2 - 2. * fcnmin) / step / step;
159 MnPrint printtl(
"Numerical2PGradientCalculator[OpenMP]");
161 if (i == 0 && j == 0) {
163 printtl.
Trace([&](std::ostream &os) {
165 print.
Trace([&](std::ostream &os) {
167 os << std::setw(10) <<
"parameter" << std::setw(6) <<
"cycle" << std::setw(15) <<
"x" << std::setw(15)
168 <<
"step" << std::setw(15) <<
"f1" << std::setw(15) <<
"f2" << std::setw(15) <<
"grd"
169 << std::setw(15) <<
"g2" << std::endl;
173 printtl.
Trace([&](std::ostream &os) {
175 print.
Trace([&](std::ostream &os) {
177 const int pr = os.precision(13);
179 os << std::setw(10) << trafo.
Name(iext) << std::setw(5) << j <<
" " <<
x(i) <<
" " << step <<
" "
180 << fs1 <<
" " << fs2 <<
" " << grd(i) <<
" " << g2(i) << std::endl;
185 if (std::fabs(grdb4 - grd(i)) / (std::fabs(grd(i)) + dfmin / step) <
fStrategy.GradientTolerance()) {
206 print.
Debug([&](std::ostream &os) {
207 const int pr = os.precision(13);
209 os << std::setw(14) <<
"Parameter" << std::setw(14) <<
"Gradient" << std::setw(14) <<
"g2 " << std::setw(14)
210 <<
"step" << std::endl;
211 for (
int i = 0; i <
int(
n); i++) {
213 os << std::setw(14) << trafo.
Name(iext) <<
" " << grd(i) <<
" " << g2(i) <<
" " << gstep(i) << std::endl;