sc/source/core/opencl/op_statistical.cxx | 523 +---------------------- sc/source/core/opencl/op_statistical.hxx | 7 sc/source/core/opencl/op_statistical_helpers.hxx | 15 3 files changed, 53 insertions(+), 492 deletions(-)
New commits: commit 68ae0798078cbc9daa8ea951e0f5e7de55042f70 Author: Luboš Luňák <l.lu...@collabora.com> AuthorDate: Tue Sep 20 09:57:41 2022 +0200 Commit: Luboš Luňák <l.lu...@collabora.com> CommitDate: Tue Sep 20 17:53:47 2022 +0200 reduce opencl copy&paste (gaussinv) Change-Id: I44e5c74c903bab46a54b5b855f2665d924ac91fb Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140225 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lu...@collabora.com> diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index f2d32c7eefa1..459057f80e8f 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -1089,6 +1089,13 @@ void OpPhi::GenSlidingWindowFunction( ss << "}\n"; } +void OpNorminv::BinInlineFun(std::set<std::string>& decls, + std::set<std::string>& funs) +{ + decls.insert(gaussinvDecl); + funs.insert(gaussinv); +} + void OpNorminv::GenSlidingWindowFunction( outputstream &ss,const std::string &sSymName, SubArguments &vSubArguments) @@ -1096,168 +1103,25 @@ void OpNorminv::GenSlidingWindowFunction( CHECK_PARAMETER_COUNT( 3, 3 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; - ss <<" double q,t,z;\n"; + ss << " int gid0=get_global_id(0);\n"; GenerateArg( "x", 0, vSubArguments, ss ); GenerateArg( "mue", 1, vSubArguments, ss ); GenerateArg( "sigma", 2, vSubArguments, ss ); - ss <<" q = x -0.5;\n"; - ss <<" if(fabs(q)<=.425)\n"; - ss <<" {\n"; - ss <<" t=0.180625-pow(q,2);\n"; - ss <<" z=\n" - "q*\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "t*2509.0809287301226727"; - ss <<"+33430.575583588128105\n" - ")\n" - "*t+67265.770927008700853\n" - ")\n" - "*t+45921.953931549871457\n" - ")\n" - "*t+13731.693765509461125\n" - ")\n" - "*t+1971.5909503065514427\n" - ")\n" - "*t+133.14166789178437745\n" - ")\n" - "*t+3.387132872796366608\n" - ")\n" - "/\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "t*5226.495278852854561"; - ss <<"+28729.085735721942674\n" - ")\n" - "*t+39307.89580009271061\n" - ")\n" - "*t+21213.794301586595867\n" - ")\n" - "*t+5394.1960214247511077\n" - ")\n" - "*t+687.1870074920579083\n" - ")\n" - "*t+42.313330701600911252\n" - ")\n" - "*t+1.0\n" - ");\n"; - ss <<"}\nelse\n{\n"; - ss <<" if(q>0)\nt=1-x;\n"; - ss <<"else\nt=x;\n"; - ss <<"t=sqrt(-log(t));\n"; - ss <<"if(t<=5.0)\n{\n"; - ss <<"t+=-1.6;\n"; - ss <<"z=\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "t*7.7454501427834140764e-4"; - ss <<"+0.0227238449892691845833\n" - ")\n" - "*t+0.24178072517745061177\n" - ")\n" - "*t+1.27045825245236838258\n" - ")\n" - "*t+3.64784832476320460504\n" - ")\n" - "*t+5.7694972214606914055\n" - ")\n" - "*t+4.6303378461565452959\n" - ")\n" - "*t+1.42343711074968357734\n" - ")\n" - "/\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "t*1.05075007164441684324e-9"; - ss <<"+5.475938084995344946e-4\n" - ")\n" - "*t+0.0151986665636164571966\n" - ")\n" - "*t+0.14810397642748007459\n" - ")\n" - "*t+0.68976733498510000455\n" - ")\n" - "*t+1.6763848301838038494\n" - ")\n" - "*t+2.05319162663775882187\n" - ")\n" - "*t+1.0\n" - ");\n}\n"; - ss <<"else\n{\n"; - ss <<"t+=-5.0;\n"; - ss <<"z=\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "t*2.01033439929228813265e-7"; - ss<<"+2.71155556874348757815e-5\n" - ")\n" - "*t+0.0012426609473880784386\n" - ")\n" - "*t+0.026532189526576123093\n" - ")\n" - "*t+0.29656057182850489123\n" - ")\n" - "*t+1.7848265399172913358\n" - ")\n" - "*t+5.4637849111641143699\n" - ")\n" - "*t+6.6579046435011037772\n" - ")\n" - "/\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "t*2.04426310338993978564e-15" - "+1.4215117583164458887e-7\n" - ")\n" - "*t+1.8463183175100546818e-5\n" - ")\n" - "*t+7.868691311456132591e-4\n" - ")\n" - "*t+0.0148753612908506148525\n" - ")\n" - "*t+0.13692988092273580531\n" - ")\n" - "*t+0.59983220655588793769\n" - ")\n" - "*t+1.0\n" - ");\n"; - ss<<"}\n"; - ss << "z = q < 0.0 ? (-1)*z : z;\n"; - ss<<"}\n"; - ss<<"double tmp = z*sigma + mue;\n"; - ss<<"return tmp;\n"; - ss<<"}\n"; + ss << " if (sigma <= 0.0 || x < 0.0 || x > 1.0)\n"; + ss << " return CreateDoubleError(IllegalArgument);\n"; + ss << " else if (x == 0.0 || x == 1.0)\n"; + ss << " return CreateDoubleError(NoValue);\n"; + ss << " return gaussinv(x)*sigma + mue;\n"; + ss << "}\n"; } + +void OpNormsinv::BinInlineFun(std::set<std::string>& decls, + std::set<std::string>& funs) +{ + decls.insert(gaussinvDecl); + funs.insert(gaussinv); +} + void OpNormsinv:: GenSlidingWindowFunction (outputstream &ss,const std::string &sSymName, SubArguments &vSubArguments) @@ -1265,168 +1129,16 @@ void OpNormsinv:: GenSlidingWindowFunction CHECK_PARAMETER_COUNT( 1, 1 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; - ss << " double q,t,z;\n"; ss << " int gid0=get_global_id(0);\n"; GenerateArg( "x", 0, vSubArguments, ss ); - ss <<" q = x -0.5;\n"; - ss <<" if(fabs(q)<=.425)\n"; - ss <<" {\n"; - ss <<" t=0.180625-pow(q,2);\n"; - ss <<" z=\n" - "q*\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "t*2509.0809287301226727"; - ss <<"+33430.575583588128105\n" - ")\n" - "*t+67265.770927008700853\n" - ")\n" - "*t+45921.953931549871457\n" - ")\n" - "*t+13731.693765509461125\n" - ")\n" - "*t+1971.5909503065514427\n" - ")\n" - "*t+133.14166789178437745\n" - ")\n" - "*t+3.387132872796366608\n" - ")\n" - "/\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "t*5226.495278852854561"; - ss <<"+28729.085735721942674\n" - ")\n" - "*t+39307.89580009271061\n" - ")\n" - "*t+21213.794301586595867\n" - ")\n" - "*t+5394.1960214247511077\n" - ")\n" - "*t+687.1870074920579083\n" - ")\n" - "*t+42.313330701600911252\n" - ")\n" - "*t+1.0\n" - ");\n"; - ss <<"}\nelse\n{\n"; - ss <<" if(q>0)\nt=1-x;\n"; - ss <<"else\nt=x;\n"; - ss <<"t=sqrt(-log(t));\n"; - ss <<"if(t<=5.0)\n{\n"; - ss <<"t+=-1.6;\n"; - ss <<"z=\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "t*7.7454501427834140764e-4"; - ss <<"+0.0227238449892691845833\n" - ")\n" - "*t+0.24178072517745061177\n" - ")\n" - "*t+1.27045825245236838258\n" - ")\n" - "*t+3.64784832476320460504\n" - ")\n" - "*t+5.7694972214606914055\n" - ")\n" - "*t+4.6303378461565452959\n" - ")\n" - "*t+1.42343711074968357734\n" - ")\n" - "/\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "t*1.05075007164441684324e-9"; - ss <<"+5.475938084995344946e-4\n" - ")\n" - "*t+0.0151986665636164571966\n" - ")\n" - "*t+0.14810397642748007459\n" - ")\n" - "*t+0.68976733498510000455\n" - ")\n" - "*t+1.6763848301838038494\n" - ")\n" - "*t+2.05319162663775882187\n" - ")\n" - "*t+1.0\n" - ");\n}\n"; - ss <<"else\n{\n"; - ss <<"t+=-5.0;\n"; - ss <<"z=\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "t*2.01033439929228813265e-7"; - ss <<"+2.71155556874348757815e-5\n" - ")\n" - "*t+0.0012426609473880784386\n" - ")\n" - "*t+0.026532189526576123093\n" - ")\n" - "*t+0.29656057182850489123\n" - ")\n" - "*t+1.7848265399172913358\n" - ")\n" - "*t+5.4637849111641143699\n" - ")\n" - "*t+6.6579046435011037772\n" - ")\n" - "/\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "(\n" - "t*2.04426310338993978564e-15" - "+1.4215117583164458887e-7\n" - ")\n" - "*t+1.8463183175100546818e-5\n" - ")\n" - "*t+7.868691311456132591e-4\n" - ")\n" - "*t+0.0148753612908506148525\n" - ")\n" - "*t+0.13692988092273580531\n" - ")\n" - "*t+0.59983220655588793769\n" - ")\n" - "*t+1.0\n" - ");\n"; - ss <<"}\n"; - ss << "z = q < 0.0 ? (-1)*z : z;\n"; - ss <<"}\n"; - ss <<"if (isnan(z))\n"; - ss <<" return CreateDoubleError(NoValue);\n"; - ss <<"return z;\n"; - ss <<"}\n"; + ss << " if (x < 0.0 || x > 1.0)\n"; + ss << " return CreateDoubleError(IllegalArgument);\n"; + ss << " else if (x == 0.0 || x == 1.0)\n"; + ss << " return CreateDoubleError(NoValue);\n"; + ss << " return gaussinv(x);\n"; + ss << "}\n"; } + void OpMedian::GenSlidingWindowFunction( outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments) @@ -1526,6 +1238,13 @@ void OpKurt:: GenSlidingWindowFunction(outputstream &ss, ss << "}"; } +void OpLogInv::BinInlineFun(std::set<std::string>& decls, + std::set<std::string>& funs) +{ + decls.insert(gaussinvDecl); + funs.insert(gaussinv); +} + void OpLogInv:: GenSlidingWindowFunction(outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { @@ -1534,170 +1253,12 @@ void OpLogInv:: GenSlidingWindowFunction(outputstream &ss, ss << "{\n"; ss << " int gid0=get_global_id(0);\n"; ss << " double tmp;\n"; - GenerateArg( 0, vSubArguments, ss ); - GenerateArgWithDefault( "arg1", 1, 0, vSubArguments, ss ); - GenerateArgWithDefault( "arg2", 2, 1, vSubArguments, ss ); - ss<< " double q,t,z;\n"; - ss<< " q = arg0 -0.5;\n"; - ss<< " if(fabs(q)<=.425)\n"; - ss<< " {\n"; - ss<< " t=0.180625-pow(q, 2);\n"; - ss<< " z=\n" - " q*\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " t*2509.0809287301226727"; - ss<<"+33430.575583588128105\n" - " )\n" - " *t+67265.770927008700853\n" - " )\n" - " *t+45921.953931549871457\n" - " )\n" - " *t+13731.693765509461125\n" - " )\n" - " *t+1971.5909503065514427\n" - " )\n" - " *t+133.14166789178437745\n" - " )\n" - " *t+3.387132872796366608\n" - " )\n" - " /\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " t*5226.495278852854561"; - ss<<"+28729.085735721942674\n" - " )\n" - " *t+39307.89580009271061\n" - " )\n" - " *t+21213.794301586595867\n" - " )\n" - " *t+5394.1960214247511077\n" - " )\n" - " *t+687.1870074920579083\n" - " )\n" - " *t+42.313330701600911252\n" - " )\n" - " *t+1.0\n" - " );\n"; - ss<<" }\n"; - ss<<" else\n"; - ss<<" {\n"; - ss<<" t = q > 0 ? 1 - arg0 : arg0;\n"; - ss<<" t=sqrt(-log(t));\n"; - ss<<" if(t<=5.0)\n"; - ss<<" {\n"; - ss<<" t+=-1.6;\n"; - ss<<" z=\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " t*7.7454501427834140764e-4"; - ss<<"+0.0227238449892691845833\n" - " )\n" - " *t+0.24178072517745061177\n" - " )\n" - " *t+1.27045825245236838258\n" - " )\n" - " *t+3.64784832476320460504\n" - " )\n" - " *t+5.7694972214606914055\n" - " )\n" - " *t+4.6303378461565452959\n" - " )\n" - " *t+1.42343711074968357734\n" - " )\n" - " /\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " t*1.05075007164441684324e-9"; - ss<<"+5.475938084995344946e-4\n" - " )\n" - " *t+0.0151986665636164571966\n" - " )\n" - " *t+0.14810397642748007459\n" - " )\n" - " *t+0.68976733498510000455\n" - " )\n" - " *t+1.6763848301838038494\n" - " )\n" - " *t+2.05319162663775882187\n" - " )\n" - " *t+1.0\n" - " );\n"; - ss<<" }\n"; - ss<<" else\n"; - ss<<" {\n"; - ss<<" t+=-5.0;\n"; - ss<<" z=\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " t*2.01033439929228813265e-7"; - ss<<"+2.71155556874348757815e-5\n" - " )\n" - " *t+0.0012426609473880784386\n" - " )\n" - " *t+0.026532189526576123093\n" - " )\n" - " *t+0.29656057182850489123\n" - " )\n" - " *t+1.7848265399172913358\n" - " )\n" - " *t+5.4637849111641143699\n" - " )\n" - " *t+6.6579046435011037772\n" - " )\n" - " /\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " (\n" - " t*2.04426310338993978564e-15" - " +1.4215117583164458887e-7\n" - " )\n" - " *t+1.8463183175100546818e-5\n" - " )\n" - " *t+7.868691311456132591e-4\n" - " )\n" - " *t+0.0148753612908506148525\n" - " )\n" - " *t+0.13692988092273580531\n" - " )\n" - " *t+0.59983220655588793769\n" - " )\n" - " *t+1.0\n" - " );\n"; - ss << " }\n"; - ss << " z = q < 0.0 ? (-1)*z : z;\n"; - ss << " }\n"; - ss << " tmp = exp(arg1+arg2*z);\n"; - ss << " return tmp;\n"; + GenerateArg( "x", 0, vSubArguments, ss ); + GenerateArgWithDefault( "mue", 1, 0, vSubArguments, ss ); + GenerateArgWithDefault( "sigma", 2, 1, vSubArguments, ss ); + ss << " if ( sigma <= 0.0 || x <= 0.0 || x >= 1.0 )\n"; + ss << " return CreateDoubleError(IllegalArgument);\n"; + ss << " return exp(mue+sigma*gaussinv(x));\n"; ss << "}\n"; } diff --git a/sc/source/core/opencl/op_statistical.hxx b/sc/source/core/opencl/op_statistical.hxx index 64089b54f524..d2b685976fa8 100644 --- a/sc/source/core/opencl/op_statistical.hxx +++ b/sc/source/core/opencl/op_statistical.hxx @@ -214,13 +214,15 @@ class OpNorminv:public Normal{ public: virtual void GenSlidingWindowFunction(outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments) override; - virtual std::string BinFuncName() const override { return "OpNorminv"; } + virtual std::string BinFuncName() const override { return "OpNorminv"; } + virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>&) override; }; class OpNormsinv:public Normal{ public: virtual void GenSlidingWindowFunction(outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments) override; - virtual std::string BinFuncName() const override { return "OpNormsinv"; } + virtual std::string BinFuncName() const override { return "OpNormsinv"; } + virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>&) override; }; class OpPhi:public Normal{ public: @@ -268,6 +270,7 @@ public: virtual void GenSlidingWindowFunction(outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments) override; virtual std::string BinFuncName() const override { return "LogInv"; } + virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>&) override; }; class OpCritBinom: public Normal { diff --git a/sc/source/core/opencl/op_statistical_helpers.hxx b/sc/source/core/opencl/op_statistical_helpers.hxx index da86725296fe..5fb2f787eefb 100644 --- a/sc/source/core/opencl/op_statistical_helpers.hxx +++ b/sc/source/core/opencl/op_statistical_helpers.hxx @@ -745,7 +745,7 @@ const char gaussinv[] = " )\n" " *t+3.387132872796366608\n" " )\n" -" *pow\n" +" /\n" " (\n" " (\n" " (\n" @@ -765,8 +765,7 @@ const char gaussinv[] = " )\n" " *t+42.313330701600911252\n" " )\n" -" *t+1.0\n" -" , -1.0);\n" +" *t+1.0);\n" " }\n" " else\n" " {\n" @@ -798,7 +797,7 @@ const char gaussinv[] = " )\n" " *t+1.42343711074968357734\n" " )\n" -" *pow\n" +" /\n" " (\n" " (\n" " (\n" @@ -818,8 +817,7 @@ const char gaussinv[] = " )\n" " *t+2.05319162663775882187\n" " )\n" -" *t+1.0\n" -" , -1.0);\n" +" *t+1.0);\n" " }\n" " else\n" " {\n" @@ -846,7 +844,7 @@ const char gaussinv[] = " )\n" " *t+6.6579046435011037772\n" " )\n" -" *pow\n" +" /\n" " (\n" " (\n" " (\n" @@ -866,8 +864,7 @@ const char gaussinv[] = " )\n" " *t+0.59983220655588793769\n" " )\n" -" *t+1.0\n" -" , -1.0);\n" +" *t+1.0);\n" " }\n" " if(q<0.0) z=-z;\n" " }\n"