summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorhaochen <haochen@multicorewareinc.com>2014-05-13 10:27:30 +0800
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2014-05-19 09:13:24 +0200
commitd72763ce095f0b879e5baa1713a934225ccb39f7 (patch)
tree41c4eb684dce00c7ed42002525a931053ffa027d /sc
parentb113a08b0ac9aa4ace49fb3c2fc0df9093d61777 (diff)
GPU Calc: Fix bug
For arraybound of slidingwindows parameters in Intercept formula Change-Id: I6c96073e859ef7550033e9a46e6cafb11e8bfe0a
Diffstat (limited to 'sc')
-rw-r--r--sc/source/core/opencl/op_statistical.cxx267
1 files changed, 179 insertions, 88 deletions
diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx
index 6dfe3444b619..c64588a4fa99 100644
--- a/sc/source/core/opencl/op_statistical.cxx
+++ b/sc/source/core/opencl/op_statistical.cxx
@@ -5850,121 +5850,212 @@ void OpKurt:: GenSlidingWindowFunction(std::stringstream &ss,
void OpIntercept::GenSlidingWindowFunction(std::stringstream &ss,
const std::string &sSymName, SubArguments &vSubArguments)
{
- FormulaToken *pCur = vSubArguments[0]->GetFormulaToken();
- assert(pCur);
- const formula::DoubleVectorRefToken* pCurDVR =
- static_cast<const formula::DoubleVectorRefToken *>(pCur);
- size_t nCurWindowSize = pCurDVR->GetRefRowSize();
- FormulaToken *pCur1 = vSubArguments[1]->GetFormulaToken();
- assert(pCur1);
- const formula::DoubleVectorRefToken* pCurDVR1 =
- static_cast<const formula::DoubleVectorRefToken *>(pCur1);
- size_t nCurWindowSize1 = pCurDVR1->GetRefRowSize();
ss << "\ndouble " << sSymName;
- ss << "_"<< BinFuncName() <<"( ";
+ ss << "_" << BinFuncName() << "(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{
if (i)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
- ss << ") {\n";
+ 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 << " 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";
- for (unsigned i = 0; i < vSubArguments.size(); i++)
+ ss << " double fCount = 0.0;\n";
+ ss << " double argX = 0.0;\n";
+ ss << " double argY = 0.0;\n";
+ if(vSubArguments.size() != 2)
{
- pCur = vSubArguments[i]->GetFormulaToken();
- assert(pCur);
- if (pCur->GetType() == formula::svDoubleVectorRef)
- {
+ 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 ;
}
- else if (pCur->GetType() == formula::svSingleVectorRef)
+ ss << " for (int i = ";
+ if ((!pDVR->IsStartFixed() && pDVR->IsEndFixed())
+ &&(!pDVR1->IsStartFixed() && pDVR1->IsEndFixed()))
{
#ifdef ISNAN
- ss << "return HUGE_VAL";
+ ss << "gid0; i < " << arrayLength;
+ ss << " && i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "gid0; i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
#endif
}
- else if (pCur->GetType() == formula::svDouble)
+ else if ((pDVR->IsStartFixed() && !pDVR->IsEndFixed())
+ &&(pDVR1->IsStartFixed() && !pDVR1->IsEndFixed()))
{
#ifdef ISNAN
- ss << "return HUGE_VAL";
+ ss << "0; i < " << arrayLength ;
+ ss << " && i < gid0+" << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "0; i < gid0+" << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
#endif
}
- }
- ss << " for (int i = 0; i <" << nCurWindowSize << "; i++)\n";
- ss << " {\n";
- ss << " double arg0 = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef();
- ss << ";\n";
- ss << " double arg1 = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef();
- ss << ";\n";
-#ifdef ISNAN
- ss << " if(isNan(arg0)||((gid0+i)>=";
- ss << pCurDVR->GetArrayLength();
- ss << "))\n";
- ss << " {\n";
- ss << " length--;\n";
- ss << " continue;\n";
- ss << " }\n";
+ else if ((!pDVR->IsStartFixed() && !pDVR->IsEndFixed())
+ &&(!pDVR1->IsStartFixed() && !pDVR1->IsEndFixed()))
+ {
+#ifdef ISNAN
+ ss << "0; i + gid0 < " << arrayLength;
+ ss << " && i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "0; i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
#endif
-#ifdef ISNAN
- ss << " if(isNan(arg1)||((gid0+i)>=";
- ss << pCurDVR1->GetArrayLength();
- ss << "))\n";
- ss << " {\n";
- ss << " length--;\n";
- ss << " continue;\n";
- ss << " }\n";
+ }
+ else if ((pDVR->IsStartFixed() && pDVR->IsEndFixed())
+ &&(pDVR1->IsStartFixed() && pDVR1->IsEndFixed()))
+ {
+#ifdef ISNAN
+ ss << "0; i < " << arrayLength << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "0; i < " << arrayLength << "; i++)\n";
+ ss << " {\n";
#endif
- ss << " fSumY+=arg0;\n";
- ss << " fSumX+=arg1;\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 arg0 = ";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef();
- ss << ";\n";
- ss << " double arg1 = ";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef();
- ss << ";\n";
-#ifdef ISNAN
- ss << " if(isNan(arg0)||((gid0+i)>=";
- ss << pCurDVR->GetArrayLength();
- ss << "))\n";
- ss << " {\n";
- ss << " continue;\n";
- ss << " }\n";
+ }
+ else
+ {
+#ifdef ISNAN
+ ss << "0; i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "0; i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
#endif
-#ifdef ISNAN
- ss << " if(isNan(arg1)||((gid0+i)>=";
- ss <<pCurDVR1->GetArrayLength();
- ss <<"))\n";
- ss << " {\n";
- ss << " continue;\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";
+#ifdef ISNAN
+ ss << " if (isNan(argX) || isNan(argY))\n";
+ ss << " continue;\n";
#endif
- ss << " fSumDeltaXDeltaY+=(arg1 - fMeanX) * (arg0 - fMeanY);";
- ss << ";\n";
- ss << " fSumSqrDeltaX += pow(arg1 - fMeanX, 2);\n";
- ss << " }\n";
- ss << " tmp = fMeanY - fSumDeltaXDeltaY / fSumSqrDeltaX";
- ss << "* fMeanX;\n";
- ss << " return tmp;\n";
- ss << "}";
+ 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 * pow(fCount,-1.0);\n";
+ ss << " fMeanY = fSumY * pow(fCount,-1.0);\n";
+
+ ss << " for (int i = ";
+ if ((!pDVR->IsStartFixed() && pDVR->IsEndFixed())
+ &&(!pDVR1->IsStartFixed() && pDVR1->IsEndFixed()))
+ {
+#ifdef ISNAN
+ ss << "gid0; i < " << arrayLength;
+ ss << " && i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "gid0; i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#endif
+ }
+ else if ((pDVR->IsStartFixed() && !pDVR->IsEndFixed())
+ &&(pDVR1->IsStartFixed() && !pDVR1->IsEndFixed()))
+ {
+#ifdef ISNAN
+ ss << "0; i < " << arrayLength ;
+ ss << " && i < gid0+" << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "0; i < gid0+" << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#endif
+ }
+ else if ((!pDVR->IsStartFixed() && !pDVR->IsEndFixed())
+ &&(!pDVR1->IsStartFixed() && !pDVR1->IsEndFixed()))
+ {
+#ifdef ISNAN
+ ss << "0; i + gid0 < " << arrayLength;
+ ss << " && i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "0; i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#endif
+ }
+ else
+ {
+#ifdef ISNAN
+ ss << "0; i < " << arrayLength << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "0; i < " << arrayLength << "; i++)\n";
+ ss << " {\n";
+#endif
+ }
+
+ ss << " argX = ";
+ ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
+ ss << " argY = ";
+ ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
+#ifdef ISNAN
+ ss << " if (isNan(argX) || isNan(argY))\n";
+ ss << " continue;\n";
+#endif
+ 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*pow(fSumSqrDeltaX,-1.0))*fMeanX;\n";
+ ss << " }\n";
+ ss << " }\n";
+ ss << "}\n";
+ }
+ else
+ {
+ ss << " return NAN;\n";
+ ss << "}\n";
+ }
}
void OpLogInv:: GenSlidingWindowFunction(std::stringstream &ss,
const std::string &sSymName, SubArguments &vSubArguments)