summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2022-09-19 17:50:58 +0200
committerLuboš Luňák <l.lunak@collabora.com>2022-09-20 08:45:48 +0200
commit4c2b8db7814dead51607935c50c1d0160333d616 (patch)
treeab56d769d51541d0e3e40a4704d10df70c7ebcae /sc
parent0513d1954c37f62cfb5336a640d3c336d3641e84 (diff)
reduce opencl copy&paste in op_statistical.cxx (svDoubleVectorRef pair)
Change-Id: I92daab29290c9d72f7531b25950c7f52084cc0bd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140192 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.cxx1399
-rw-r--r--sc/source/core/opencl/op_statistical.hxx158
-rw-r--r--sc/source/core/opencl/opbase.cxx7
-rw-r--r--sc/source/core/opencl/opbase.hxx6
4 files changed, 318 insertions, 1252 deletions
diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx
index 29e150de10cd..f4bf77715cde 100644
--- a/sc/source/core/opencl/op_statistical.cxx
+++ b/sc/source/core/opencl/op_statistical.cxx
@@ -586,293 +586,6 @@ void OpStDevP::GenSlidingWindowFunction(outputstream &ss,
ss << "}\n";
}
-void OpSlope::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 fSumX = 0.0;\n";
- ss << " double fSumY = 0.0;\n";
- ss << " double fMeanX = 0.0;\n";
- ss << " double fMeanY = 0.0;\n";
- ss << " double fSumDeltaXDeltaY = 0.0;\n";
- ss << " double fSumSqrDeltaX = 0.0;\n";
- ss << " double fCount = 0.0;\n";
- ss << " double argX = 0.0;\n";
- ss << " double argY = 0.0;\n";
- FormulaToken *pCur = vSubArguments[1]->GetFormulaToken();
- FormulaToken *pCur1 = vSubArguments[0]->GetFormulaToken();
- assert(pCur);
- assert(pCur1);
- if (pCur->GetType() == formula::svDoubleVectorRef&&
- pCur1->GetType() == formula::svDoubleVectorRef)
- {
- const formula::DoubleVectorRefToken* pDVR =
- static_cast<const formula::DoubleVectorRefToken *>(pCur);
- const formula::DoubleVectorRefToken* pDVR1 =
- static_cast<const formula::DoubleVectorRefToken *>(pCur1);
-
- size_t nCurWindowSize = pDVR->GetRefRowSize();
- size_t nCurWindowSize1 = pDVR1->GetRefRowSize();
- size_t arrayLength = pDVR->GetArrayLength()<
- pDVR1->GetArrayLength() ? pDVR->GetArrayLength():
- pDVR1->GetArrayLength();
- if(nCurWindowSize != nCurWindowSize1)
- throw Unhandled(__FILE__, __LINE__);
- ss << " for (int i = ";
- if ((!pDVR->IsStartFixed() && pDVR->IsEndFixed())
- &&(!pDVR1->IsStartFixed() && pDVR1->IsEndFixed()))
- {
- ss << "gid0; i < " << arrayLength;
- ss << " && i < " << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else if ((pDVR->IsStartFixed() && !pDVR->IsEndFixed())
- &&(pDVR1->IsStartFixed() && !pDVR1->IsEndFixed()))
- {
- ss << "0; i < " << arrayLength ;
- ss << " && i < gid0+" << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else if ((!pDVR->IsStartFixed() && !pDVR->IsEndFixed())
- &&(!pDVR1->IsStartFixed() && !pDVR1->IsEndFixed()))
- {
- ss << "0; i + gid0 < " << arrayLength;
- ss << " && i < " << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else if ((pDVR->IsStartFixed() && pDVR->IsEndFixed())
- &&(pDVR1->IsStartFixed() && pDVR1->IsEndFixed()))
- {
- ss << "0; i < " << arrayLength << "; i++)\n";
- ss << " {\n";
- }
- else
- {
- throw Unhandled(__FILE__, __LINE__);
- }
-
- ss << " argX = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
- ss << " argY = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
- ss << " if (isnan(argX) || isnan(argY))\n";
- ss << " continue;\n";
- ss << " fSumX += argX;\n";
- ss << " fSumY += argY;\n";
- ss << " fCount += 1.0;\n";
- ss << " }\n";
-
- ss << " if (fCount < 1.0)\n";
- ss << " return CreateDoubleError(NoValue);\n";
- ss << " else\n";
- ss << " {\n";
- ss << " fMeanX = fSumX / fCount;\n";
- ss << " fMeanY = fSumY / fCount;\n";
-
- ss << " for (int i = ";
- if ((!pDVR->IsStartFixed() && pDVR->IsEndFixed())
- &&(!pDVR1->IsStartFixed() && pDVR1->IsEndFixed()))
- {
- ss << "gid0; i < " << arrayLength;
- ss << " && i < " << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else if ((pDVR->IsStartFixed() && !pDVR->IsEndFixed())
- &&(pDVR1->IsStartFixed() && !pDVR1->IsEndFixed()))
- {
- ss << "0; i < " << arrayLength ;
- ss << " && i < gid0+" << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else if ((!pDVR->IsStartFixed() && !pDVR->IsEndFixed())
- &&(!pDVR1->IsStartFixed() && !pDVR1->IsEndFixed()))
- {
- ss << "0; i + gid0 < " << arrayLength;
- ss << " && i < " << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else
- {
- ss << "0; i < " << arrayLength << "; i++)\n";
- ss << " {\n";
- }
-
- ss << " argX = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
- ss << " argY = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
- ss << " if (isnan(argX) || isnan(argY))\n";
- ss << " continue;\n";
- ss << " fSumDeltaXDeltaY += (argX-fMeanX)*(argY-fMeanY);\n";
- ss << " fSumSqrDeltaX += (argX-fMeanX) * (argX-fMeanX);\n";
- ss << " }\n";
- ss << " if(fSumSqrDeltaX == 0.0)\n";
- ss << " return CreateDoubleError(DivisionByZero);\n";
- ss << " else\n";
- ss << " {\n";
- ss << " return fSumDeltaXDeltaY / fSumSqrDeltaX;\n";
- ss << " }\n";
- ss << " }\n";
- ss << "}\n";
- }
- else
- {
- throw Unhandled(__FILE__, __LINE__);
- }
-}
-void OpSTEYX::GenSlidingWindowFunction(outputstream &ss,
- const std::string &sSymName, SubArguments &vSubArguments)
-{
- GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
- ss << "{\n";
- ss << " int gid0 = get_global_id(0);\n";
- ss << " double fSumX = 0.0;\n";
- ss << " double fSumY = 0.0;\n";
- ss << " double fMeanX = 0.0;\n";
- ss << " double fMeanY = 0.0;\n";
- ss << " double fSumDeltaXDeltaY = 0.0;\n";
- ss << " double fSumSqrDeltaX = 0.0;\n";
- ss << " double fSumSqrDeltaY = 0.0;\n";
- ss << " double fCount = 0.0;\n";
- ss << " double argX = 0.0;\n";
- ss << " double argY = 0.0;\n";
- FormulaToken *pCur = vSubArguments[1]->GetFormulaToken();
- FormulaToken *pCur1 = vSubArguments[0]->GetFormulaToken();
- assert(pCur);
- assert(pCur1);
- if (pCur->GetType() == formula::svDoubleVectorRef&&
- pCur1->GetType() == formula::svDoubleVectorRef)
- {
- const formula::DoubleVectorRefToken* pDVR =
- static_cast<const formula::DoubleVectorRefToken *>(pCur);
- const formula::DoubleVectorRefToken* pDVR1 =
- static_cast<const formula::DoubleVectorRefToken *>(pCur1);
- size_t nCurWindowSize = pDVR->GetRefRowSize();
- size_t nCurWindowSize1 = pDVR1->GetRefRowSize();
- size_t arrayLength = pDVR->GetArrayLength()<
- pDVR1->GetArrayLength() ? pDVR->GetArrayLength():
- pDVR1->GetArrayLength();
- if(nCurWindowSize != nCurWindowSize1)
- {
- ss << " return DBL_MAX;\n";
- ss << "}\n";
- return ;
- }
- ss << " for (int i = ";
- if ((!pDVR->IsStartFixed() && pDVR->IsEndFixed())
- &&(!pDVR1->IsStartFixed() && pDVR1->IsEndFixed()))
- {
- ss << "gid0; i < " << arrayLength;
- ss << " && i < " << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else if ((pDVR->IsStartFixed() && !pDVR->IsEndFixed())
- &&(pDVR1->IsStartFixed() && !pDVR1->IsEndFixed()))
- {
- ss << "0; i < " << arrayLength;
- ss << " && i < gid0+" << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else if ((!pDVR->IsStartFixed() && !pDVR->IsEndFixed())
- &&(!pDVR1->IsStartFixed() && !pDVR1->IsEndFixed()))
- {
- ss << "0; i + gid0 < " << arrayLength;
- ss << " && i < " << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else if ((pDVR->IsStartFixed() && pDVR->IsEndFixed())
- &&(pDVR1->IsStartFixed() && pDVR1->IsEndFixed()))
- {
- ss << "0; i < " << arrayLength << "; i++)\n";
- ss << " {\n";
- }
- else
- {
- ss << "0; i < " << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- ss << " break;\n";
- ss << " }";
- ss << " return DBL_MAX;\n";
- ss << "}\n";
- return ;
- }
-
- ss << " argX = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
- ss << " argY = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
- ss << " if (isnan(argX) || isnan(argY))\n";
- ss << " continue;\n";
- ss << " fSumX += argX;\n";
- ss << " fSumY += argY;\n";
- ss << " fCount += 1.0;\n";
- ss << " }\n";
-
- ss << " if (fCount < 3.0)\n";
- ss << " return DBL_MAX;\n";
- ss << " else\n";
- ss << " {\n";
- ss << " fMeanX = fSumX / fCount;\n";
- ss << " fMeanY = fSumY / fCount;\n";
-
- ss << " for (int i = ";
- if ((!pDVR->IsStartFixed() && pDVR->IsEndFixed())
- &&(!pDVR1->IsStartFixed() && pDVR1->IsEndFixed()))
- {
- ss << "gid0; i < " << arrayLength;
- ss << " && i < " << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else if ((pDVR->IsStartFixed() && !pDVR->IsEndFixed())
- &&(pDVR1->IsStartFixed() && !pDVR1->IsEndFixed()))
- {
- ss << "0; i < " << arrayLength ;
- ss << " && i < gid0+" << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else if ((!pDVR->IsStartFixed() && !pDVR->IsEndFixed())&&
- (!pDVR1->IsStartFixed() && !pDVR1->IsEndFixed()))
- {
- ss << "0; i + gid0 < " << arrayLength;
- ss << " && i < " << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else
- {
- ss << "0; i < " << arrayLength << "; i++)\n";
- ss << " {\n";
- }
-
- ss << " argX = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
- ss << " argY = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
- ss << " if (isnan(argX)||isnan(argY))\n";
- ss << " continue;\n";
- ss << " fSumDeltaXDeltaY +=(argX-fMeanX)*(argY-fMeanY);\n";
- ss << " fSumSqrDeltaX += (argX-fMeanX)*(argX-fMeanX);\n";
- ss << " fSumSqrDeltaY += (argY-fMeanY)*(argY-fMeanY);\n";
- ss << " }\n";
- ss << " if(fSumSqrDeltaX == 0.0)\n";
- ss << " return DBL_MAX;\n";
- ss << " else\n";
- ss << " {\n";
- ss << " return sqrt((fSumSqrDeltaY - fSumDeltaXDeltaY * \n";
- ss << " fSumDeltaXDeltaY / fSumSqrDeltaX)\n";
- ss << " /(fCount - 2.0));\n";
- ss << " }\n";
- ss << " }\n";
- ss << "}\n";
- }
- else
- {
- ss << " return DBL_MAX;\n";
- ss << "}\n";
- }
-}
void OpFisher::GenSlidingWindowFunction( outputstream &ss,
const std::string &sSymName, SubArguments &vSubArguments)
{
@@ -914,196 +627,6 @@ void OpGamma::GenSlidingWindowFunction(
ss << "}\n";
}
-void OpCorrel::GenSlidingWindowFunction(
- outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
-{
- if( vSubArguments.size() !=2 ||vSubArguments[0]->GetFormulaToken()
- ->GetType() != formula::svDoubleVectorRef||vSubArguments[1]
- ->GetFormulaToken()->GetType() != formula::svDoubleVectorRef )
- ///only support DoubleVector in OpCorrelfor GPU calculating.
- throw Unhandled(__FILE__, __LINE__);
- const formula::DoubleVectorRefToken* pCurDVRX =
- static_cast<const formula::DoubleVectorRefToken *>(
- vSubArguments[0]->GetFormulaToken());
- const formula::DoubleVectorRefToken* pCurDVRY =
- static_cast<const formula::DoubleVectorRefToken *>(
- vSubArguments[1]->GetFormulaToken());
- if( pCurDVRX->GetRefRowSize() != pCurDVRY->GetRefRowSize() )
- throw Unhandled(__FILE__, __LINE__);
-
- GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
- ss << "{\n\t";
- ss << "double vSum = 0.0;\n\t";
- ss << "double vXSum = 0.0;\n\t";
- ss << "double vYSum = 0.0;\n\t";
- ss << "double vXMean = 0.0;\n\t";
- ss << "double vYMean = 0.0;\n\t";
-
- ss << "int gid0 = get_global_id(0);\n\t";
- ss << "double arg0 = 0.0;\n\t";
- ss << "double arg1 = 0.0;\n\t";
- ss << "int cnt = 0;\n\t";
-
- size_t nCurWindowSizeX = pCurDVRY->GetRefRowSize();
-
- ss << "for (int i = ";
- if (!pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
- ss << "gid0; i < " << nCurWindowSizeX << "; i++) {\n\t\t";
- ss << "arg0 = " << vSubArguments[0]
- ->GenSlidingWindowDeclRef(true) << ";\n\t\t";
- ss << "arg1 = " << vSubArguments[1]
- ->GenSlidingWindowDeclRef(true) << ";\n\t\t";
- ss << "if(isnan(arg0) || isnan(arg1) || (i >= ";
- ss << pCurDVRX->GetArrayLength() << ") || (i >=";
- ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
- ss << "arg0 = 0.0;\n\t\t\t";
- ss << "arg1 = 0.0;\n\t\t\t";
- ss << "--cnt;\n\t\t";
- ss << "}\n\t\t";
- ss << "++cnt;\n\t\t";
- ss << "vXSum += arg0;\n\t\t";
- ss << "vYSum += arg1;\n\t";
- ss << "}\n\t";
- } else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) {
- ss << "0; i < gid0 + " << nCurWindowSizeX << "; i++) {\n\t\t";
- ss << "arg0 = " << vSubArguments[0]
- ->GenSlidingWindowDeclRef(true) << ";\n\t\t";
- ss << "arg1 = " << vSubArguments[1]
- ->GenSlidingWindowDeclRef(true) << ";\n\t\t";
- ss << "if(isnan(arg0) || isnan(arg1) || (i >= ";
- ss << pCurDVRX->GetArrayLength() << ") || (i >=";
- ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
- ss << "arg0 = 0.0;\n\t\t\t";
- ss << "arg1 = 0.0;\n\t\t\t";
- ss << "--cnt;\n\t\t";
- ss << "}\n\t\t";
- ss << "++cnt;\n\t\t";
- ss << "vXSum += arg0;\n\t\t";
- ss << "vYSum += arg1;\n\t";
- ss << "}\n\t";
- }
- else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
- ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t";
- ss << "arg0 = " << vSubArguments[0]
- ->GenSlidingWindowDeclRef(true) << ";\n\t\t";
- ss << "arg1 = " << vSubArguments[1]
- ->GenSlidingWindowDeclRef(true) << ";\n\t\t";
- ss << "if(isnan(arg0) || isnan(arg1) || (i >= ";
- ss << pCurDVRX->GetArrayLength() << ") || (i >=";
- ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
- ss << "arg0 = 0.0;\n\t\t\t";
- ss << "arg1 = 0.0;\n\t\t\t";
- ss << "--cnt;\n\t\t";
- ss << "}\n\t\t";
- ss << "++cnt;\n\t\t";
- ss << "vXSum += arg0;\n\t\t";
- ss << "vYSum += arg1;\n\t";
- ss << "}\n\t";
- } else {
- ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t";
- ss << "arg0 = " << vSubArguments[0]
- ->GenSlidingWindowDeclRef(true) << ";\n\t\t";
- ss << "arg1 = " << vSubArguments[1]
- ->GenSlidingWindowDeclRef(true) << ";\n\t\t";
- ss << "if(isnan(arg0) || isnan(arg1) || (i + gid0 >= ";
- ss << pCurDVRX->GetArrayLength() << ") || (i + gid0 >=";
- ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
- ss << "arg0 = 0.0;\n\t\t\t";
- ss << "arg1 = 0.0;\n\t\t\t";
- ss << "--cnt;\n\t\t";
- ss << "}\n\t\t";
- ss << "++cnt;\n\t\t";
- ss << "vXSum += arg0;\n\t\t";
- ss << "vYSum += arg1;\n\t";
- ss << "}\n\t";
- }
-
- ss << "if(cnt < 1) {\n\t\t";
- ss << "return DBL_MIN;\n\t";
- ss << "}\n\t";
- ss << "else {\n\t\t";
- ss << "vXMean = vXSum/cnt;\n\t\t";
- ss << "vYMean = vYSum/cnt;\n\t\t";
- ss << "vXSum = 0.0;\n\t\t";
- ss << "vYSum = 0.0;\n\t\t";
-
- ss << "for (int i = ";
- if (!pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
- ss << "gid0; i < " << nCurWindowSizeX << "; i++) {\n\t\t\t";
- ss << "arg0 = " << vSubArguments[0]
- ->GenSlidingWindowDeclRef(true) << ";\n\t\t\t";
- ss << "arg1 = " << vSubArguments[1]
- ->GenSlidingWindowDeclRef(true) << ";\n\t\t\t";
- ss << "if(isnan(arg0) || isnan(arg1) || (i >= ";
- ss << pCurDVRX->GetArrayLength() << ") || (i >=";
- ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
- ss << "arg0 = vXMean;\n\t\t\t\t";
- ss << "arg1 = vYMean;\n\t\t\t";
- ss << "}\n\t\t\t";
- ss << "vXSum += pow(arg0 - vXMean, 2);\n\t\t\t";
- ss << "vYSum += pow(arg1 - vYMean, 2);\n\t\t\t";
- ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
- ss << "}\n\t\t";
- } else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) {
- ss << "0; i < gid0 + " << nCurWindowSizeX << "; i++) {\n\t\t\t";
- ss << "arg0 = " << vSubArguments[0]
- ->GenSlidingWindowDeclRef(true) << ";\n\t\t\t";
- ss << "arg1 = " << vSubArguments[1]
- ->GenSlidingWindowDeclRef(true) << ";\n\t\t\t";
- ss << "if(isnan(arg0) || isnan(arg1) || (i >= ";
- ss << pCurDVRX->GetArrayLength() << ") || (i >=";
- ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
- ss << "arg0 = vXMean;\n\t\t\t\t";
- ss << "arg1 = vYMean;\n\t\t\t";
- ss << "}\n\t\t\t";
- ss << "vXSum += pow(arg0 - vXMean, 2);\n\t\t\t";
- ss << "vYSum += pow(arg1 - vYMean, 2);\n\t\t\t";
- ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
- ss << "}\n\t\t";
- } else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
- ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t\t";
- ss << "arg0 = " << vSubArguments[0]
- ->GenSlidingWindowDeclRef(true) << ";\n\t\t\t";
- ss << "arg1 = " << vSubArguments[1]
- ->GenSlidingWindowDeclRef(true) << ";\n\t\t\t";
- ss << "if(isnan(arg0) || isnan(arg1) || (i >= ";
- ss << pCurDVRX->GetArrayLength() << ") || (i >=";
- ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
- ss << "arg0 = vXMean;\n\t\t\t\t";
- ss << "arg1 = vYMean;\n\t\t\t";
- ss << "}\n\t\t\t";
- ss << "vXSum += pow(arg0 - vXMean, 2);\n\t\t\t";
- ss << "vYSum += pow(arg1 - vYMean, 2);\n\t\t\t";
- ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
- ss << "}\n\t\t";
- } else {
- ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t\t";
- ss << "arg0 = " << vSubArguments[0]
- ->GenSlidingWindowDeclRef(true) << ";\n\t\t\t";
- ss << "arg1 = " << vSubArguments[1]
- ->GenSlidingWindowDeclRef(true) << ";\n\t\t\t";
- ss << "if(isnan(arg0) || isnan(arg1) || (i + gid0 >= ";
- ss << pCurDVRX->GetArrayLength() << ") || (i + gid0 >=";
- ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
- ss << "arg0 = vXMean;\n\t\t\t\t";
- ss << "arg1 = vYMean;\n\t\t\t";
- ss << "}\n\t\t\t";
- ss << "vXSum += ((arg0 - vXMean)*(arg0 - vXMean));\n\t\t\t";
- ss << "vYSum += ((arg1 - vYMean)*(arg1 - vYMean));\n\t\t\t";
- ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
- ss << "}\n\t\t";
- }
-
- ss << "if(vXSum == 0.0 || vYSum == 0.0) {\n\t\t\t";
- ss << "return NAN;\n\t\t";
- ss << "}\n\t\t";
- ss << "else {\n\t\t\t";
- ss << "return vSum/pow(vXSum*vYSum, 0.5);\n\t\t";
- ss << "}\n\t";
- ss << "}\n";
- ss << "}";
-}
-
void OpNegbinomdist::GenSlidingWindowFunction(
outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
{
@@ -1125,95 +648,6 @@ void OpNegbinomdist::GenSlidingWindowFunction(
ss << "}\n";
}
-void OpPearson::GenSlidingWindowFunction(
- outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
-{
- if( vSubArguments.size() !=2 ||vSubArguments[0]->GetFormulaToken()
- ->GetType() != formula::svDoubleVectorRef||vSubArguments[1]
- ->GetFormulaToken()->GetType() != formula::svDoubleVectorRef )
- ///only support DoubleVector in OpPearson for GPU calculating.
- throw Unhandled(__FILE__, __LINE__);
- const formula::DoubleVectorRefToken* pDVR =
- static_cast<const formula::DoubleVectorRefToken *>(
- vSubArguments[0]->GetFormulaToken());
- const formula::DoubleVectorRefToken* pCurDVRY =
- static_cast<const formula::DoubleVectorRefToken *>(
- vSubArguments[1]->GetFormulaToken());
- if( pDVR->GetRefRowSize() != pCurDVRY->GetRefRowSize() )
- throw Unhandled(__FILE__, __LINE__);
-
- size_t nCurWindowSize = pDVR->GetRefRowSize();
-
- GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
- ss << "{\n";
- ss << " int gid0=get_global_id(0);\n";
- ss << " double fCount = 0.0;\n";
- ss << " double fSumX = 0.0;\n";
- ss << " double fSumY = 0.0;\n";
- ss << " double fSumDeltaXDeltaY = 0.0;\n";
- ss << " double fInx;\n";
- ss << " double fIny;\n";
- ss << "for (int i = ";
- if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) {
- ss << "gid0; i < " << pDVR->GetArrayLength();
- ss << " && i < " << nCurWindowSize << "; i++){\n";
- } else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) {
- ss << "0; i < " << pDVR->GetArrayLength();
- ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n";
- } else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){
- ss << "0; i + gid0 < " << pDVR->GetArrayLength();
- ss << " && i < "<< nCurWindowSize << "; i++){\n";
- }
- else {
- ss << "0; i < "<< nCurWindowSize << "; i++){\n";
- }
- ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(true);
- ss << ";\n";
- ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(true);
- ss << " ;\n";
- ss << " if(!isnan(fInx)&&!isnan(fIny)){\n";
- ss << " fSumX += fInx;\n";
- ss << " fSumY += fIny;\n";
- ss << " fCount = fCount + 1;\n";
- ss << " }\n";
- ss << " }\n";
- ss << " if(fCount < 1)\n";
- ss << " return CreateDoubleError(NoValue);\n";
- ss << " double fMeanX = fSumX / fCount;\n";
- ss << " double fMeanY = fSumY / fCount;\n";
- ss << " fSumX = 0.0;\n";
- ss << " fSumY = 0.0;\n";
- ss << "for (int i = ";
- if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) {
- ss << "gid0; i < " << pDVR->GetArrayLength();
- ss << " && i < " << nCurWindowSize << "; i++){\n";
- } else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) {
- ss << "0; i < " << pDVR->GetArrayLength();
- ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n";
- } else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){
- ss << "0; i + gid0 < " << pDVR->GetArrayLength();
- ss << " && i < "<< nCurWindowSize << "; i++){\n";
- }
- else {
- ss << "0; i < "<< nCurWindowSize << "; i++){\n";
- }
- ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(true);
- ss << " ;\n";
- ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(true);
- ss << " ;\n";
- ss << " if(!isnan(fInx)&&!isnan(fIny)){\n";
- ss << " fSumDeltaXDeltaY += (fInx - fMeanX) * (fIny - fMeanY);\n";
- ss << " fSumX += (fInx - fMeanX) * (fInx - fMeanX);\n";
- ss << " fSumY += (fIny - fMeanY) * (fIny - fMeanY);\n";
- ss << " }\n";
- ss << " }\n";
- ss << " if (fSumX == 0 || fSumY == 0)\n";
- ss << " return CreateDoubleError(DivisionByZero);\n";
- ss << " double tmp = ( fSumDeltaXDeltaY / sqrt( fSumX * fSumY));\n";
- ss << " return tmp;\n";
- ss << "}\n";
-}
-
void OpGammaLn::GenSlidingWindowFunction(
outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
{
@@ -1519,87 +953,6 @@ void OpCritBinom::GenSlidingWindowFunction(outputstream& ss,
ss << "}";
}
-void OpRsq::GenSlidingWindowFunction(
- outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
-{
- if( vSubArguments.size() !=2 ||vSubArguments[0]->GetFormulaToken()
- ->GetType() != formula::svDoubleVectorRef||vSubArguments[1]
- ->GetFormulaToken()->GetType() != formula::svDoubleVectorRef )
- ///only support DoubleVector in OpRsq for GPU calculating.
- throw Unhandled(__FILE__, __LINE__);
- const formula::DoubleVectorRefToken* pCurDVR1 =
- static_cast<const formula::DoubleVectorRefToken *>(
- vSubArguments[0]->GetFormulaToken());
- const formula::DoubleVectorRefToken* pCurDVR2 =
- static_cast<const formula::DoubleVectorRefToken *>(
- vSubArguments[1]->GetFormulaToken());
- if( pCurDVR1->GetRefRowSize() != pCurDVR2->GetRefRowSize() )
- throw Unhandled(__FILE__, __LINE__);
-
- size_t nCurWindowSize = pCurDVR1->GetRefRowSize();
-
- GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
- ss << "{\n";
- ss << " int gid0=get_global_id(0);\n";
- ss << " double fCount = 0.0;\n";
- ss << " double fSumX = 0.0;\n";
- ss << " double fSumY = 0.0;\n";
- ss << " double fSumDeltaXDeltaY = 0.0;\n";
- ss << " double fInx;\n";
- ss << " double fIny;\n";
- ss << " double tmp0,tmp1;\n";
-
- ss <<"\n";
-
- ss << " for(int i=0; i<"<<nCurWindowSize<<"; i++)\n";
- ss << " {\n";
- ss << " if(isnan(";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef(true);
- ss << "))\n";
- ss << " fInx = 0;\n";
- ss << " else\n";
- ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
- ss << ";\n";
- ss << " if(isnan(";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef(true);
- ss << "))\n";
- ss << " fIny = 0;\n";
- ss << " else\n";
- ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
- ss << " ;\n";
- ss << " fSumX += fInx;\n";
- ss << " fSumY += fIny;\n";
- ss << " fCount = fCount + 1;\n";
- ss << " }\n";
- ss << " double fMeanX = fSumX / fCount;\n";
- ss << " double fMeanY = fSumY / fCount;\n";
- ss << " fSumX = 0.0;\n";
- ss << " fSumY = 0.0;\n";
- ss << " for(int i=0; i<"<<nCurWindowSize<<"; i++)\n";
- ss << " {\n";
- ss << " if(isnan(";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef(true);
- ss << "))\n";
- ss << " fInx = 0;\n";
- ss << " else\n";
- ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
- ss << ";\n";
- ss << " if(isnan(";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef();
- ss << "))\n";
- ss << " fIny = 0;\n";
- ss << " else\n";
- ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
- ss << " ;\n";
- ss << " fSumDeltaXDeltaY += (fInx - fMeanX) * (fIny - fMeanY);\n";
- ss << " fSumX += pow(fInx - fMeanX,2);\n";
- ss << " fSumY += pow(fIny - fMeanY,2);\n";
- ss << " }\n";
- ss << " double tmp = pow( fSumDeltaXDeltaY,2) / (fSumX * fSumY);\n";
- ss << " return tmp ;\n";
- ss << "}\n";
-}
-
void OpChiInv::BinInlineFun(std::set<std::string>& decls,
std::set<std::string>& funs)
{
@@ -2173,160 +1526,6 @@ void OpKurt:: GenSlidingWindowFunction(outputstream &ss,
ss << "}";
}
-void OpIntercept::GenSlidingWindowFunction(outputstream &ss,
- const std::string &sSymName, SubArguments &vSubArguments)
-{
- GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
- ss << "{\n";
- ss << " int gid0 = get_global_id(0);\n";
- ss << " double fSumX = 0.0;\n";
- ss << " double fSumY = 0.0;\n";
- ss << " double fMeanX = 0.0;\n";
- ss << " double fMeanY = 0.0;\n";
- ss << " double fSumDeltaXDeltaY = 0.0;\n";
- ss << " double fSumSqrDeltaX = 0.0;\n";
- ss << " double fCount = 0.0;\n";
- ss << " double argX = 0.0;\n";
- ss << " double argY = 0.0;\n";
- if(vSubArguments.size() != 2)
- {
- ss << " return NAN;\n";
- ss << "}\n";
- return ;
- }
- FormulaToken *pCur = vSubArguments[1]->GetFormulaToken();
- FormulaToken *pCur1 = vSubArguments[0]->GetFormulaToken();
- assert(pCur);
- assert(pCur1);
- if (pCur->GetType() == formula::svDoubleVectorRef&&
- pCur1->GetType() == formula::svDoubleVectorRef)
- {
- const formula::DoubleVectorRefToken* pDVR =
- static_cast<const formula::DoubleVectorRefToken *>(pCur);
- const formula::DoubleVectorRefToken* pDVR1 =
- static_cast<const formula::DoubleVectorRefToken *>(pCur1);
-
- size_t nCurWindowSize = pDVR->GetRefRowSize();
- size_t nCurWindowSize1 = pDVR1->GetRefRowSize();
- size_t arrayLength = pDVR->GetArrayLength()<
- pDVR1->GetArrayLength() ? pDVR->GetArrayLength():
- pDVR1->GetArrayLength();
- if(nCurWindowSize != nCurWindowSize1)
- {
- ss << " return NAN;\n";
- ss << "}\n";
- return ;
- }
- ss << " for (int i = ";
- if ((!pDVR->IsStartFixed() && pDVR->IsEndFixed())
- &&(!pDVR1->IsStartFixed() && pDVR1->IsEndFixed()))
- {
- ss << "gid0; i < " << arrayLength;
- ss << " && i < " << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else if ((pDVR->IsStartFixed() && !pDVR->IsEndFixed())
- &&(pDVR1->IsStartFixed() && !pDVR1->IsEndFixed()))
- {
- ss << "0; i < " << arrayLength ;
- ss << " && i < gid0+" << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else if ((!pDVR->IsStartFixed() && !pDVR->IsEndFixed())
- &&(!pDVR1->IsStartFixed() && !pDVR1->IsEndFixed()))
- {
- ss << "0; i + gid0 < " << arrayLength;
- ss << " && i < " << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else if ((pDVR->IsStartFixed() && pDVR->IsEndFixed())
- &&(pDVR1->IsStartFixed() && pDVR1->IsEndFixed()))
- {
- ss << "0; i < " << arrayLength << "; i++)\n";
- ss << " {\n";
- }
- else
- {
- ss << "0; i < " << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- ss << " break;\n";
- ss << " }";
- ss << " return NAN;\n";
- ss << "}\n";
- return ;
- }
-
- ss << " argX = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
- ss << " argY = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
- ss << " if (isnan(argX) || isnan(argY))\n";
- ss << " continue;\n";
- ss << " fSumX += argX;\n";
- ss << " fSumY += argY;\n";
- ss << " fCount += 1.0;\n";
- ss << " }\n";
-
- ss << " if (fCount < 1.0)\n";
- ss << " return NAN;\n";
- ss << " else\n";
- ss << " {\n";
- ss << " fMeanX = fSumX / fCount;\n";
- ss << " fMeanY = fSumY / fCount;\n";
-
- ss << " for (int i = ";
- if ((!pDVR->IsStartFixed() && pDVR->IsEndFixed())
- &&(!pDVR1->IsStartFixed() && pDVR1->IsEndFixed()))
- {
- ss << "gid0; i < " << arrayLength;
- ss << " && i < " << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else if ((pDVR->IsStartFixed() && !pDVR->IsEndFixed())
- &&(pDVR1->IsStartFixed() && !pDVR1->IsEndFixed()))
- {
- ss << "0; i < " << arrayLength ;
- ss << " && i < gid0+" << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else if ((!pDVR->IsStartFixed() && !pDVR->IsEndFixed())
- &&(!pDVR1->IsStartFixed() && !pDVR1->IsEndFixed()))
- {
- ss << "0; i + gid0 < " << arrayLength;
- ss << " && i < " << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- }
- else
- {
- ss << "0; i < " << arrayLength << "; i++)\n";
- ss << " {\n";
- }
-
- ss << " argX = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
- ss << " argY = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
- ss << " if (isnan(argX) || isnan(argY))\n";
- ss << " continue;\n";
- ss << " fSumDeltaXDeltaY += (argX-fMeanX)*(argY-fMeanY);\n";
- ss << " fSumSqrDeltaX += (argX-fMeanX) * (argX-fMeanX);\n";
- ss << " }\n";
- ss << " if(fSumSqrDeltaX == 0.0)\n";
- ss << " return NAN;\n";
- ss << " else\n";
- ss << " {\n";
- ss << " return fMeanY -";
- ss << " (fSumDeltaXDeltaY/fSumSqrDeltaX)*fMeanX;\n";
- ss << " }\n";
- ss << " }\n";
- ss << "}\n";
- }
- else
- {
- ss << " return NAN;\n";
- ss << "}\n";
- }
-}
void OpLogInv:: GenSlidingWindowFunction(outputstream &ss,
const std::string &sSymName, SubArguments &vSubArguments)
{
@@ -2502,111 +1701,6 @@ void OpLogInv:: GenSlidingWindowFunction(outputstream &ss,
ss << "}\n";
}
-void OpForecast::GenSlidingWindowFunction(outputstream &ss,
- const std::string &sSymName, SubArguments &vSubArguments)
-{
- FormulaToken *pCur0 = vSubArguments[0]->GetFormulaToken();
- assert(pCur0);
- const formula::SingleVectorRefToken*pCurDVR0= static_cast<const
- formula::SingleVectorRefToken *>(pCur0);
- FormulaToken *pCur1 = vSubArguments[1]->GetFormulaToken();
- assert(pCur1);
- const formula::DoubleVectorRefToken* pCurDVR1 =
- static_cast<const formula::DoubleVectorRefToken *>(pCur1);
- size_t nCurWindowSize = pCurDVR1->GetRefRowSize();
- FormulaToken *pCur2 = vSubArguments[2]->GetFormulaToken();
- assert(pCur2);
- const formula::DoubleVectorRefToken* pCurDVR2 =
- static_cast<const formula::DoubleVectorRefToken *>(pCur2);
- size_t nCurWindowSize1 = pCurDVR2->GetRefRowSize();
- GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
- ss << "{\n";
- ss << " int gid0 = get_global_id(0);\n";
- ss << " double fSumX = 0.0;\n";
- ss << " double fSumY = 0.0;\n";
- ss << " double fSumDeltaXDeltaY = 0.0;\n";
- ss << " double fSumSqrDeltaX = 0.0;\n";
- if(pCur0->GetType()== formula::svDouble ||
- pCur0->GetType() == formula::svSingleVectorRef)
- {
- ss << " double arg0 = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef();
- ss << ";\n";
- }
- else
- throw Unhandled(__FILE__, __LINE__);
- if(pCur1->GetType() != formula::svDoubleVectorRef ||
- pCur2->GetType() != formula::svDoubleVectorRef)
- throw Unhandled(__FILE__, __LINE__);
- else
- {
- ss<< " if(isnan(arg0)||(gid0>=";
- ss<<pCurDVR0->GetArrayLength();
- ss<<"))\n";
- ss<<" arg0 = 0;\n";
- ss << " int length="<<nCurWindowSize;
- ss << ";\n";
- ss << " int length1= "<<nCurWindowSize1;
- ss << ";\n";
- ss << " if(length!=length1)\n";
- ss << " return 0;\n";
- ss << " double tmp = 0;\n";
- ss << " for (int i = 0; i <" << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- ss << " double arg1 = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef(true);
- ss << ";\n";
- ss << " double arg2 = ";
- ss << vSubArguments[2]->GenSlidingWindowDeclRef(true);
- ss << ";\n";
- ss << " if(isnan(arg1)||((gid0+i)>=";
- ss << pCurDVR1->GetArrayLength();
- ss << "))\n";
- ss << " {\n";
- ss << " length--;\n";
- ss << " continue;\n";
- ss << " }\n";
- ss << " if(isnan(arg2)||((gid0+i)>=";
- ss << pCurDVR2->GetArrayLength();
- ss << "))\n";
- ss << " {\n";
- ss << " length--;\n";
- ss << " continue;\n";
- ss << " }\n";
- ss << " fSumY+=arg1;\n";
- ss << " fSumX+=arg2;\n";
- ss << " }\n";
- ss << " double fMeanX = fSumX / length;\n";
- ss << " double fMeanY = fSumY / length;\n";
- ss << " for (int i = 0; i <" << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- ss << " double arg1 = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef(true);
- ss << ";\n";
- ss << " double arg2 = ";
- ss << vSubArguments[2]->GenSlidingWindowDeclRef(true);
- ss << ";\n";
- ss << " if(isnan(arg1)||((gid0+i)>=";
- ss <<pCurDVR1->GetArrayLength();
- ss <<"))\n";
- ss <<" {\n";
- ss <<" continue;\n";
- ss <<" }\n";
- ss << " if(isnan(arg2)||((gid0+i)>=";
- ss <<pCurDVR2->GetArrayLength();
- ss <<"))\n";
- ss <<" {\n";
- ss <<" continue;\n";
- ss <<" }\n";
- ss <<" fSumDeltaXDeltaY+=(arg2 - fMeanX) * (arg1 - fMeanY);\n";
- ss <<" fSumSqrDeltaX+=pow(arg2 - fMeanX, 2);\n";
- ss <<" }\n";
- ss <<" tmp =fMeanY + fSumDeltaXDeltaY / fSumSqrDeltaX *";
- ss <<" (arg0 - fMeanX);\n";
- ss <<" return tmp;\n";
- ss << "}";
- }
-}
void OpLogNormDist::GenSlidingWindowFunction(outputstream &ss,
const std::string &sSymName, SubArguments &vSubArguments)
{
@@ -3381,283 +2475,7 @@ void OpPoisson::GenSlidingWindowFunction(
ss << " }\n";
ss << "}\n";
}
-void OpCovar::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 vSum = 0.0;\n";
- ss << " double vSum0 = 0.0;\n";
- ss << " double vSum1 = 0.0;\n";
- ss << " double vMean0 = 0.0;\n";
- ss << " double vMean1 = 0.0;\n";
- ss << " double arg0 = 0.0;\n";
- ss << " double arg1 = 0.0;\n";
- FormulaToken* pCurX = vSubArguments[0]->GetFormulaToken();
- FormulaToken* pCurY = vSubArguments[1]->GetFormulaToken();
- if ((pCurX->GetType() == formula::svDoubleVectorRef)&&
- (pCurY->GetType() == formula::svDoubleVectorRef)){
- ss << " int cnt = 0;\n";
- const formula::DoubleVectorRefToken* pCurDVRX =
- static_cast<const formula::DoubleVectorRefToken* >(pCurX);
- const formula::DoubleVectorRefToken* pCurDVRY =
- static_cast<const formula::DoubleVectorRefToken* >(pCurY);
- size_t nCurWindowSizeX = pCurDVRX->GetRefRowSize();
- size_t nCurWindowSizeY = pCurDVRY->GetRefRowSize();
- if(nCurWindowSizeX == nCurWindowSizeY)
- {
- ss << " for( ";
- if (!pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
- ss << "int i = gid0; i < " << nCurWindowSizeX;
- ss << " && i < " << pCurDVRX->GetArrayLength() << " && i < ";
- ss << pCurDVRY->GetArrayLength() << "; i++){\n";
- ss << " if(isnan(";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ") ||";
- ss << " isnan("<< vSubArguments[1]->GenSlidingWindowDeclRef();
- ss << ")) {\n";
- ss << " arg0 = 0.0;\n";
- ss << " arg1 = 0.0;\n";
- ss << " --cnt;\n";
- ss << " }\n";
- ss << "else{\n";
- ss << " arg0 = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
- ss << " arg1 = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
- ss << "}\n";
- ss << " ++cnt;\n";
- ss << " vSum0 += arg0;\n";
- ss << " vSum1 += arg1;\n";
- ss << " }\n";
- }
- else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) {
- ss << "int i = 0; i < gid0 + " << nCurWindowSizeX << " && ";
- ss << " i < " << pCurDVRX->GetArrayLength() << " && ";
- ss << " i < " << pCurDVRY->GetArrayLength() << "; i++) {\n";
- ss << " if(isnan(";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ") ||";
- ss << " isnan(" << vSubArguments[1]->GenSlidingWindowDeclRef();
- ss << ")) {\n";
- ss << " arg0 = 0.0;\n";
- ss << " arg1 = 0.0;\n";
- ss << " --cnt;\n";
- ss << " }\n";
- ss << "else{\n";
- ss << " arg0 = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
- ss << " arg1 = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";}\n";
- ss << " ++cnt;\n";
- ss << " vSum0 += arg0;\n";
- ss << " vSum1 += arg1;\n";
- ss << " }\n";
- }
- else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
- ss << "int i = 0; i < " << nCurWindowSizeX << " && i < ";
- ss << pCurDVRX->GetArrayLength() << " && i < ";
- ss << pCurDVRY->GetArrayLength() << "; i++) {\n";
- ss << " if(isnan(";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ") ||";
- ss << " isnan(" << vSubArguments[1]->GenSlidingWindowDeclRef();
- ss << ")) {\n";
- ss << " arg0 = 0.0;\n";
- ss << " arg1 = 0.0;\n";
- ss << " --cnt;\n";
- ss << " }\n";
- ss << "else{\n";
- ss << " arg0 = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
- ss << " arg1 = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";}\n";
- ss << " ++cnt;\n";
- ss << " vSum0 += arg0;\n";
- ss << " vSum1 += arg1;\n";
- ss << " }\n";
- }
- else {
- ss << "int i = 0; i < " << nCurWindowSizeX << " && ";
- ss << " i + gid0 < " << pCurDVRX->GetArrayLength();
- ss << " && i + gid0 < " << pCurDVRY->GetArrayLength();
- ss << "; i++) {\n";
- ss << "if ((isnan(";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ")) || ";
- ss << "(isnan("<< vSubArguments[1]->GenSlidingWindowDeclRef();
- ss << "))) {\n";
- ss << " arg0 = 0.0;\n";
- ss << " arg1 = 0.0;\n";
- ss << " --cnt;\n";
- ss << " }\n";
- ss << " else {\n";
- ss << " arg0 = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
- ss << " arg1 = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
- ss << " }\n";
- ss << " ++cnt;\n";
- ss << " vSum0 += arg0;\n";
- ss << " vSum1 += arg1;\n";
- ss << " }\n";
- }
- ss << " if(cnt < 1) {\n";
- ss << " return CreateDoubleError(NoValue);\n";
- ss << " }\n";
- ss << " else {\n";
- ss << " vMean0 = vSum0 / cnt;\n";
- ss << " vMean1 = vSum1 / cnt;\n";
- ss << " for(";
- if (!pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
- ss << "int i = gid0; i < " << nCurWindowSizeX;
- ss << " && i < " << pCurDVRX->GetArrayLength() << " && i < ";
- ss << pCurDVRY->GetArrayLength() << "; i++){\n";
- ss << " if(isnan(";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ") ||";
- ss << " isnan(" << vSubArguments[1]->GenSlidingWindowDeclRef();
- ss << ")){\n";
- ss << " arg0 = vMean0;\n";
- ss << " arg1 = vMean1;\n";
- ss << " }\n";
- ss << " else{\n";
- ss << " arg0 = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
- ss << " arg1 = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";}\n";
- ss << " vSum += (arg0 - vMean0) * (arg1 - vMean1);\n";
- ss << " }\n";
- }
- else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) {
- ss << "int i = 0; i < gid0 + " << nCurWindowSizeX << " && ";
- ss << " i < " << pCurDVRX->GetArrayLength() << " && ";
- ss << " i < " << pCurDVRY->GetArrayLength() << "; i++) {\n";
- ss << " if(isnan(";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ") || ";
- ss << "isnan(" << vSubArguments[1]->GenSlidingWindowDeclRef();
- ss << ")) {\n";
- ss << " arg0 = vMean0;\n";
- ss << " arg1 = vMean1;\n";
- ss << " }\n";
- ss << "else{\n";
- ss << " arg0 = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
- ss << " arg1 = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";}\n";
- ss << " vSum += (arg0 - vMean0) * (arg1 - vMean1);\n";
- ss << " }\n";
- }
- else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
- ss << "int i = 0; i < " << nCurWindowSizeX << " && i < ";
- ss << pCurDVRX->GetArrayLength() << " && i < ";
- ss << pCurDVRY->GetArrayLength() << "; i++) {\n";
- ss << " if(isnan(";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ") || ";
- ss << "isnan(" << vSubArguments[1]->GenSlidingWindowDeclRef();
- ss << ")) {\n";
- ss << " arg0 = vMean0;\n";
- ss << " arg1 = vMean1;\n";
- ss << " }\n";
- ss << "else{\n";
- ss << " arg0 = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
- ss << " arg1 = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";}\n";
- ss << " vSum += (arg0 - vMean0) * (arg1 - vMean1);\n";
- ss << " }\n";
- }
- else {
- ss << "int i = 0; i < " << nCurWindowSizeX << " && ";
- ss << " i + gid0 < " << pCurDVRX->GetArrayLength();
- ss << " && i + gid0 < " << pCurDVRX->GetArrayLength();
- ss << "; i++) {\n";
- ss << "if((isnan(";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ")) || ";
- ss << "(isnan(" << vSubArguments[1]->GenSlidingWindowDeclRef();
- ss << "))) {\n";
- ss << " arg0 = vMean0;\n";
- ss << " arg1 = vMean1;\n";
- ss << " }\n";
- ss << " else{\n";
- ss << " arg0 = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
- ss << " arg1 = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
- ss << " }\n";
- ss << " vSum += (arg0 - vMean0) * (arg1 - vMean1);\n";
- ss << " }\n";
- }
- ss << " return vSum / cnt;\n";
- ss << " }\n";
- ss << "}";
- }
- else
- {
- throw Unhandled(__FILE__, __LINE__);
- }
- }
- else {
- ss << " int cnt0 = 0,cnt1 = 0;\n";
- for (size_t i = 0; i < vSubArguments.size(); i++)
- {
- FormulaToken* pCur = vSubArguments[i]->GetFormulaToken();
- if (pCur->GetType() == formula::svSingleVectorRef){
- const formula::SingleVectorRefToken* pTVR =
- static_cast< const formula::SingleVectorRefToken* >(pCur);
- ss << " if(isnan(";
- ss << vSubArguments[i]->GenSlidingWindowDeclRef();
- ss << ") || gid0 >= " << pTVR->GetArrayLength() << ")\n";
- ss << " arg" << i << " = 0;\n else\n";
- ss << " arg" << i << " = ";
- ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
- ss << " cnt" << i << "++;\n";
- ss << " vSum" << i << " += arg" << i << ";\n";
- }
- else if (pCur->GetType() == formula::svDouble){
- ss << " if(isnan ( ";
- ss << vSubArguments[i]->GenSlidingWindowDeclRef() << "))\n";
- ss << " arg" << i << " = 0;\n else\n";
- ss << " arg" << i << " = ";
- ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
- ss << " cnt" << i << "++;\n";
- ss << " vSum" << i << " += arg" << i << ";\n";
- }
- else {
- ss << " arg" << i << " = ";
- ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
- ss << " cnt" << i << "++;\n";
- ss << " vSum" << i << " += arg" << i << ";\n";
- }
- }
- ss << " vMean0 = vSum0 / cnt0;\n";
- ss << " vMean1 = vSum0 / cnt1;\n";
- for(size_t i = 0; i < vSubArguments.size(); i++ ) {
- FormulaToken* pCur = vSubArguments[i]->GetFormulaToken();
- if (pCur->GetType() == formula::svSingleVectorRef) {
- const formula::SingleVectorRefToken* pTVR =
- static_cast< const formula::SingleVectorRefToken* >(pCur);
- ss << " if(isnan(";
- ss << vSubArguments[i]->GenSlidingWindowDeclRef();
- ss << ") || gid0 >= " << pTVR->GetArrayLength() << ")\n";
- ss << " arg" << i << " = vMean" << i << ";\n";
- ss << " else\n";
- ss << " arg" << i << " = ";
- ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
- }
- else if (pCur->GetType() == formula::svDouble) {
- ss << " arg" << i << " = ";
- ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
- ss << " if(isnan(arg" << i << "))\n";
- ss << " arg" << i << " = vMean" << i << ";\n";
- }
- else {
- ss << " arg" << i << " = ";
- ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
- }
- }
- ss << " vSum += (arg0 - vMean0) * ( arg1 - vMean1 );\n";
- ss << " return vSum / cnt0;\n";
- ss << "}";
- }
-}
+
void OpBetaDist::GenSlidingWindowFunction(outputstream &ss,
const std::string &sSymName, SubArguments &vSubArguments)
{
@@ -3866,6 +2684,221 @@ void OpAveDev:: GenSlidingWindowFunction(outputstream &ss,
ss << "}";
}
+// Block of functions OpCovar-OpRsq that are rather similar.
+
+void OpCovar::GenSlidingWindowFunction(outputstream& ss,
+ const std::string &sSymName, SubArguments& vSubArguments)
+{
+ CHECK_PARAMETER_COUNT( 2, 2 );
+ CHECK_PARAMETER_DOUBLEVECTORREF( 0 );
+ CHECK_PARAMETER_DOUBLEVECTORREF( 1 );
+ GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+ ss << "{\n";
+ ss << " int gid0 = get_global_id(0);\n";
+ ss << " double fSumX = 0.0;\n";
+ ss << " double fSumY = 0.0;\n";
+ ss << " double fMeanX = 0.0;\n";
+ ss << " double fMeanY = 0.0;\n";
+ ss << " double fSumDeltaXDeltaY = 0.0;\n";
+ ss << " double fCount = 0.0;\n";
+ GenerateRangeArgPair( 0, 1, vSubArguments, ss,
+ " if (!isnan(arg1) && !isnan(arg2))\n"
+ " {\n"
+ " fSumX += arg1;\n"
+ " fSumY += arg2;\n"
+ " fCount += 1.0;\n"
+ " }\n"
+ );
+ ss << " if( fCount < 1 )\n";
+ ss << " return CreateDoubleError(NoValue);\n";
+ ss << " fMeanX = fSumX / fCount;\n";
+ ss << " fMeanY = fSumY / fCount;\n";
+ GenerateRangeArgPair( 0, 1, vSubArguments, ss,
+ " if(!isnan(arg1) && !isnan(arg2))\n"
+ " fSumDeltaXDeltaY +=(arg1-fMeanX)*(arg2-fMeanY);\n"
+ );
+ ss << " return fSumDeltaXDeltaY / fCount;\n";
+ ss << "}\n";
+}
+
+void OpForecast::GenSlidingWindowFunction(outputstream &ss,
+ const std::string &sSymName, SubArguments &vSubArguments)
+{
+ CHECK_PARAMETER_COUNT( 3, 3 );
+ CHECK_PARAMETER_DOUBLEVECTORREF( 1 );
+ CHECK_PARAMETER_DOUBLEVECTORREF( 2 );
+ GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+ ss << "{\n";
+ ss << " int gid0 = get_global_id(0);\n";
+ ss << " double fSumX = 0.0;\n";
+ ss << " double fSumY = 0.0;\n";
+ ss << " double fMeanX = 0.0;\n";
+ ss << " double fMeanY = 0.0;\n";
+ ss << " double fSumDeltaXDeltaY = 0.0;\n";
+ ss << " double fSumSqrDeltaX = 0.0;\n";
+ ss << " double fCount = 0.0;\n";
+ GenerateArg( "arg0", 0, vSubArguments, ss );
+ GenerateRangeArgPair( 1, 2, vSubArguments, ss,
+ " if (!isnan(arg1) && !isnan(arg2))\n"
+ " {\n"
+ // note that arg1 -> Y, arg2 -> X
+ " fSumX += arg2;\n"
+ " fSumY += arg1;\n"
+ " fCount += 1.0;\n"
+ " }\n"
+ );
+ ss << " if( fCount < 1 )\n";
+ ss << " return CreateDoubleError(NoValue);\n";
+ ss << " fMeanX = fSumX / fCount;\n";
+ ss << " fMeanY = fSumY / fCount;\n";
+ GenerateRangeArgPair( 1, 2, vSubArguments, ss,
+ " if(!isnan(arg1) && !isnan(arg2))\n"
+ " {\n"
+ " fSumDeltaXDeltaY +=(arg2-fMeanX)*(arg1-fMeanY);\n"
+ " fSumSqrDeltaX += (arg2-fMeanX)*(arg2-fMeanX);\n"
+ " }\n"
+ );
+ ss << " if(fSumSqrDeltaX == 0.0)\n";
+ ss << " return CreateDoubleError(DivisionByZero);\n";
+ ss << " return fMeanY + fSumDeltaXDeltaY / fSumSqrDeltaX * (arg0 - fMeanX);\n";
+ ss << "}\n";
+}
+
+void OpInterceptSlopeBase::GenerateCode( outputstream &ss, const std::string &sSymName,
+ SubArguments &vSubArguments, const char* finalComputeCode )
+{
+ CHECK_PARAMETER_COUNT( 2, 2 );
+ CHECK_PARAMETER_DOUBLEVECTORREF( 0 );
+ CHECK_PARAMETER_DOUBLEVECTORREF( 1 );
+ GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+ ss << "{\n";
+ ss << " int gid0 = get_global_id(0);\n";
+ ss << " double fSumX = 0.0;\n";
+ ss << " double fSumY = 0.0;\n";
+ ss << " double fMeanX = 0.0;\n";
+ ss << " double fMeanY = 0.0;\n";
+ ss << " double fSumDeltaXDeltaY = 0.0;\n";
+ ss << " double fSumSqrDeltaX = 0.0;\n";
+ ss << " double fCount = 0.0;\n";
+ GenerateRangeArgPair( 0, 1, vSubArguments, ss,
+ " if (!isnan(arg1) && !isnan(arg2))\n"
+ " {\n"
+ // note that arg1 -> Y, arg2 -> X
+ " fSumX += arg2;\n"
+ " fSumY += arg1;\n"
+ " fCount += 1.0;\n"
+ " }\n"
+ );
+ ss << " if( fCount < 1 )\n";
+ ss << " return CreateDoubleError(NoValue);\n";
+ ss << " fMeanX = fSumX / fCount;\n";
+ ss << " fMeanY = fSumY / fCount;\n";
+ GenerateRangeArgPair( 0, 1, vSubArguments, ss,
+ " if(!isnan(arg1) && !isnan(arg2))\n"
+ " {\n"
+ " fSumDeltaXDeltaY +=(arg2-fMeanX)*(arg1-fMeanY);\n"
+ " fSumSqrDeltaX += (arg2-fMeanX)*(arg2-fMeanX);\n"
+ " }\n"
+ );
+ ss << finalComputeCode;
+ ss << "}\n";
+}
+
+void OpIntercept::GenSlidingWindowFunction(outputstream &ss,
+ const std::string &sSymName, SubArguments &vSubArguments)
+{
+ GenerateCode( ss, sSymName, vSubArguments,
+ " if(fSumSqrDeltaX == 0.0)\n"
+ " return CreateDoubleError(DivisionByZero);\n"
+ " return fMeanY - (fSumDeltaXDeltaY/fSumSqrDeltaX)*fMeanX;\n"
+ );
+}
+
+void OpSlope::GenSlidingWindowFunction(outputstream &ss,
+ const std::string &sSymName, SubArguments &vSubArguments)
+{
+ GenerateCode( ss, sSymName, vSubArguments,
+ " if(fSumSqrDeltaX == 0.0)\n"
+ " return CreateDoubleError(DivisionByZero);\n"
+ " return fSumDeltaXDeltaY / fSumSqrDeltaX;\n"
+ );
+}
+
+void OpPearsonCovarBase::GenerateCode( outputstream &ss, const std::string &sSymName,
+ SubArguments &vSubArguments, double minimalCountValue, const char* finalComputeCode )
+{
+ CHECK_PARAMETER_COUNT( 2, 2 );
+ CHECK_PARAMETER_DOUBLEVECTORREF( 0 );
+ CHECK_PARAMETER_DOUBLEVECTORREF( 1 );
+ GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+ ss << "{\n";
+ ss << " int gid0 = get_global_id(0);\n";
+ ss << " double fSumX = 0.0;\n";
+ ss << " double fSumY = 0.0;\n";
+ ss << " double fMeanX = 0.0;\n";
+ ss << " double fMeanY = 0.0;\n";
+ ss << " double fSumDeltaXDeltaY = 0.0;\n";
+ ss << " double fSumSqrDeltaX = 0.0;\n";
+ ss << " double fSumSqrDeltaY = 0.0;\n";
+ ss << " double fCount = 0.0;\n";
+ GenerateRangeArgPair( 0, 1, vSubArguments, ss,
+ " if (!isnan(arg1) && !isnan(arg2))\n"
+ " {\n"
+ // note that arg1 -> Y, arg2 -> X
+ " fSumX += arg2;\n"
+ " fSumY += arg1;\n"
+ " fCount += 1.0;\n"
+ " }\n"
+ );
+ ss << " if( fCount < " << minimalCountValue <<" )\n";
+ ss << " return CreateDoubleError(NoValue);\n";
+ ss << " fMeanX = fSumX / fCount;\n";
+ ss << " fMeanY = fSumY / fCount;\n";
+ GenerateRangeArgPair( 0, 1, vSubArguments, ss,
+ " if(!isnan(arg1) && !isnan(arg2))\n"
+ " {\n"
+ " fSumDeltaXDeltaY +=(arg2-fMeanX)*(arg1-fMeanY);\n"
+ " fSumSqrDeltaX += (arg2-fMeanX)*(arg2-fMeanX);\n"
+ " fSumSqrDeltaY += (arg1-fMeanY)*(arg1-fMeanY);\n"
+ " }\n"
+ );
+ ss << finalComputeCode;
+ ss << "}\n";
+}
+
+void OpPearson::GenSlidingWindowFunction(
+ outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
+{
+ GenerateCode( ss, sSymName, vSubArguments, 1,
+ " if (fSumSqrDeltaX == 0 || fSumSqrDeltaY == 0)\n"
+ " return CreateDoubleError(DivisionByZero);\n"
+ " return ( fSumDeltaXDeltaY / sqrt( fSumSqrDeltaX * fSumSqrDeltaY));\n"
+ );
+}
+
+void OpSTEYX::GenSlidingWindowFunction(outputstream &ss,
+ const std::string &sSymName, SubArguments &vSubArguments)
+{
+ GenerateCode( ss, sSymName, vSubArguments, 3,
+ " if(fSumSqrDeltaX == 0.0)\n"
+ " return CreateDoubleError(DivisionByZero);\n"
+ " return sqrt((fSumSqrDeltaY - fSumDeltaXDeltaY * \n"
+ " fSumDeltaXDeltaY / fSumSqrDeltaX)\n"
+ " /(fCount - 2.0));\n"
+ );
+}
+
+void OpRsq::GenSlidingWindowFunction(
+ outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
+{
+ // This is basically pow(OpPearson,2)
+ GenerateCode( ss, sSymName, vSubArguments, 1,
+ " if (fSumSqrDeltaX == 0 || fSumSqrDeltaY == 0)\n"
+ " return CreateDoubleError(DivisionByZero);\n"
+ " return ( fSumDeltaXDeltaY * fSumDeltaXDeltaY / (fSumSqrDeltaX * fSumSqrDeltaY));\n"
+ );
+}
+
namespace {
enum MixDoubleString
diff --git a/sc/source/core/opencl/op_statistical.hxx b/sc/source/core/opencl/op_statistical.hxx
index a433acdbf56d..64089b54f524 100644
--- a/sc/source/core/opencl/op_statistical.hxx
+++ b/sc/source/core/opencl/op_statistical.hxx
@@ -44,13 +44,6 @@ public:
virtual std::string BinFuncName() const override { return "VarP"; }
virtual bool canHandleMultiVector() const override { return true; }
};
-class OpSTEYX: public Normal
-{
-public:
- virtual void GenSlidingWindowFunction(outputstream &ss,
- const std::string &sSymName, SubArguments &vSubArguments) override;
- virtual std::string BinFuncName() const override { return "STEYX"; }
-};
class OpZTest: public Normal
{
public:
@@ -92,13 +85,6 @@ public:
virtual std::string BinFuncName() const override { return "Skewp"; }
virtual bool canHandleMultiVector() const override { return true; }
};
-class OpSlope: public Normal
-{
-public:
- virtual void GenSlidingWindowFunction(outputstream &ss,
- const std::string &sSymName, SubArguments &vSubArguments) override;
- virtual std::string BinFuncName() const override { return "Slope"; }
-};
class OpWeibull: public Normal
{
public:
@@ -162,14 +148,6 @@ public:
virtual std::string BinFuncName() const override { return "Gamma"; }
};
-class OpCorrel: public Normal
-{
-public:
- virtual void GenSlidingWindowFunction(outputstream &ss,
- const std::string &sSymName, SubArguments &vSubArguments) override;
- virtual std::string BinFuncName() const override { return "Correl"; }
-};
-
class OpNegbinomdist: public Normal
{
public:
@@ -178,14 +156,6 @@ public:
virtual std::string BinFuncName() const override { return "OpNegbinomdist"; }
};
-class OpPearson: public Normal
-{
-public:
- virtual void GenSlidingWindowFunction(outputstream &ss,
- const std::string &sSymName, SubArguments &vSubArguments) override;
- virtual std::string BinFuncName() const override { return "OpPearson"; }
-};
-
class OpGammaLn: public Normal
{
public:
@@ -222,13 +192,6 @@ public:
virtual bool canHandleMultiVector() const override { return true; }
};
-class OpRsq: public Normal
-{
-public:
- virtual void GenSlidingWindowFunction(outputstream &ss,
- const std::string &sSymName, SubArguments &vSubArguments) override;
- virtual std::string BinFuncName() const override { return "OpRsq"; }
-};
class OpNormdist:public Normal{
public:
virtual void GenSlidingWindowFunction(outputstream &ss,
@@ -273,13 +236,6 @@ public:
virtual std::string BinFuncName() const override { return "Kurt"; }
virtual bool canHandleMultiVector() const override { return true; }
};
-class OpCovar: public Normal
-{
-public:
- virtual void GenSlidingWindowFunction(outputstream& ss,
- const std::string &sSymName, SubArguments& vSubArguments) override;
- virtual std::string BinFuncName() const override { return "Covar"; }
-};
class OpPermut:public Normal{
public:
@@ -306,13 +262,6 @@ public:
virtual std::string BinFuncName() const override { return "Confidence"; }
};
-class OpIntercept: public Normal
-{
-public:
- virtual void GenSlidingWindowFunction(outputstream &ss,
- const std::string &sSymName, SubArguments &vSubArguments) override;
- virtual std::string BinFuncName() const override { return "Intercept"; }
-};
class OpLogInv: public Normal
{
public:
@@ -332,13 +281,6 @@ public:
virtual std::string BinFuncName() const override { return "CritBinom"; }
};
-class OpForecast: public Normal
-{
-public:
- virtual void GenSlidingWindowFunction(outputstream &ss,
- const std::string &sSymName, SubArguments &vSubArguments) override;
- virtual std::string BinFuncName() const override { return "Forecast"; }
-};
class OpLogNormDist: public Normal
{
public:
@@ -466,6 +408,98 @@ class OpBetainv:public Normal{
virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>&) override;
virtual std::string BinFuncName() const override { return "OpBetainv"; }
};
+
+class OpAveDev: public Normal
+{
+public:
+ virtual void GenSlidingWindowFunction(outputstream &ss,
+ const std::string &sSymName, SubArguments &vSubArguments) override;
+ virtual std::string BinFuncName() const override { return "AveDev"; }
+ virtual bool canHandleMultiVector() const override { return true; }
+};
+
+class OpCovar: public Normal
+{
+public:
+ virtual void GenSlidingWindowFunction(outputstream& ss,
+ const std::string &sSymName, SubArguments& vSubArguments) override;
+ virtual std::string BinFuncName() const override { return "Covar"; }
+};
+
+class OpForecast: public Normal
+{
+public:
+ virtual void GenSlidingWindowFunction(outputstream &ss,
+ const std::string &sSymName, SubArguments &vSubArguments) override;
+ virtual std::string BinFuncName() const override { return "Forecast"; }
+};
+
+class OpInterceptSlopeBase: public Normal
+{
+public:
+ virtual void GenSlidingWindowFunction(outputstream &ss,
+ const std::string &sSymName, SubArguments &vSubArguments) override = 0;
+protected:
+ void GenerateCode( outputstream& ss, const std::string &sSymName,
+ SubArguments &vSubArguments, const char* finalComputeCode );
+};
+
+class OpIntercept: public OpInterceptSlopeBase
+{
+public:
+ virtual void GenSlidingWindowFunction(outputstream &ss,
+ const std::string &sSymName, SubArguments &vSubArguments) override;
+ virtual std::string BinFuncName() const override { return "Intercept"; }
+};
+
+class OpSlope: public OpInterceptSlopeBase
+{
+public:
+ virtual void GenSlidingWindowFunction(outputstream &ss,
+ const std::string &sSymName, SubArguments &vSubArguments) override;
+ virtual std::string BinFuncName() const override { return "Slope"; }
+};
+
+class OpPearsonCovarBase: public Normal
+{
+public:
+ virtual void GenSlidingWindowFunction(outputstream &ss,
+ const std::string &sSymName, SubArguments &vSubArguments) override = 0;
+protected:
+ void GenerateCode( outputstream& ss, const std::string &sSymName,
+ SubArguments &vSubArguments, double minimalCountValue, const char* finalComputeCode );
+};
+
+class OpPearson: public OpPearsonCovarBase
+{
+public:
+ virtual void GenSlidingWindowFunction(outputstream &ss,
+ const std::string &sSymName, SubArguments &vSubArguments) override;
+ virtual std::string BinFuncName() const override { return "OpPearson"; }
+};
+
+class OpCorrel: public OpPearson // they are identical
+{
+public:
+ virtual std::string BinFuncName() const override { return "Correl"; }
+};
+
+class OpSTEYX: public OpPearsonCovarBase
+{
+public:
+ virtual void GenSlidingWindowFunction(outputstream &ss,
+ const std::string &sSymName, SubArguments &vSubArguments) override;
+ virtual std::string BinFuncName() const override { return "STEYX"; }
+};
+
+class OpRsq: public OpPearsonCovarBase
+{
+public:
+ virtual void GenSlidingWindowFunction(outputstream &ss,
+ const std::string &sSymName, SubArguments &vSubArguments) override;
+ virtual std::string BinFuncName() const override { return "OpRsq"; }
+};
+
class OpMinA: public Normal
{
public:
@@ -544,14 +578,6 @@ public:
virtual bool takeString() const override { return true; }
virtual bool takeNumeric() const override { return true; }
};
-class OpAveDev: public Normal
-{
-public:
- virtual void GenSlidingWindowFunction(outputstream &ss,
- const std::string &sSymName, SubArguments &vSubArguments) override;
- virtual std::string BinFuncName() const override { return "AveDev"; }
- virtual bool canHandleMultiVector() const override { return true; }
-};
}
diff --git a/sc/source/core/opencl/opbase.cxx b/sc/source/core/opencl/opbase.cxx
index c73e50b3c593..f66dede91c59 100644
--- a/sc/source/core/opencl/opbase.cxx
+++ b/sc/source/core/opencl/opbase.cxx
@@ -347,22 +347,23 @@ void SlidingFunctionBase::GenerateRangeArgPair( int arg1, int arg2, SubArguments
throw Unhandled( __FILE__, __LINE__ );
}
+ size_t arrayLength = std::min( pDVR1->GetArrayLength(), pDVR2->GetArrayLength());
ss << " for (int i = ";
if (!pDVR1->IsStartFixed() && pDVR1->IsEndFixed())
{
- ss << "gid0; i < " << pDVR1->GetArrayLength();
+ ss << "gid0; i < " << arrayLength;
ss << " && i < " << nCurWindowSize1 << "; i++)\n";
ss << " {\n";
}
else if (pDVR1->IsStartFixed() && !pDVR1->IsEndFixed())
{
- ss << "0; i < " << pDVR1->GetArrayLength();
+ ss << "0; i < " << arrayLength;
ss << " && i < gid0+"<< nCurWindowSize1 << "; i++)\n";
ss << " {\n";
}
else if (!pDVR1->IsStartFixed() && !pDVR1->IsEndFixed())
{
- ss << "0; i + gid0 < " << pDVR1->GetArrayLength();
+ ss << "0; i + gid0 < " << arrayLength;
ss << " && i < " << nCurWindowSize1 << "; i++)\n";
ss << " {\n";
}
diff --git a/sc/source/core/opencl/opbase.hxx b/sc/source/core/opencl/opbase.hxx
index c9ab020d6689..9ad6e7480cf0 100644
--- a/sc/source/core/opencl/opbase.hxx
+++ b/sc/source/core/opencl/opbase.hxx
@@ -92,6 +92,12 @@ public:
if( count < ( min )) \
throw InvalidParameterCount( count, __FILE__, __LINE__ ); \
} while( false )
+#define CHECK_PARAMETER_DOUBLEVECTORREF(arg) \
+ do { \
+ FormulaToken *token = vSubArguments[arg]->GetFormulaToken(); \
+ if (token == nullptr || token->GetType() != formula::svDoubleVectorRef) \
+ throw Unhandled(__FILE__, __LINE__); \
+ } while( false )
typedef std::shared_ptr<FormulaTreeNode> FormulaTreeNodeRef;