From e7cab8445c04f576be7330059314f1b1dbae09f4 Mon Sep 17 00:00:00 2001 From: mariadb-AndreyPiskunov Date: Fri, 9 Sep 2022 18:48:58 +0300 Subject: [PATCH] Fix the 0 count problem --- utils/regr/corr.cpp | 39 ++++++++++++++++++++++------------- utils/regr/covar_pop.cpp | 29 +++++++++++++++++--------- utils/regr/covar_samp.cpp | 29 +++++++++++++++++--------- utils/regr/regr_intercept.cpp | 34 +++++++++++++++++++----------- utils/regr/regr_r2.cpp | 39 ++++++++++++++++++++++------------- utils/regr/regr_slope.cpp | 34 +++++++++++++++++++----------- utils/regr/regr_sxx.cpp | 22 +++++++++++++------- utils/regr/regr_sxy.cpp | 29 +++++++++++++++++--------- utils/regr/regr_syy.cpp | 22 +++++++++++++------- 9 files changed, 181 insertions(+), 96 deletions(-) diff --git a/utils/regr/corr.cpp b/utils/regr/corr.cpp index 85576d1a6..2a50527f2 100644 --- a/utils/regr/corr.cpp +++ b/utils/regr/corr.cpp @@ -143,24 +143,35 @@ mcsv1_UDAF::ReturnCode corr::subEvaluate(mcsv1Context* context, const UserData* long double inCxy = inData->cxy; uint64_t resCnt = inCnt + outCnt; - long double deltax = outAvgx - inAvgx; - long double deltay = outAvgy - inAvgy; + if (resCnt == 0) + { + outData->avgx = 0; + outData->avgy = 0; + outData->varx = 0; + outData->vary = 0; + outData->cxy = 0; + outData->cnt = 0; + } + else + { + long double deltax = outAvgx - inAvgx; + long double deltay = outAvgy - inAvgy; - long double resAvgx = inAvgx + deltax * outCnt / resCnt; - long double resAvgy = inAvgy + deltay * outCnt / resCnt; + long double resAvgx = inAvgx + deltax * outCnt / resCnt; + long double resAvgy = inAvgy + deltay * outCnt / resCnt; - long double resVarx = outVarx + inVarx + deltax * deltax * inCnt * outCnt / resCnt; - long double resVary = outVary + inVary + deltay * deltay * inCnt * outCnt / resCnt; + long double resVarx = outVarx + inVarx + deltax * deltax * inCnt * outCnt / resCnt; + long double resVary = outVary + inVary + deltay * deltay * inCnt * outCnt / resCnt; - long double resCxy = outCxy + inCxy + deltax * deltay * inCnt * outCnt / resCnt; - - outData->avgx = resAvgx; - outData->avgy = resAvgy; - outData->varx = resVarx; - outData->vary = resVary; - outData->cxy = resCxy; - outData->cnt = resCnt; + long double resCxy = outCxy + inCxy + deltax * deltay * inCnt * outCnt / resCnt; + outData->avgx = resAvgx; + outData->avgy = resAvgy; + outData->varx = resVarx; + outData->vary = resVary; + outData->cxy = resCxy; + outData->cnt = resCnt; + } return mcsv1_UDAF::SUCCESS; } diff --git a/utils/regr/covar_pop.cpp b/utils/regr/covar_pop.cpp index d24951466..392edf0ed 100644 --- a/utils/regr/covar_pop.cpp +++ b/utils/regr/covar_pop.cpp @@ -123,17 +123,26 @@ mcsv1_UDAF::ReturnCode covar_pop::subEvaluate(mcsv1Context* context, const UserD long double inCxy = inData->cxy; uint64_t resCnt = inCnt + outCnt; - long double deltax = outAvgx - inAvgx; - long double deltay = outAvgy - inAvgy; - long double resAvgx = inAvgx + deltax * outCnt / resCnt; - long double resAvgy = inAvgy + deltay * outCnt / resCnt; - long double resCxy = outCxy + inCxy + deltax * deltay * inCnt * outCnt / resCnt; - - outData->avgx = resAvgx; - outData->avgy = resAvgy; - outData->cxy = resCxy; - outData->cnt = resCnt; + if (resCnt == 0) + { + outData->avgx = 0; + outData->avgy = 0; + outData->cxy = 0; + outData->cnt = 0; + } + else + { + long double deltax = outAvgx - inAvgx; + long double deltay = outAvgy - inAvgy; + long double resAvgx = inAvgx + deltax * outCnt / resCnt; + long double resAvgy = inAvgy + deltay * outCnt / resCnt; + long double resCxy = outCxy + inCxy + deltax * deltay * inCnt * outCnt / resCnt; + outData->avgx = resAvgx; + outData->avgy = resAvgy; + outData->cxy = resCxy; + outData->cnt = resCnt; + } return mcsv1_UDAF::SUCCESS; } diff --git a/utils/regr/covar_samp.cpp b/utils/regr/covar_samp.cpp index 4369dbca1..d079221e8 100644 --- a/utils/regr/covar_samp.cpp +++ b/utils/regr/covar_samp.cpp @@ -123,17 +123,26 @@ mcsv1_UDAF::ReturnCode covar_samp::subEvaluate(mcsv1Context* context, const User long double inCxy = inData->cxy; uint64_t resCnt = inCnt + outCnt; - long double deltax = outAvgx - inAvgx; - long double deltay = outAvgy - inAvgy; - long double resAvgx = inAvgx + deltax * outCnt / resCnt; - long double resAvgy = inAvgy + deltay * outCnt / resCnt; - long double resCxy = outCxy + inCxy + deltax * deltay * inCnt * outCnt / resCnt; - - outData->avgx = resAvgx; - outData->avgy = resAvgy; - outData->cxy = resCxy; - outData->cnt = resCnt; + if (resCnt == 0) + { + outData->avgx = 0; + outData->avgy = 0; + outData->cxy = 0; + outData->cnt = 0; + } + else + { + long double deltax = outAvgx - inAvgx; + long double deltay = outAvgy - inAvgy; + long double resAvgx = inAvgx + deltax * outCnt / resCnt; + long double resAvgy = inAvgy + deltay * outCnt / resCnt; + long double resCxy = outCxy + inCxy + deltax * deltay * inCnt * outCnt / resCnt; + outData->avgx = resAvgx; + outData->avgy = resAvgy; + outData->cxy = resCxy; + outData->cnt = resCnt; + } return mcsv1_UDAF::SUCCESS; } diff --git a/utils/regr/regr_intercept.cpp b/utils/regr/regr_intercept.cpp index 221d4f63d..559ccbd80 100644 --- a/utils/regr/regr_intercept.cpp +++ b/utils/regr/regr_intercept.cpp @@ -136,22 +136,32 @@ mcsv1_UDAF::ReturnCode regr_intercept::subEvaluate(mcsv1Context* context, const long double inCxy = inData->cxy; uint64_t resCnt = inCnt + outCnt; - long double deltax = outAvgx - inAvgx; - long double deltay = outAvgy - inAvgy; + if (resCnt == 0) + { + outData->avgx = 0; + outData->avgy = 0; + outData->cx = 0; + outData->cxy = 0; + outData->cnt = 0; + } + else + { + long double deltax = outAvgx - inAvgx; + long double deltay = outAvgy - inAvgy; - long double resAvgx = inAvgx + deltax * outCnt / resCnt; - long double resAvgy = inAvgy + deltay * outCnt / resCnt; + long double resAvgx = inAvgx + deltax * outCnt / resCnt; + long double resAvgy = inAvgy + deltay * outCnt / resCnt; - long double resCx = outCx + inCx + deltax * deltax * inCnt * outCnt / resCnt; + long double resCx = outCx + inCx + deltax * deltax * inCnt * outCnt / resCnt; - long double resCxy = outCxy + inCxy + deltax * deltay * inCnt * outCnt / resCnt; - - outData->avgx = resAvgx; - outData->avgy = resAvgy; - outData->cx = resCx; - outData->cxy = resCxy; - outData->cnt = resCnt; + long double resCxy = outCxy + inCxy + deltax * deltay * inCnt * outCnt / resCnt; + outData->avgx = resAvgx; + outData->avgy = resAvgy; + outData->cx = resCx; + outData->cxy = resCxy; + outData->cnt = resCnt; + } return mcsv1_UDAF::SUCCESS; } diff --git a/utils/regr/regr_r2.cpp b/utils/regr/regr_r2.cpp index 1a03f895d..71ec38ccf 100644 --- a/utils/regr/regr_r2.cpp +++ b/utils/regr/regr_r2.cpp @@ -142,24 +142,35 @@ mcsv1_UDAF::ReturnCode regr_r2::subEvaluate(mcsv1Context* context, const UserDat long double inCxy = inData->cxy; uint64_t resCnt = inCnt + outCnt; - long double deltax = outAvgx - inAvgx; - long double deltay = outAvgy - inAvgy; + if (resCnt == 0) + { + outData->avgx = 0; + outData->avgy = 0; + outData->varx = 0; + outData->vary = 0; + outData->cxy = 0; + outData->cnt = 0; + } + else + { + long double deltax = outAvgx - inAvgx; + long double deltay = outAvgy - inAvgy; - long double resAvgx = inAvgx + deltax * outCnt / resCnt; - long double resAvgy = inAvgy + deltay * outCnt / resCnt; + long double resAvgx = inAvgx + deltax * outCnt / resCnt; + long double resAvgy = inAvgy + deltay * outCnt / resCnt; - long double resVarx = outVarx + inVarx + deltax * deltax * inCnt * outCnt / resCnt; - long double resVary = outVary + inVary + deltay * deltay * inCnt * outCnt / resCnt; + long double resVarx = outVarx + inVarx + deltax * deltax * inCnt * outCnt / resCnt; + long double resVary = outVary + inVary + deltay * deltay * inCnt * outCnt / resCnt; - long double resCxy = outCxy + inCxy + deltax * deltay * inCnt * outCnt / resCnt; - - outData->avgx = resAvgx; - outData->avgy = resAvgy; - outData->varx = resVarx; - outData->vary = resVary; - outData->cxy = resCxy; - outData->cnt = resCnt; + long double resCxy = outCxy + inCxy + deltax * deltay * inCnt * outCnt / resCnt; + outData->avgx = resAvgx; + outData->avgy = resAvgy; + outData->varx = resVarx; + outData->vary = resVary; + outData->cxy = resCxy; + outData->cnt = resCnt; + } return mcsv1_UDAF::SUCCESS; } diff --git a/utils/regr/regr_slope.cpp b/utils/regr/regr_slope.cpp index 466bb8687..4575f39fa 100644 --- a/utils/regr/regr_slope.cpp +++ b/utils/regr/regr_slope.cpp @@ -134,22 +134,32 @@ mcsv1_UDAF::ReturnCode regr_slope::subEvaluate(mcsv1Context* context, const User long double inCxy = inData->cxy; uint64_t resCnt = inCnt + outCnt; - long double deltax = outAvgx - inAvgx; - long double deltay = outAvgy - inAvgy; + if (resCnt == 0) + { + outData->avgx = 0; + outData->avgy = 0; + outData->cx = 0; + outData->cxy = 0; + outData->cnt = 0; + } + else + { + long double deltax = outAvgx - inAvgx; + long double deltay = outAvgy - inAvgy; - long double resAvgx = inAvgx + deltax * outCnt / resCnt; - long double resAvgy = inAvgy + deltay * outCnt / resCnt; + long double resAvgx = inAvgx + deltax * outCnt / resCnt; + long double resAvgy = inAvgy + deltay * outCnt / resCnt; - long double resCx = outCx + inCx + deltax * deltax * inCnt * outCnt / resCnt; + long double resCx = outCx + inCx + deltax * deltax * inCnt * outCnt / resCnt; - long double resCxy = outCxy + inCxy + deltax * deltay * inCnt * outCnt / resCnt; - - outData->avgx = resAvgx; - outData->avgy = resAvgy; - outData->cx = resCx; - outData->cxy = resCxy; - outData->cnt = resCnt; + long double resCxy = outCxy + inCxy + deltax * deltay * inCnt * outCnt / resCnt; + outData->avgx = resAvgx; + outData->avgy = resAvgy; + outData->cx = resCx; + outData->cxy = resCxy; + outData->cnt = resCnt; + } return mcsv1_UDAF::SUCCESS; } diff --git a/utils/regr/regr_sxx.cpp b/utils/regr/regr_sxx.cpp index b70755652..0d6d3abe4 100644 --- a/utils/regr/regr_sxx.cpp +++ b/utils/regr/regr_sxx.cpp @@ -114,16 +114,24 @@ mcsv1_UDAF::ReturnCode regr_sxx::subEvaluate(mcsv1Context* context, const UserDa long double inCx = inData->cx; uint64_t resCnt = inCnt + outCnt; - long double deltax = outAvgx - inAvgx; + if (resCnt == 0) + { + outData->avgx = 0; + outData->cx = 0; + outData->cnt = 0; + } + else + { + long double deltax = outAvgx - inAvgx; - long double resAvgx = inAvgx + deltax * outCnt / resCnt; + long double resAvgx = inAvgx + deltax * outCnt / resCnt; - long double resCx = outCx + inCx + deltax * deltax * inCnt * outCnt / resCnt; - - outData->avgx = resAvgx; - outData->cx = resCx; - outData->cnt = resCnt; + long double resCx = outCx + inCx + deltax * deltax * inCnt * outCnt / resCnt; + outData->avgx = resAvgx; + outData->cx = resCx; + outData->cnt = resCnt; + } return mcsv1_UDAF::SUCCESS; } diff --git a/utils/regr/regr_sxy.cpp b/utils/regr/regr_sxy.cpp index 6b7cf2c2e..607e78d53 100644 --- a/utils/regr/regr_sxy.cpp +++ b/utils/regr/regr_sxy.cpp @@ -121,17 +121,26 @@ mcsv1_UDAF::ReturnCode regr_sxy::subEvaluate(mcsv1Context* context, const UserDa long double inCxy = inData->cxy; uint64_t resCnt = inCnt + outCnt; - long double deltax = outAvgx - inAvgx; - long double deltay = outAvgy - inAvgy; - long double resAvgx = inAvgx + deltax * outCnt / resCnt; - long double resAvgy = inAvgy + deltay * outCnt / resCnt; - long double resCxy = outCxy + inCxy + deltax * deltay * inCnt * outCnt / resCnt; - - outData->avgx = resAvgx; - outData->avgy = resAvgy; - outData->cxy = resCxy; - outData->cnt = resCnt; + if (resCnt == 0) + { + outData->avgx = 0; + outData->avgy = 0; + outData->cxy = 0; + outData->cnt = 0; + } + else + { + long double deltax = outAvgx - inAvgx; + long double deltay = outAvgy - inAvgy; + long double resAvgx = inAvgx + deltax * outCnt / resCnt; + long double resAvgy = inAvgy + deltay * outCnt / resCnt; + long double resCxy = outCxy + inCxy + deltax * deltay * inCnt * outCnt / resCnt; + outData->avgx = resAvgx; + outData->avgy = resAvgy; + outData->cxy = resCxy; + outData->cnt = resCnt; + } return mcsv1_UDAF::SUCCESS; } diff --git a/utils/regr/regr_syy.cpp b/utils/regr/regr_syy.cpp index 350c8605b..78113a485 100644 --- a/utils/regr/regr_syy.cpp +++ b/utils/regr/regr_syy.cpp @@ -114,16 +114,24 @@ mcsv1_UDAF::ReturnCode regr_syy::subEvaluate(mcsv1Context* context, const UserDa long double inCy = inData->cy; uint64_t resCnt = inCnt + outCnt; - long double deltay = outAvgy - inAvgy; + if (resCnt == 0) + { + outData->avgy = 0; + outData->cy = 0; + outData->cnt = 0; + } + else + { + long double deltay = outAvgy - inAvgy; - long double resAvgy = inAvgy + deltay * outCnt / resCnt; + long double resAvgy = inAvgy + deltay * outCnt / resCnt; - long double resCy = outCy + inCy + deltay * deltay * inCnt * outCnt / resCnt; - - outData->avgy = resAvgy; - outData->cy = resCy; - outData->cnt = resCnt; + long double resCy = outCy + inCy + deltay * deltay * inCnt * outCnt / resCnt; + outData->avgy = resAvgy; + outData->cy = resCy; + outData->cnt = resCnt; + } return mcsv1_UDAF::SUCCESS; }