diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2022-09-19 17:43:14 +0200 |
---|---|---|
committer | Luboš Luňák <l.lunak@collabora.com> | 2022-09-20 08:44:16 +0200 |
commit | 2adc8a32ff8c36b556ca947afa46ea45e0c9769d (patch) | |
tree | a2f69fe2a47cbb82f40b3ef38408d0365d440c34 /sc | |
parent | c443a02ec9db419527566b6f80f413c45dea3be5 (diff) |
reduce opencl copy&paste and fix in op_statistical.cxx
So far functions using svDoubleVectorRef are excluded.
Change-Id: Ie8a72d7f72de34c422b23bcc526ac66f6b170b10
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140186
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/opencl/op_statistical.cxx | 1243 |
1 files changed, 125 insertions, 1118 deletions
diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index 49d26fe5bd4c..cdbfe8b10679 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -961,123 +961,17 @@ void OpTDist::BinInlineFun(std::set<std::string>& decls, void OpTDist::GenSlidingWindowFunction(outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { + CHECK_PARAMETER_COUNT( 3, 3 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; ss << " int gid0 = get_global_id(0);\n"; - ss << " double x = 0.0;\n"; - ss << " double fDF = 0.0;\n"; - ss << " double fFlag = 0.0;\n"; - if(vSubArguments.size() != 3) - { - ss << " return DBL_MAX;\n}\n"; - return ; - } - FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); - assert(tmpCur0); - if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode()) - { - if(tmpCur0->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken*tmpCurDVR0 = - static_cast<const formula::SingleVectorRefToken *>(tmpCur0); - ss << " if(gid0 < "; - ss << tmpCurDVR0->GetArrayLength() << ")\n"; - ss << " {\n"; - ss << " x = "; - ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; - ss << " if(isnan(x))\n"; - ss << " x = 0.0;\n"; - ss << " }\n"; - } - else if(tmpCur0->GetType() == formula::svDouble) - { - ss << " x = " << tmpCur0->GetDouble() << ";\n"; - } - else - { - ss << " return DBL_MAX;\n}\n"; - return ; - } - } - else - { - ss << " x = "; - ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; - } - FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); - assert(tmpCur1); - if(ocPush == vSubArguments[1]->GetFormulaToken()->GetOpCode()) - { - if(tmpCur1->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken*tmpCurDVR1 = - static_cast<const formula::SingleVectorRefToken *>(tmpCur1); - ss << " if(gid0 < "; - ss << tmpCurDVR1->GetArrayLength() << ")\n"; - ss << " {\n"; - ss << " fDF = "; - ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; - ss << " if(isnan(fDF))\n"; - ss << " fDF = 0.0;\n"; - ss << " else\n"; - ss << " fDF = floor(fDF);\n"; - ss << " }\n"; - } - else if(tmpCur1->GetType() == formula::svDouble) - { - ss << " fDF = floor(convert_double("; - ss << tmpCur1->GetDouble() << "));\n"; - } - else - { - ss << " return DBL_MAX;\n}\n"; - return ; - } - } - else - { - ss << " fDF = floor("; - ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ");\n"; - } - - FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken(); - assert(tmpCur2); - if(ocPush == vSubArguments[2]->GetFormulaToken()->GetOpCode()) - { - if(tmpCur2->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken*tmpCurDVR2 = - static_cast<const formula::SingleVectorRefToken *>(tmpCur2); - ss << " if(gid0 < "; - ss << tmpCurDVR2->GetArrayLength() << ")\n"; - ss << " {\n"; - ss << " fFlag = "; - ss << vSubArguments[2]->GenSlidingWindowDeclRef() << ";\n"; - ss << " if(isnan(fFlag))\n"; - ss << " fFlag = 0.0;\n"; - ss << " else\n"; - ss << " fFlag = floor(fFlag);\n"; - ss << " }\n"; - - } - else if(tmpCur2->GetType() == formula::svDouble) - { - ss << " fFlag = floor(convert_double("; - ss << tmpCur2->GetDouble() << "));\n"; - } - else - { - ss << " return DBL_MAX;\n}\n"; - return ; - } - } - else - { - ss << " fFlag = floor("; - ss << vSubArguments[2]->GenSlidingWindowDeclRef() << ");\n"; - } + GenerateArg( "x", 0, vSubArguments, ss ); + GenerateArg( "fDF", 1, vSubArguments, ss ); + GenerateArg( "fFlag", 2, vSubArguments, ss ); + ss << " fDF = floor( fDF );\n"; + ss << " fFlag = floor( fFlag );\n"; ss << " if(fDF < 1.0 || x < 0.0 || (fFlag != 1.0 && fFlag != 2.0))\n"; - ss << " return DBL_MAX;\n"; + ss << " return CreateDoubleError(IllegalArgument);\n"; ss << " double R = GetTDist(x, fDF);\n"; ss << " if (fFlag == 1.0)\n"; ss << " return R;\n"; @@ -1085,54 +979,20 @@ void OpTDist::GenSlidingWindowFunction(outputstream &ss, ss << " return 2.0 * R;\n"; ss << "}\n"; } + void OpExponDist::GenSlidingWindowFunction(outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { + CHECK_PARAMETER_COUNT( 3, 3 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; - ss << " double tmp = 0,tmp0=0,tmp1=0,tmp2=0;\n"; + ss << " double tmp = 0;\n"; ss << " int gid0 = get_global_id(0);\n"; - ss << " double rx,rlambda,rkum;\n"; - ss <<"\n"; - for (size_t i = 0; i < vSubArguments.size(); i++) - { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); - assert(pCur); - if (pCur->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken* pSVR = - static_cast< const formula::SingleVectorRefToken* >(pCur); - ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; - } - else if (pCur->GetType() == formula::svDouble) - { - ss << "{\n"; - } - - if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) - { - ss << " if (isnan("; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << "))\n"; - ss << " tmp"<<i<<"= 0;\n"; - ss << " else\n"; - ss << " tmp"<<i<<"=\n"; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << ";\n}\n"; - } - else - { - ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; - } - } - ss << " rx = tmp0;\n"; - ss << " rlambda = tmp1;\n"; - ss << " rkum = tmp2;\n"; + GenerateArg( "rx", 0, vSubArguments, ss ); + GenerateArg( "rlambda", 1, vSubArguments, ss ); + GenerateArg( "rkum", 2, vSubArguments, ss ); ss <<" if(rlambda <= 0.0)\n"; - ss <<" {\n"; - ss <<" tmp = -DBL_MAX;\n"; - ss <<" }\n"; + ss <<" return CreateDoubleError(IllegalArgument);\n"; ss <<" else if(rkum == 0)\n"; ss <<" {\n"; ss <<" if(rx >= 0)\n"; @@ -1168,52 +1028,19 @@ void OpFdist::BinInlineFun(std::set<std::string>& decls, void OpFdist::GenSlidingWindowFunction(outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { + CHECK_PARAMETER_COUNT( 3, 3 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; - ss << " double tmp = 0,tmp0=0,tmp1=0,tmp2=0;\n"; + ss << " double tmp = 0;\n"; ss << " int gid0 = get_global_id(0);\n"; - ss << " double rF1,rF2,rX;\n"; - ss <<"\n"; - for (size_t i = 0; i < vSubArguments.size(); i++) - { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); - assert(pCur); - if (pCur->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken* pSVR = - static_cast< const formula::SingleVectorRefToken* >(pCur); - ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; - } - else if (pCur->GetType() == formula::svDouble) - { - ss << "{\n"; - } - - if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) - { - ss << " if (isnan("; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << "))\n"; - ss << " tmp"<<i<<"= 0;\n"; - ss << " else\n"; - ss << " tmp"<<i<<"=\n"; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << ";\n}\n"; - } - else - { - ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; - } - } - ss << " rX = tmp0;\n"; - ss << " rF1 = floor(tmp1);\n"; - ss << " rF2 = floor(tmp2);\n"; + GenerateArg( "rX", 0, vSubArguments, ss ); + GenerateArg( "rF1", 1, vSubArguments, ss ); + GenerateArg( "rF2", 2, vSubArguments, ss ); + ss <<" rF1 = floor(rF1);\n"; + ss <<" rF2 = floor(rF2);\n"; ss <<" if (rX < 0.0 || rF1 < 1.0 || rF2 < 1.0 || rF1 >= 1.0E10 ||"; ss <<"rF2 >= 1.0E10)\n"; - ss <<" {\n"; - ss <<" tmp = -DBL_MAX;\n"; - ss <<" }\n"; + ss <<" return CreateDoubleError(IllegalArgument);\n"; ss <<" tmp = GetFDist(rX, rF1, rF2);\n"; ss <<" return tmp;\n"; ss <<"}"; @@ -1222,116 +1049,17 @@ void OpFdist::GenSlidingWindowFunction(outputstream &ss, void OpStandard::GenSlidingWindowFunction(outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { + CHECK_PARAMETER_COUNT( 3, 3 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; ss << " int gid0 = get_global_id(0);\n"; - ss << " double x = 0.0;\n"; - ss << " double mu = 0.0;\n"; - ss << " double sigma = 0.0;\n"; - if(vSubArguments.size() != 3) - { - ss << " return DBL_MAX;\n}\n"; - return ; - } - FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); - assert(tmpCur0); - if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode()) - { - if(tmpCur0->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken*tmpCurSVR0 = - static_cast<const formula::SingleVectorRefToken *>(tmpCur0); - ss << " if (gid0 < " << tmpCurSVR0->GetArrayLength() << ")\n"; - ss << " {\n"; - ss << " x = "; - ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; - ss << " if (isnan(x))\n"; - ss << " x = 0.0;\n"; - ss << " }\n"; - } - else if(tmpCur0->GetType() == formula::svDouble) - { - ss << " x = " << tmpCur0->GetDouble() << ";\n"; - } - else - { - ss << " return DBL_MAX;\n}\n"; - return ; - } - } - else - { - ss << " x = "; - ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; - } - - FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); - assert(tmpCur1); - if(ocPush == vSubArguments[1]->GetFormulaToken()->GetOpCode()) - { - if(tmpCur1->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken*tmpCurSVR1 = - static_cast<const formula::SingleVectorRefToken *>(tmpCur1); - ss << " if (gid0 < " << tmpCurSVR1->GetArrayLength() << ")\n"; - ss << " {\n"; - ss << " mu = "; - ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; - ss << " if (isnan(mu))\n"; - ss << " mu = 0.0;\n"; - ss << " }\n"; - } - else if(tmpCur1->GetType() == formula::svDouble) - { - ss << " mu = " << tmpCur1->GetDouble() << ";\n"; - } - else - { - ss << " return DBL_MAX;\n}\n"; - return ; - } - } - else - { - ss << " mu = "; - ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; - } - - FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken(); - assert(tmpCur2); - if(ocPush == vSubArguments[2]->GetFormulaToken()->GetOpCode()) - { - if(tmpCur2->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken*tmpCurSVR2 = - static_cast<const formula::SingleVectorRefToken *>(tmpCur2); - ss << " if (gid0 < " << tmpCurSVR2->GetArrayLength() << ")\n"; - ss << " {\n"; - ss << " sigma = "; - ss << vSubArguments[2]->GenSlidingWindowDeclRef() << ";\n"; - ss << " if (isnan(sigma))\n"; - ss << " sigma = 0.0;\n"; - ss << " }\n"; - } - else if(tmpCur2->GetType() == formula::svDouble) - { - ss << " sigma = " << tmpCur2->GetDouble() << ";\n"; - } - else - { - ss << " return DBL_MAX;\n"; - ss << "}\n"; - return ; - } - } - else - { - ss << " sigma = "; - ss << vSubArguments[2]->GenSlidingWindowDeclRef() << ";\n"; - } - - ss << " if(sigma <= 0.0)\n"; - ss << " return DBL_MAX;\n"; + GenerateArg( "x", 0, vSubArguments, ss ); + GenerateArg( "mu", 0, vSubArguments, ss ); + GenerateArg( "sigma", 0, vSubArguments, ss ); + ss << " if(sigma < 0.0)\n"; + ss << " return CreateDoubleError(IllegalArgument);\n"; + ss << " else if(sigma == 0.0)\n"; + ss << " return CreateDoubleError(DivisionByZero);\n"; ss << " else\n"; ss << " return (x - mu)/sigma;\n"; ss << "}"; @@ -1344,145 +1072,12 @@ void OpWeibull::GenSlidingWindowFunction(outputstream &ss, GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; ss << " int gid0 = get_global_id(0);\n"; - ss << " double x = 0.0;\n"; - ss << " double alpha = 0.0;\n"; - ss << " double beta = 0.0;\n"; - ss << " double kum = 0.0;\n"; - if(vSubArguments.size() != 4) - { - ss << " return DBL_MAX;\n}\n"; - return ; - } - FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); - assert(tmpCur0); - if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode()) - { - if(tmpCur0->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken*tmpCurSVR0 = - static_cast<const formula::SingleVectorRefToken *>(tmpCur0); - ss << " if (gid0 < " << tmpCurSVR0->GetArrayLength() << ")\n"; - ss << " {\n"; - ss << " x = "; - ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; - ss << " if (isnan(x))\n"; - ss << " x = 0.0;\n"; - ss << " }\n"; - } - else if(tmpCur0->GetType() == formula::svDouble) - { - ss << " x = " << tmpCur0->GetDouble() << ";\n"; - } - else - { - ss << " return DBL_MAX;\n}\n"; - return ; - } - } - else - { - ss << " x = "; - ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; - } - - FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); - assert(tmpCur1); - if(ocPush == vSubArguments[1]->GetFormulaToken()->GetOpCode()) - { - if(tmpCur1->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken*tmpCurSVR1 = - static_cast<const formula::SingleVectorRefToken *>(tmpCur1); - ss << " if (gid0 < " << tmpCurSVR1->GetArrayLength() << ")\n"; - ss << " {\n"; - ss << " alpha = "; - ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; - ss << " if (isnan(alpha))\n"; - ss << " alpha = 0.0;\n"; - ss << " }\n"; - } - else if(tmpCur1->GetType() == formula::svDouble) - { - ss << " alpha = " << tmpCur1->GetDouble() << ";\n"; - } - else - { - ss << " return DBL_MAX;\n}\n"; - return ; - } - } - else - { - ss << " alpha = "; - ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; - } - - FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken(); - assert(tmpCur2); - if(ocPush == vSubArguments[2]->GetFormulaToken()->GetOpCode()) - { - if(tmpCur2->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken*tmpCurSVR2 = - static_cast<const formula::SingleVectorRefToken *>(tmpCur2); - ss << " if (gid0 < " << tmpCurSVR2->GetArrayLength() << ")\n"; - ss << " {\n"; - ss << " beta = "; - ss << vSubArguments[2]->GenSlidingWindowDeclRef() << ";\n"; - ss << " if (isnan(beta))\n"; - ss << " beta = 0.0;\n"; - ss << " }\n"; - } - else if(tmpCur2->GetType() == formula::svDouble) - { - ss << " beta = " << tmpCur2->GetDouble() << ";\n"; - } - else - { - ss << " return DBL_MAX;\n}\n"; - return ; - } - } - else - { - ss << " beta = "; - ss << vSubArguments[2]->GenSlidingWindowDeclRef() << ";\n"; - } - - FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken(); - assert(tmpCur3); - if(ocPush == vSubArguments[3]->GetFormulaToken()->GetOpCode()) - { - if(tmpCur3->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken*tmpCurSVR3 = - static_cast<const formula::SingleVectorRefToken *>(tmpCur3); - ss << " if (gid0 < " << tmpCurSVR3->GetArrayLength() << ")\n"; - ss << " {\n"; - ss << " kum = "; - ss << vSubArguments[3]->GenSlidingWindowDeclRef() << ";\n"; - ss << " if (isnan(kum))\n"; - ss << " kum = 0.0;\n"; - ss << " }\n"; - } - else if(tmpCur3->GetType() == formula::svDouble) - { - ss << " kum = " << tmpCur3->GetDouble() << ";\n"; - } - else - { - ss << " return DBL_MAX;\n}\n"; - return ; - } - } - else - { - ss << " kum = "; - ss << vSubArguments[3]->GenSlidingWindowDeclRef() << ";\n"; - } - + GenerateArg( "x", 0, vSubArguments, ss ); + GenerateArg( "alpha", 1, vSubArguments, ss ); + GenerateArg( "beta", 2, vSubArguments, ss ); + GenerateArg( "kum", 3, vSubArguments, ss ); ss << " if(alpha <= 0.0 || beta <=0.0 || kum < 0.0)\n"; - ss << " return DBL_MAX;\n"; + ss << " return CreateDoubleError(IllegalArgument);\n"; ss << " else if(kum == 0.0)\n"; ss << " {\n"; ss << " return alpha*pow(pow(beta,alpha),-1.0)*pow(x,alpha-1.0)"; @@ -2024,90 +1619,20 @@ void OpTInv::BinInlineFun(std::set<std::string>& decls, void OpTInv::GenSlidingWindowFunction(outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { + CHECK_PARAMETER_COUNT( 2, 2 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; ss << " int gid0 = get_global_id(0);\n"; - ss << " double x = 0.0;\n"; - ss << " double fDF = 0.0;\n"; - if(vSubArguments.size() != 2) - { - ss << " return DBL_MAX;\n}\n"; - return ; - } - FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); - assert(tmpCur0); - if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode()) - { - if(tmpCur0->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken*tmpCurDVR0 = - static_cast<const formula::SingleVectorRefToken *>(tmpCur0); - ss << " if(gid0 < "; - ss << tmpCurDVR0->GetArrayLength() << ")\n"; - ss << " {\n"; - ss << " x = "; - ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; - ss << " if(isnan(x))\n"; - ss << " x = 0.0;\n"; - ss << " }\n"; - } - else if(tmpCur0->GetType() == formula::svDouble) - { - ss << " x = " << tmpCur0->GetDouble() << ";\n"; - } - else - { - ss << " return DBL_MAX;\n}\n"; - return ; - } - } - else - { - ss << " x = "; - ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; - } - FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); - assert(tmpCur1); - if(ocPush == vSubArguments[1]->GetFormulaToken()->GetOpCode()) - { - if(tmpCur1->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken*tmpCurDVR1 = - static_cast<const formula::SingleVectorRefToken *>(tmpCur1); - ss << " if(gid0 < "; - ss << tmpCurDVR1->GetArrayLength() << ")\n"; - ss << " {\n"; - ss << " fDF = "; - ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; - ss << " if(isnan(fDF))\n"; - ss << " fDF = 0.0;\n"; - ss << " else\n"; - ss << " fDF = floor(fDF);\n"; - ss << " }\n"; - } - else if(tmpCur1->GetType() == formula::svDouble) - { - ss << " fDF = floor(convert_double("; - ss << tmpCur1->GetDouble() << "));\n"; - } - else - { - ss << " return DBL_MAX;\n}\n"; - return ; - } - } - else - { - ss << " fDF = floor("; - ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ");\n"; - } + GenerateArg( "x", 0, vSubArguments, ss ); + GenerateArg( "fDF", 1, vSubArguments, ss ); + ss << " fDF = floor(fDF);\n"; ss << " if (x > 1.0||fDF < 1.0 || fDF > 1.0E10 || x <= 0.0)\n"; - ss << " return DBL_MAX;\n"; + ss << " return CreateDoubleError(IllegalArgument);\n"; ss << " bool bConvError;\n"; ss << " double fVal = lcl_IterateInverse(\n"; ss << " fDF*0.5, fDF, &bConvError,x,fDF );\n"; ss << " if (bConvError)\n"; - ss << " return DBL_MAX;\n"; + ss << " return CreateDoubleError(IllegalArgument);\n"; ss << " return fVal;\n"; ss << "}\n"; } @@ -2739,42 +2264,13 @@ void OpFisher::GenSlidingWindowFunction( outputstream &ss, const std::string &sSymName, SubArguments & vSubArguments) { + CHECK_PARAMETER_COUNT( 1, 1 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; - ss <<" int gid0=get_global_id(0);\n"; - ss <<" double arg0;\n"; - if(vSubArguments.size() != 1) - { - ss << " return DBL_MAX;\n"; - return ; - } - FormulaToken *pCur = vSubArguments[0]->GetFormulaToken(); - assert(pCur); - if (pCur->GetType() == formula::svDoubleVectorRef) - { - ss << " return DBL_MAX;\n"; - return ; - } - else if (pCur->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken* pSVR = - static_cast< const formula::SingleVectorRefToken* >(pCur); - ss << " arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << ";\n"; - ss<< " if(isnan(arg0)||(gid0>="; - ss<<pSVR->GetArrayLength(); - ss<<"))\n"; - ss<<" arg0 = 0;\n"; - } - else if (pCur->GetType() == formula::svDouble) - { - ss << " arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << ";\n"; - ss << " if(isnan(arg0))\n"; - ss << " return DBL_MAX;\n"; - } + ss << " int gid0=get_global_id(0);\n"; + GenerateArg( 0, vSubArguments, ss ); ss << " if (fabs(arg0) >= 1.0)\n"; - ss << " return DBL_MAX;\n"; + ss << " return CreateDoubleError(IllegalArgument);\n"; ss << " double tmp=0.5*log((1+arg0)/(1-arg0));\n"; ss << " return tmp;\n"; ss << "}\n"; @@ -2783,33 +2279,26 @@ vSubArguments) void OpFisherInv::GenSlidingWindowFunction( outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { - FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR = static_cast<const - formula::SingleVectorRefToken *>(tmpCur); + CHECK_PARAMETER_COUNT( 1, 1 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); - ss << "{\n\t"; - ss <<"int gid0=get_global_id(0);\n\t"; - ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << ";\n\t"; - ss<< "if(isnan(arg0)||(gid0>="; - ss<<tmpCurDVR->GetArrayLength(); - ss<<"))\n\t\t"; - ss<<"arg0 = 0;\n\t"; - ss << "double tmp=tanh(arg0);\n\t"; - ss << "return tmp;\n"; + ss << "{\n"; + ss << " int gid0=get_global_id(0);\n"; + GenerateArg( 0, vSubArguments, ss ); + ss << " double tmp=tanh(arg0);\n"; + ss << " return tmp;\n"; ss << "}\n"; } void OpGamma::GenSlidingWindowFunction( outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { + CHECK_PARAMETER_COUNT( 1, 1 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); - ss << "{\n\t"; - ss <<"int gid0=get_global_id(0);\n\t"; - ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << ";\n\t"; - ss << "double tmp=tgamma(arg0);\n\t"; - ss << "return tmp;\n"; + ss << "{\n"; + ss <<" int gid0=get_global_id(0);\n"; + GenerateArg( 0, vSubArguments, ss ); + ss << " double tmp=tgamma(arg0);\n"; + ss << " return tmp;\n"; ss << "}\n"; } @@ -3006,46 +2495,13 @@ void OpCorrel::GenSlidingWindowFunction( void OpNegbinomdist::GenSlidingWindowFunction( outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { + CHECK_PARAMETER_COUNT( 3, 3 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n\t"; - ss << "double f,s,p,tmp0,tmp1,tmp2;\n"; ss << " int gid0=get_global_id(0);\n"; - ss <<"\n"; - for (size_t i = 0; i < vSubArguments.size(); i++) - { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); - assert(pCur); - if (pCur->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken* pSVR = - static_cast< const formula::SingleVectorRefToken* >(pCur); - ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; - } - else if (pCur->GetType() == formula::svDouble) - { - ss << "{\n"; - } - - if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) - { - ss << " if (isnan("; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << "))\n"; - ss << " tmp"<<i<<"= 0;\n"; - ss << " else\n"; - ss << " tmp"<<i<<"=\n"; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << ";\n}\n"; - } - else - { - ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; - } - } - ss << " p = tmp2;\n"; - ss << " s = tmp1;\n"; - ss << " f = tmp0;\n"; + GenerateArg( "f", 0, vSubArguments, ss ); + GenerateArg( "s", 0, vSubArguments, ss ); + GenerateArg( "p", 0, vSubArguments, ss ); ss << " double q = 1.0 - p;\n\t"; ss << " double fFactor = pow(p,s);\n\t"; ss << " for(int i=0; i<f; i++)\n\t"; @@ -3149,18 +2605,11 @@ void OpPearson::GenSlidingWindowFunction( void OpGammaLn::GenSlidingWindowFunction( outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { - FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const -formula::SingleVectorRefToken *>(tmpCur); + CHECK_PARAMETER_COUNT( 1, 1 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n\t"; ss <<"int gid0=get_global_id(0);\n\t"; - ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << ";\n\t"; - ss<< "if(isnan(arg0)||(gid0>="; - ss<<tmpCurDVR->GetArrayLength(); - ss<<"))\n\t\t"; - ss<<"arg0 = 0;\n\t"; + GenerateArg( 0, vSubArguments, ss ); ss << "double tmp=lgamma(arg0);\n\t"; ss << "return tmp;\n"; ss << "}\n"; @@ -3178,40 +2627,11 @@ void OpGauss::GenSlidingWindowFunction( outputstream &ss, const std::string &sSymName, SubArguments & vSubArguments) { + CHECK_PARAMETER_COUNT( 1, 1 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; ss <<" int gid0=get_global_id(0);\n"; - ss <<" double arg0;\n"; - if(vSubArguments.size() != 1) - { - ss << " return DBL_MAX;\n"; - return ; - } - FormulaToken *pCur = vSubArguments[0]->GetFormulaToken(); - assert(pCur); - if (pCur->GetType() == formula::svDoubleVectorRef) - { - ss << " return DBL_MAX;\n"; - return ; - } - else if (pCur->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken* pSVR = - static_cast< const formula::SingleVectorRefToken* >(pCur); - ss << " arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << ";\n"; - ss<< " if(isnan(arg0)||(gid0>="; - ss<<pSVR->GetArrayLength(); - ss<<"))\n"; - ss<<" arg0 = 0;\n"; - } - else if (pCur->GetType() == formula::svDouble) - { - ss << " arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << ";\n"; - ss << " if(isnan(arg0))\n"; - ss << " return DBL_MAX;\n"; - } + GenerateArg( 0, vSubArguments, ss ); ss << " double tmp=gauss(arg0);\n"; ss << " return tmp;\n"; ss << "}\n"; @@ -3454,54 +2874,18 @@ void OpConfidence::BinInlineFun(std::set<std::string>& decls, void OpConfidence::GenSlidingWindowFunction(outputstream& ss, const std::string &sSymName, SubArguments& vSubArguments) { + CHECK_PARAMETER_COUNT( 3, 3 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; ss << " double tmp = " << GetBottom() <<";\n"; ss << " int gid0 = get_global_id(0);\n"; - ss << " double alpha = " << GetBottom() <<";\n"; - ss << " double sigma = " << GetBottom() <<";\n"; - ss << " double size = " << GetBottom() <<";\n"; - ss << " double tmp0,tmp1,tmp2;\n"; - ss <<"\n"; - for (size_t i = 0; i < vSubArguments.size(); i++) - { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); - assert(pCur); - if (pCur->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken* pSVR = - static_cast< const formula::SingleVectorRefToken* >(pCur); - ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; - } - else if (pCur->GetType() == formula::svDouble) - { - ss << "{\n"; - } - - if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) - { - ss << " if (isnan("; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << "))\n"; - ss << " tmp"<<i<<"= 0;\n"; - ss << " else\n"; - ss << " tmp"<<i<<"=\n"; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << ";\n}\n"; - } - else - { - ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; - } - } - ss << " alpha = tmp0;\n"; - ss << " sigma = tmp1;\n"; - ss << " size = tmp2;\n"; + GenerateArg( "alpha", 0, vSubArguments, ss ); + GenerateArg( "sigma", 0, vSubArguments, ss ); + GenerateArg( "size", 0, vSubArguments, ss ); ss << " double rn = floor(size);\n"; ss << " if(sigma <= 0.0 || alpha <= 0.0 || alpha >= 1.0"; ss << "|| rn < 1.0)\n"; - ss << " tmp = -DBL_MAX;\n"; + ss << " return CreateDoubleError(IllegalArgument);\n"; ss << " else\n"; ss << " tmp = gaussinv(1.0 - alpha / 2.0) * sigma / sqrt( rn );\n"; ss << " return tmp;\n"; @@ -3518,54 +2902,18 @@ void OpCritBinom::BinInlineFun(std::set<std::string>& decls, void OpCritBinom::GenSlidingWindowFunction(outputstream& ss, const std::string &sSymName, SubArguments& vSubArguments) { + CHECK_PARAMETER_COUNT( 3, 3 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; ss << " double tmp = " << GetBottom() <<";\n"; ss << " int gid0 = get_global_id(0);\n"; - ss << " double n = " << GetBottom() <<";\n"; - ss << " double p = " << GetBottom() <<";\n"; - ss << " double alpha = " << GetBottom() <<";\n"; - ss << " double tmp0 = 0.0,tmp1 = 0.0,tmp2 = 0.0;\n"; - ss <<"\n"; - for (size_t i = 0; i < vSubArguments.size(); i++) - { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); - assert(pCur); - if (pCur->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken* pSVR = - static_cast< const formula::SingleVectorRefToken* >(pCur); - ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; - } - else if (pCur->GetType() == formula::svDouble) - { - ss << "{\n"; - } - - if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) - { - ss << " if (isnan("; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << "))\n"; - ss << " tmp"<<i<<"= 0;\n"; - ss << " else\n"; - ss << " tmp"<<i<<"=\n"; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << ";\n}\n"; - } - else - { - ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; - } - } - ss << " n = tmp0;\n"; - ss << " p = tmp1;\n"; - ss << " alpha = tmp2;\n"; + GenerateArg( "n", 0, vSubArguments, ss ); + GenerateArg( "p", 1, vSubArguments, ss ); + GenerateArg( "alpha", 2, vSubArguments, ss ); ss << " double rn = floor(n);\n"; ss << " if (rn < 0.0 || alpha <= 0.0 || alpha >= 1.0 || p < 0.0"; ss << " || p > 1.0)\n"; - ss << " tmp = -DBL_MIN;\n"; + ss << " return CreateDoubleError(IllegalArgument);\n"; ss << " else\n"; ss << " {\n"; ss << " double rq = (0.5 - p) + 0.5;\n"; @@ -3574,7 +2922,7 @@ void OpCritBinom::GenSlidingWindowFunction(outputstream& ss, ss << " {\n"; ss << " fFactor = pow(p, rn);\n"; ss << " if (fFactor <= Min)\n"; - ss << " tmp = -DBL_MAX;\n"; + ss << " return CreateDoubleError(NoValue);\n"; ss << " else\n"; ss << " {\n"; ss << " double fSum = 1.0 - fFactor;\n"; @@ -3786,46 +3134,11 @@ void OpNormdist::GenSlidingWindowFunction( CHECK_PARAMETER_COUNT(3,4); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; - ss << " double x,mue,sigma,c;\n"; ss << " int gid0=get_global_id(0);\n"; - ss << " double tmp0,tmp1,tmp2;\n"; - ss << " double tmp3 = 0;\n"; // optional argument - ss <<"\n "; - for (size_t i = 0; i < vSubArguments.size(); i++) - { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); - assert(pCur); - if (pCur->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken* pSVR = - static_cast< const formula::SingleVectorRefToken* >(pCur); - ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; - } - else if (pCur->GetType() == formula::svDouble) - { - ss << "{\n"; - } - if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) - { - ss << " if (isnan("; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << "))\n"; - ss << " tmp"<<i<<"= 0;\n"; - ss << " else\n"; - ss << " tmp"<<i<<"=\n"; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << ";\n}\n"; - } - else - { - ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; - } - } - ss << "x = tmp0;\n"; - ss << "mue = tmp1;\n"; - ss << "sigma = tmp2;\n"; - ss << "c = tmp3;\n"; + GenerateArg( "x", 0, vSubArguments, ss ); + GenerateArg( "mue", 1, vSubArguments, ss ); + GenerateArg( "sigma", 2, vSubArguments, ss ); + GenerateArg( "c", 3, vSubArguments, ss ); ss << "if(sigma <= 0)\n"; ss << " return CreateDoubleError(IllegalArgument);\n"; ss << "double mid,tmp;\n"; @@ -3841,44 +3154,11 @@ void OpNormsdist::GenSlidingWindowFunction( outputstream &ss,const std::string &sSymName, SubArguments &vSubArguments) { + CHECK_PARAMETER_COUNT( 1, 1 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; - ss << " double x = 0,tmp0 = 0;\n"; ss << " int gid0=get_global_id(0);\n"; - ss <<"\n "; - for (size_t i = 0; i < vSubArguments.size(); i++) - { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); - assert(pCur); - if (pCur->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken* pSVR = - static_cast< const formula::SingleVectorRefToken* >(pCur); - ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; - } - else if (pCur->GetType() == formula::svDouble) - { - ss << "{\n"; - } - - if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) - { - ss << " if (isnan("; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << "))\n"; - ss << " tmp"<<i<<"= 0;\n"; - ss << " else\n"; - ss << " tmp"<<i<<"=\n"; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << ";\n}\n"; - } - else - { - ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; - } - } - ss << " x = tmp0;\n"; + GenerateArg( "x", 0, vSubArguments, ss ); ss << " double tmp = 0.5 * erfc((-1)*x * 0.7071067811865475);\n"; ss << " return tmp;\n"; ss << "}\n"; @@ -3888,49 +3168,13 @@ void OpPermut::GenSlidingWindowFunction( outputstream &ss,const std::string &sSymName, SubArguments &vSubArguments) { + CHECK_PARAMETER_COUNT( 2, 2 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; ss <<" int gid0=get_global_id(0);\n"; - ss <<" double inA;\n"; - ss <<" double inB;\n"; - ss <<" double tmp0,tmp1;\n"; ss <<" double tmp = 1 ;\n"; - ss <<"\n"; - for (size_t i = 0; i < vSubArguments.size(); i++) - { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); - assert(pCur); - if (pCur->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken* pSVR = - static_cast< const formula::SingleVectorRefToken* >(pCur); - ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; - - } - else if (pCur->GetType() == formula::svDouble) - { - ss << "{\n"; - } - - if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) - { - ss << " if (isnan("; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << "))\n"; - ss << " tmp"<<i<<"= 0;\n"; - ss << " else\n"; - ss << " tmp"<<i<<"=\n"; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << ";\n}\n"; - } - else - { - ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; - } - } - ss << " inA = tmp0;\n"; - ss << " inB = tmp1;\n"; + GenerateArg( "inA", 0, vSubArguments, ss ); + GenerateArg( "inB", 1, vSubArguments, ss ); ss << " for( int i =0; i<inB; i++)\n"; ss << " {\n"; ss << " tmp *= inA ;\n"; @@ -3943,36 +3187,13 @@ void OpPermutationA::GenSlidingWindowFunction( outputstream &ss,const std::string &sSymName, SubArguments &vSubArguments) { + CHECK_PARAMETER_COUNT( 2, 2 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; ss <<" int gid0=get_global_id(0);\n"; - ss <<" double inA;\n"; - ss <<" double inB;\n"; ss <<" double tmp = 1.0;\n"; - FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const - formula::SingleVectorRefToken *>(tmpCur0); - FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const - formula::SingleVectorRefToken *>(tmpCur1); - ss << "int buffer_fIna_len = "; - ss << tmpCurDVR0->GetArrayLength(); - ss << ";\n"; - ss << " int buffer_fInb_len = "; - ss << tmpCurDVR1->GetArrayLength(); - ss << ";\n"; - ss << " if((gid0)>=buffer_fIna_len || isnan("; - ss << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << "))\n"; - ss << " inA = 0;\nelse \n"; - ss << " inA = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << ";\n"; - ss << "if((gid0)>=buffer_fInb_len || isnan("; - ss << vSubArguments[1]->GenSlidingWindowDeclRef(); - ss << "))\n"; - ss << "inB = 0;\nelse \n"; - ss << " inB = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); - ss << ";\n"; + GenerateArg( "inA", 0, vSubArguments, ss ); + GenerateArg( "inB", 1, vSubArguments, ss ); ss << " for(int i=0; i<inB; i++)\n"; ss << " {\n"; ss << " tmp *= inA;\n"; @@ -3985,44 +3206,11 @@ void OpPhi::GenSlidingWindowFunction( outputstream &ss,const std::string &sSymName, SubArguments &vSubArguments) { + CHECK_PARAMETER_COUNT( 1, 1 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; - ss << " double x,tmp0;\n"; ss << " int gid0=get_global_id(0);\n"; - ss <<"\n"; - for (size_t i = 0; i < vSubArguments.size(); i++) - { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); - assert(pCur); - if (pCur->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken* pSVR = - static_cast< const formula::SingleVectorRefToken* >(pCur); - ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; - } - else if (pCur->GetType() == formula::svDouble) - { - ss << "{\n"; - } - - if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) - { - ss << " if (isnan("; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << "))\n"; - ss << " tmp"<<i<<"= 0;\n"; - ss << " else\n"; - ss << " tmp"<<i<<"=\n"; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << ";\n}\n"; - } - else - { - ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; - } - } - ss << " x = tmp0;\n"; + GenerateArg( "x", 0, vSubArguments, ss ); ss << " double tmp = 0.39894228040143268 * exp((-1)*pow(x,2) / 2.0);\n"; ss << " return tmp;\n"; ss << "}\n"; @@ -4032,48 +3220,13 @@ void OpNorminv::GenSlidingWindowFunction( outputstream &ss,const std::string &sSymName, SubArguments &vSubArguments) { + CHECK_PARAMETER_COUNT( 3, 3 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; ss <<" double q,t,z;\n"; - ss <<" double x,mue,sigma;\n"; - ss <<" double tmp0,tmp1,tmp2;\n"; - ss <<" int gid0=get_global_id(0);\n"; - ss <<"\n"; - for (size_t i = 0; i < vSubArguments.size(); i++) - { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); - assert(pCur); - if (pCur->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken* pSVR = - static_cast< const formula::SingleVectorRefToken* >(pCur); - ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; - } - else if (pCur->GetType() == formula::svDouble) - { - ss << "{\n"; - } - - if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) - { - ss << " if (isnan("; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << "))\n"; - ss << " tmp"<<i<<"= 0;\n"; - ss << " else\n"; - ss << " tmp"<<i<<"=\n"; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << ";\n}\n"; - } - else - { - ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; - } - } - ss <<" x = tmp0;\n"; - ss <<" mue = tmp1;\n"; - ss <<" sigma = tmp2;\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"; @@ -4236,44 +3389,12 @@ void OpNormsinv:: GenSlidingWindowFunction (outputstream &ss,const std::string &sSymName, SubArguments &vSubArguments) { + CHECK_PARAMETER_COUNT( 1, 1 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; - ss << " double q,t,z,x,tmp0;\n"; + ss << " double q,t,z;\n"; ss << " int gid0=get_global_id(0);\n"; - ss <<"\n"; - for (size_t i = 0; i < vSubArguments.size(); i++) - { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); - assert(pCur); - if (pCur->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken* pSVR = - static_cast< const formula::SingleVectorRefToken* >(pCur); - ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; - } - else if (pCur->GetType() == formula::svDouble) - { - ss << "{\n"; - } - - if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) - { - ss << " if (isnan("; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << "))\n"; - ss << " tmp"<<i<<"= 0;\n"; - ss << " else\n"; - ss << " tmp"<<i<<"=\n"; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << ";\n}\n"; - } - else - { - ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; - } - } - ss <<" x = tmp0;\n"; + GenerateArg( "x", 0, vSubArguments, ss ); ss <<" q = x -0.5;\n"; ss <<" if(fabs(q)<=.425)\n"; ss <<" {\n"; @@ -5591,60 +4712,18 @@ void OpChiSqDist::GenSlidingWindowFunction( outputstream &ss, const std::string &sSymName, SubArguments & vSubArguments) { + CHECK_PARAMETER_COUNT( 2, 3 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; ss << " int gid0 = get_global_id(0);\n"; ss << " int singleIndex = gid0;\n"; ss << " double result = 0;\n"; - if(vSubArguments.size()<2) - { - ss << " result = -DBL_MAX;\n"; - ss << " return result;\n"; - }else - { - GenTmpVariables(ss,vSubArguments); - CheckAllSubArgumentIsNan(ss,vSubArguments); - if(vSubArguments.size() == 2) - { - ss << " int tmp2 = 1;\n"; - } - } - ss <<"\n"; - for (size_t i = 0; i < vSubArguments.size(); i++) - { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); - assert(pCur); - if (pCur->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken* pSVR = - static_cast< const formula::SingleVectorRefToken* >(pCur); - ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; - } - else if (pCur->GetType() == formula::svDouble) - { - ss << "{\n"; - } - - if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) - { - ss << " if (isnan("; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << "))\n"; - ss << " tmp"<<i<<"= 0;\n"; - ss << " else\n"; - ss << " tmp"<<i<<"=\n"; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << ";\n}\n"; - } - else - { - ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; - } - } + GenerateArg( "tmp0", 0, vSubArguments, ss ); + GenerateArg( "tmp1", 1, vSubArguments, ss ); + GenerateArgWithDefault( "tmp2", 2, 1, vSubArguments, ss ); ss << " tmp1 = floor(tmp1);\n"; ss << " if(tmp1 < 1.0)\n"; - ss << " result = -DBL_MAX;\n"; + ss << " return CreateDoubleError(IllegalArgument);\n"; ss << " else\n"; ss << " {\n"; ss << " if(tmp2)\n"; @@ -5675,69 +4754,29 @@ void OpChiSqInv::GenSlidingWindowFunction( outputstream &ss, const std::string &sSymName, SubArguments & vSubArguments) { + CHECK_PARAMETER_COUNT( 2, 2 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; ss << " int gid0 = get_global_id(0);\n"; ss << " int singleIndex = gid0;\n"; ss << " double result = 0;\n"; - if(vSubArguments.size()!=2) - { - ss << " result = -DBL_MAX;\n"; - ss << " return result;\n"; - } - else - { - GenTmpVariables(ss,vSubArguments); - CheckAllSubArgumentIsNan(ss,vSubArguments); - ss <<"\n"; - for (size_t i = 0; i < vSubArguments.size(); i++) - { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); - assert(pCur); - if (pCur->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken* pSVR = - static_cast< const formula::SingleVectorRefToken* >(pCur); - ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; - } - else if (pCur->GetType() == formula::svDouble) - { - ss << "{\n"; - } - - if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) - { - ss << " if (isnan("; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << "))\n"; - ss << " tmp"<<i<<"= 0;\n"; - ss << " else\n"; - ss << " tmp"<<i<<"=\n"; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << ";\n}\n"; - } - else - { - ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; - } - } - ss << " tmp1 = floor(tmp1);\n"; - ss << " bool bConvError;\n"; - ss << " if(tmp1 < 1.0 || tmp0 < 0 || tmp0>=1.0)\n"; - ss << " result = -DBL_MAX;\n"; - ss << " else\n"; - ss << " {\n"; - ss << " result =lcl_IterateInverseChiSQInv( tmp0, tmp1,"; - ss << "tmp1*0.5, tmp1, &bConvError );\n"; - ss << " }\n"; - ss << " if(bConvError)\n"; - ss << " result = -DBL_MAX;\n"; - ss << " return result;\n"; - ss << "}"; - } - + GenerateArg( "tmp0", 0, vSubArguments, ss ); + GenerateArg( "tmp1", 1, vSubArguments, ss ); + ss << " tmp1 = floor(tmp1);\n"; + ss << " bool bConvError;\n"; + ss << " if(tmp1 < 1.0 || tmp0 < 0 || tmp0>=1.0)\n"; + ss << " return CreateDoubleError(IllegalArgument);\n"; + ss << " else\n"; + ss << " {\n"; + ss << " result =lcl_IterateInverseChiSQInv( tmp0, tmp1,"; + ss << "tmp1*0.5, tmp1, &bConvError );\n"; + ss << " }\n"; + ss << " if(bConvError)\n"; + ss << " return CreateDoubleError(NoConvergence);\n"; + ss << " return result;\n"; + ss << "}"; } + void OpGammaInv::BinInlineFun(std::set<std::string>& decls, std::set<std::string>& funs) { @@ -6349,47 +5388,15 @@ void OpPoisson::GenSlidingWindowFunction( outputstream &ss,const std::string &sSymName, SubArguments &vSubArguments) { + CHECK_PARAMETER_COUNT( 2, 3 ); GenerateFunctionDeclaration( sSymName, vSubArguments, ss ); ss << "{\n"; - ss << " double x,lambda,tmp,tmp0,tmp1,tmp2;\n"; - ss << " int bCumulative;\n"; + ss << " double tmp;\n"; ss << " int gid0=get_global_id(0);\n"; - ss <<"\n "; - for (size_t i = 0; i < vSubArguments.size(); i++) - { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); - assert(pCur); - if (pCur->GetType() == formula::svSingleVectorRef) - { - const formula::SingleVectorRefToken* pSVR = - static_cast< const formula::SingleVectorRefToken* >(pCur); - ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; - } - else if (pCur->GetType() == formula::svDouble) - { - ss << "{\n"; - } - - if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) - { - ss << " if (isnan("; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << "))\n"; - ss << " tmp"<<i<<"= 0;\n"; - ss << " else\n"; - ss << " tmp"<<i<<"=\n"; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); - ss << ";\n}\n"; - } - else - { - ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; - } - } - ss << " x = floor(tmp0);\n"; - ss << " lambda = tmp1;\n"; - ss << " bCumulative = tmp2;\n "; + GenerateArg( "x", 0, vSubArguments, ss ); + GenerateArg( "lambda", 1, vSubArguments, ss ); + GenerateArgWithDefault( "bCumulative", 2, 1, vSubArguments, ss ); + ss << " x = floor(x);\n"; ss << " if (!bCumulative)\n"; ss << " {\n"; ss << " if(lambda == 0.0)\n"; |