| 370 | |
| 371 | namespace { |
| 372 | inline double ArgMinPrecise(std::function<double(double)> func, double left, double right) { |
| 373 | const size_t intervalsCount = 20; |
| 374 | double points[intervalsCount + 1]; |
| 375 | double values[intervalsCount + 1]; |
| 376 | while (right > left + 1e-5) { |
| 377 | for (size_t pointNumber = 0; pointNumber <= intervalsCount; ++pointNumber) { |
| 378 | points[pointNumber] = left + pointNumber * (right - left) / intervalsCount; |
| 379 | values[pointNumber] = func(points[pointNumber]); |
| 380 | } |
| 381 | size_t bestPointNumber = MinElement(values, values + intervalsCount + 1) - values; |
| 382 | if (bestPointNumber == 0) { |
| 383 | right = points[bestPointNumber + 1]; |
| 384 | continue; |
| 385 | } |
| 386 | if (bestPointNumber == intervalsCount) { |
| 387 | left = points[bestPointNumber - 1]; |
| 388 | continue; |
| 389 | } |
| 390 | right = points[bestPointNumber + 1]; |
| 391 | left = points[bestPointNumber - 1]; |
| 392 | } |
| 393 | return func(left) < func(right) ? left : right; |
| 394 | } |
| 395 | } |
| 396 | |
| 397 | TFeaturesTransformer TFeaturesTransformerLearner::Solve(const size_t iterationsCount /* = 100 */) { |
no test coverage detected