From b09d8799500f34f169da3f5335b238e97e9ba25a Mon Sep 17 00:00:00 2001 From: Bertram Kopf <bertram@ep1.rub.de> Date: Fri, 20 Sep 2024 13:52:29 +0200 Subject: [PATCH] changed criterion for double equality --- FitParams/AbsParamHandler.cc | 21 ++++++++++++--------- MinFunctions/AdamMinimizer.cc | 8 ++++---- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/FitParams/AbsParamHandler.cc b/FitParams/AbsParamHandler.cc index 04262c89..687859d1 100644 --- a/FitParams/AbsParamHandler.cc +++ b/FitParams/AbsParamHandler.cc @@ -57,16 +57,19 @@ bool AbsParamHandler::checkRecalculation(std::shared_ptr<AbsPawianParameters> fi } bool AbsParamHandler::CheckDoubleEquality(double a, double b){ + //return std::fabs(a - b) <= std::numeric_limits<double>::epsilon(); + double max1ab = std::max( { 1.0, std::fabs(a) , std::fabs(b) } ) ; + return std::fabs(a - b) <= std::numeric_limits<double>::epsilon()*max1ab ; - float diff = fabs(a - b); - if (diff <= 10*DBL_EPSILON) - return true; + // float diff = fabs(a - b); + // if (diff <= 10*DBL_EPSILON) + // return true; - a = fabs(a); - b = fabs(b); - float largest = (b > a) ? b : a; + // a = fabs(a); + // b = fabs(b); + // float largest = (b > a) ? b : a; - if (diff <= largest * 2*DBL_EPSILON) - return true; - return false; + // if (diff <= largest * 2*DBL_EPSILON) + // return true; + // return false; } diff --git a/MinFunctions/AdamMinimizer.cc b/MinFunctions/AdamMinimizer.cc index 4f1b531e..aa093ae0 100644 --- a/MinFunctions/AdamMinimizer.cc +++ b/MinFunctions/AdamMinimizer.cc @@ -85,11 +85,11 @@ void AdamMinimizer::updateParameters(std::shared_ptr<AbsPawianParameters> pawian for(unsigned int i = 0; i < pawianParams->Params().size(); ++i){ if (pawianParams->IsFixed(i)) continue; - _s.at(i) = beta1 * _s.at(i) + (1.0 - beta1) * gradients.at(i); - _v.at(i) = beta2 * _v.at(i) + (1.0 - beta2) * gradients.at(i) * gradients.at(i); + s.at(i) = beta1 * s.at(i) + (1.0 - beta1) * gradients.at(i); + v.at(i) = beta2 * v.at(i) + (1.0 - beta2) * gradients.at(i) * gradients.at(i); - double s_hat = _s.at(i) / (1.0 - pow(beta1 , (t + 1))); - double v_hat = _v.at(i) / (1.0 - pow(beta2 , (t + 1))); + double s_hat = s.at(i) / (1.0 - pow(beta1 , (t + 1))); + double v_hat = v.at(i) / (1.0 - pow(beta2 , (t + 1))); double newVal = pawianParams->Value(i) - _learning_rate * s_hat / (std::sqrt(v_hat) + epsilon); if(pawianParams->HasLimits(i)){ -- GitLab