diff options
-rw-r--r-- | sc/source/core/opencl/formulagroupcl.cxx | 4 | ||||
-rw-r--r-- | sc/source/core/opencl/op_statistical.cxx | 149 | ||||
-rw-r--r-- | sc/source/core/opencl/op_statistical.hxx | 8 |
3 files changed, 160 insertions, 1 deletions
diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 59cae60deb5f..967a0dfd7d8a 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -1329,6 +1329,10 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments( mvSubArguments.push_back(SoPHelper(ts, ft->Children[i],new OpChiInv)); break; + case ocPoissonDist: + mvSubArguments.push_back(SoPHelper(ts, + ft->Children[i],new OpPoisson)); + break; case ocExternal: if ( !(pChild->GetExternal().compareTo(OUString( "com.sun.star.sheet.addin.Analysis.getEffect")))) diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index 4144cd6465e6..9e78511726ca 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -4305,7 +4305,154 @@ void OpBetaDist::BinInlineFun(std::set<std::string>& decls, funs.insert(lcl_GetBetaHelperContFrac);funs.insert(GetLogBeta); funs.insert(GetBeta);funs.insert(lcl_getLanczosSum); } - +void OpPoisson::BinInlineFun(std::set<std::string>& decls, + std::set<std::string>& funs) +{ + decls.insert(fHalfMachEpsDecl); + funs.insert(""); + decls.insert(fMaxGammaArgumentDecl); + funs.insert(""); + decls.insert(fBigInvDecl); + funs.insert(""); + decls.insert(GetLogGammaDecl); + funs.insert(GetLogGamma); + decls.insert(lcl_GetLogGammaHelperDecl); + funs.insert(lcl_GetLogGammaHelper); + decls.insert(lcl_GetGammaHelperDecl); + funs.insert(lcl_GetGammaHelper); + decls.insert(lcl_getLanczosSumDecl); + funs.insert(lcl_getLanczosSum); + decls.insert(GetUpRegIGammaDecl); + funs.insert(GetUpRegIGamma); + decls.insert(GetGammaContFractionDecl); + funs.insert(GetGammaContFraction); + decls.insert(GetGammaSeriesDecl); + funs.insert(GetGammaSeries); +} +void OpPoisson::GenSlidingWindowFunction( + std::stringstream &ss,const std::string sSymName, + SubArguments &vSubArguments) +{ + ss << "\ndouble " << sSymName; + ss << "_"<< BinFuncName() <<"("; + for (unsigned i = 0; i < vSubArguments.size(); i++) + { + if (i) + ss << ","; + vSubArguments[i]->GenSlidingWindowDecl(ss); + } + ss << ")\n"; + ss << "{\n"; + ss << " double x,lambda,tmp;\n"; + ss << " int bCumulative;\n"; + ss << " int gid0=get_global_id(0);\n"; +#ifdef ISNAN + FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); + const formula::SingleVectorRefToken*tmpCurDVR0= dynamic_cast<const + formula::SingleVectorRefToken *>(tmpCur0); + FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); + const formula::SingleVectorRefToken*tmpCurDVR1= dynamic_cast<const + formula::SingleVectorRefToken *>(tmpCur1); + FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken(); + const formula::SingleVectorRefToken*tmpCurDVR2= dynamic_cast<const + formula::SingleVectorRefToken *>(tmpCur2); + ss << " int buffer_x_len = "; + ss << tmpCurDVR0->GetArrayLength(); + ss << ";\n"; + ss << " int buffer_lambda_len = "; + ss << tmpCurDVR1->GetArrayLength(); + ss << ";\n"; + ss << " int buffer_bCumulative_len = "; + ss << tmpCurDVR2->GetArrayLength(); + ss << ";\n"; +#endif +#ifdef ISNAN + ss <<" if((gid0)>=buffer_x_len || isNan("; + ss << vSubArguments[0]->GenSlidingWindowDeclRef(); + ss <<"))\n"; + ss <<" x = 0;\n"; + ss <<" else \n"; +#endif + ss <<" x ="<<vSubArguments[0]->GenSlidingWindowDeclRef(); + ss << ";\n"; +#ifdef ISNAN + ss <<" if((gid0)>=buffer_lambda_len || isNan("; + ss << vSubArguments[1]->GenSlidingWindowDeclRef(); + ss <<"))\n"; + ss <<" lambda = 0;\n"; + ss <<" else \n"; +#endif + ss <<" lambda ="<<vSubArguments[1]->GenSlidingWindowDeclRef(); + ss << ";\n"; +#ifdef ISNAN + ss <<" if((gid0)>=buffer_bCumulative_len || isNan("; + ss << vSubArguments[2]->GenSlidingWindowDeclRef(); + ss <<"))\n"; + ss <<" bCumulative = 0;\n"; + ss <<"else \n"; +#endif + ss <<" bCumulative ="<<vSubArguments[2]->GenSlidingWindowDeclRef(); + ss << ";\n"; + ss << " if (!bCumulative)\n"; + ss << " {\n"; + ss << " if(lambda == 0.0)\n"; + ss << " {\n"; + ss << " return 0;\n"; + ss << " }\n"; + ss << " else\n"; + ss << " {\n"; + ss << " if (lambda >712)\n"; + ss << " {\n"; + ss << " tmp = (exp(x*log(lambda)-lambda-GetLogGamma(x+1.0)));\n"; + ss << " return tmp;\n"; + ss << " }\n"; + ss << " else\n"; + ss << " {\n"; + ss << " double fPoissonVar = 1.0;\n"; + ss << " for ( int f = 0; f < x; ++f )\n"; + ss << " fPoissonVar *= lambda / ( (double)f + 1.0 );\n"; + ss << " tmp = ( fPoissonVar * exp( -lambda ) );\n"; + ss << " return tmp;\n"; + ss << " }\n"; + ss << " }\n"; + ss << " } \n"; + ss << " else\n"; + ss << " {\n"; + ss << " if (lambda == 0.0)\n"; + ss << " {\n"; + ss << " return 1;\n"; + ss << " }\n"; + ss << " else\n"; + ss << " {\n"; + ss << " if (lambda > 712 )\n"; + ss << " {\n"; + ss << " tmp = (GetUpRegIGamma(x+1.0,lambda));\n"; + ss << " return tmp;\n"; + ss << " }\n"; + ss << " else\n"; + ss << " {\n"; + ss << " if (x >= 936.0)\n"; + ss << " {\n"; + ss << " return 1;\n"; + ss << " }\n"; + ss << " else\n"; + ss << " {\n"; + ss << " double fSummand = exp(-lambda);\n"; + ss << " double fSum = fSummand;\n"; + ss << " int nEnd = (int) (x + 0.5);\n"; + ss << " for (int i = 1; i <= nEnd; i++)\n"; + ss << " {\n"; + ss << " fSummand = (fSummand*lambda)/(double)i;\n"; + ss << " fSum += fSummand;\n"; + ss << " }\n"; + ss << " tmp = fSum;\n"; + ss << " return tmp;\n"; + ss << " }\n"; + ss << " }\n"; + ss << " }\n"; + ss << " }\n"; + ss << "}\n"; +} void OpBetaDist::GenSlidingWindowFunction(std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments) { diff --git a/sc/source/core/opencl/op_statistical.hxx b/sc/source/core/opencl/op_statistical.hxx index ed88bf266d18..5f1681f03e80 100644 --- a/sc/source/core/opencl/op_statistical.hxx +++ b/sc/source/core/opencl/op_statistical.hxx @@ -291,6 +291,14 @@ class OpChiInv:public Normal{ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>&); virtual std::string BinFuncName(void) const { return "OpChiInv"; } }; +class OpPoisson:public Normal{ + public: + virtual void GenSlidingWindowFunction(std::stringstream &ss, + const std::string sSymName, SubArguments &vSubArguments); + virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>&); + virtual std::string BinFuncName(void) const { return "OpPoisson"; } +}; + class OpGammaInv: public Normal { public: |