19 void OpVar::GenSlidingWindowFunction(std::stringstream &ss,
20 const std::string &sSymName,
SubArguments &vSubArguments)
22 ss <<
"\ndouble " << sSymName;
23 ss <<
"_" << BinFuncName() <<
"(";
24 for (
size_t i = 0;
i < vSubArguments.size();
i++)
28 vSubArguments[
i]->GenSlidingWindowDecl(ss);
31 ss <<
" int gid0 = get_global_id(0);\n";
32 ss <<
" double fSum = 0.0;\n";
33 ss <<
" double fMean = 0.0;\n";
34 ss <<
" double vSum = 0.0;\n";
35 ss <<
" double fCount = 0.0;\n";
36 ss <<
" double arg = 0.0;\n";
37 unsigned i = vSubArguments.size();
40 FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
42 if(
ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
49 ss <<
" for (int i = ";
53 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
59 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
65 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
74 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
76 ss <<
" if (isnan(arg))\n";
78 ss <<
" fSum += arg;\n";
79 ss <<
" fCount += 1.0;\n";
89 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
90 ss <<
" if (!isnan(arg))\n";
92 ss <<
" fSum += arg;\n";
93 ss <<
" fCount += 1.0;\n";
99 ss <<
" arg = " << pCur->
GetDouble() <<
";\n";
100 ss <<
" fSum += arg;\n";
101 ss <<
" fCount += 1.0;\n";
107 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
108 ss <<
" fSum += arg;\n";
109 ss <<
" fCount += 1.0;\n";
113 ss <<
" fMean = fSum * pow(fCount,-1.0);\n";
116 i = vSubArguments.size();
119 FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
121 if(
ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
128 ss <<
" for (int i = ";
132 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
138 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
144 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
154 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
156 ss <<
" if (isnan(arg))\n";
157 ss <<
" continue;\n";
158 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
167 ss <<
" if (!isnan(";
168 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
172 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
173 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
179 ss <<
" arg=" << pCur->
GetDouble() <<
";\n";
180 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
186 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
187 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
190 ss <<
" if (fCount <= 1.0)\n";
191 ss <<
" return CreateDoubleError(DivisionByZero);\n";
193 ss <<
" return vSum * pow(fCount - 1.0,-1.0);\n";
196 void OpZTest::BinInlineFun(std::set<std::string>& decls,
197 std::set<std::string>& funs)
206 void OpZTest::GenSlidingWindowFunction(std::stringstream &ss,
207 const std::string &sSymName,
SubArguments &vSubArguments)
209 ss <<
"\ndouble " << sSymName;
210 ss <<
"_" << BinFuncName() <<
"(";
211 for (
size_t i = 0;
i < vSubArguments.size();
i++)
215 vSubArguments[
i]->GenSlidingWindowDecl(ss);
218 ss <<
" int gid0 = get_global_id(0);\n";
219 ss <<
" double fSum = 0.0;\n";
220 ss <<
" double fSumSqr = 0.0;\n";
221 ss <<
" double mue = 0.0;\n";
222 ss <<
" double fCount = 0.0;\n";
223 ss <<
" double arg = 0.0;\n";
224 ss <<
" double sigma = 0.0;\n";
225 ss <<
" double mu = 0.0;\n";
226 if(vSubArguments.size() == 1 || vSubArguments.empty())
228 ss <<
" return DBL_MAX;\n";
232 else if(vSubArguments.size() == 2)
234 FormulaToken *pCur = vSubArguments[0]->GetFormulaToken();
235 FormulaToken *pCur1 = vSubArguments[1]->GetFormulaToken();
243 ss <<
" for (int i = ";
247 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
253 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
259 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
269 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
270 ss <<
" if (isnan(arg))\n";
271 ss <<
" continue;\n";
272 ss <<
" fSum += arg;\n";
273 ss <<
" fSumSqr += arg * arg;\n";
274 ss <<
" fCount += 1.0;\n";
276 ss <<
" if(fCount <= 1.0)\n";
277 ss <<
" return DBL_MAX;\n";
278 ss <<
" mue = fSum *pow(fCount,-1.0);\n";
279 ss <<
" sigma = (fSumSqr-fSum*fSum*";
280 ss <<
"pow(fCount,-1.0))*pow(fCount-1.0,-1.0);\n";
284 ss <<
" return DBL_MAX;\n";
288 if(
ocPush == vSubArguments[1]->GetFormulaToken()->GetOpCode())
297 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
298 ss <<
" if (isnan(mu))\n";
299 ss <<
" mu = 0.0;\n";
305 ss <<
" mu = " << pCur1->
GetDouble() <<
";\n";
309 ss <<
" return DBL_MAX;\n";
317 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
319 ss <<
" return 0.5 - gauss((mue-mu)/sqrt(sigma/fCount));\n";
325 FormulaToken *pCur = vSubArguments[0]->GetFormulaToken();
326 FormulaToken *pCur1 = vSubArguments[1]->GetFormulaToken();
327 FormulaToken *pCur2 = vSubArguments[2]->GetFormulaToken();
336 ss <<
" for (int i = ";
340 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
346 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
352 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
361 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
362 ss <<
" if (isnan(arg))\n";
363 ss <<
" continue;\n";
364 ss <<
" fSum += arg;\n";
365 ss <<
" fSumSqr += arg * arg;\n";
366 ss <<
" fCount += 1.0;\n";
368 ss <<
" if(fCount <= 1.0)\n";
369 ss <<
" return DBL_MAX;\n";
370 ss <<
" mue = fSum * pow(fCount,-1.0);\n";
374 ss <<
" return DBL_MAX;\n";
378 if(
ocPush == vSubArguments[1]->GetFormulaToken()->GetOpCode())
387 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
388 ss <<
" if (isnan(mu))\n";
389 ss <<
" mu = 0.0;\n";
394 ss <<
" mu = " << pCur1->
GetDouble() <<
";\n";
398 ss <<
" return DBL_MAX;\n";
406 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
408 if(
ocPush == vSubArguments[2]->GetFormulaToken()->GetOpCode())
417 ss << vSubArguments[2]->GenSlidingWindowDeclRef() <<
";\n";
418 ss <<
" if (isnan(sigma))\n";
419 ss <<
" sigma = 0.0;\n";
424 ss <<
" sigma = " << pCur2->
GetDouble() <<
";\n";
428 ss <<
" return DBL_MAX;\n";
436 ss << vSubArguments[2]->GenSlidingWindowDeclRef() <<
";\n";
438 ss <<
" return 0.5 - gauss((mue-mu)*sqrt(fCount)/sigma);\n";
443 void OpTTest::BinInlineFun(std::set<std::string>& decls,
444 std::set<std::string>& funs)
466 void OpTTest::GenSlidingWindowFunction(std::stringstream &ss,
467 const std::string &sSymName,
SubArguments &vSubArguments)
469 ss <<
"\ndouble " << sSymName;
470 ss <<
"_" << BinFuncName() <<
"(";
471 for (
size_t i = 0;
i < vSubArguments.size();
i++)
475 vSubArguments[
i]->GenSlidingWindowDecl(ss);
478 ss <<
" int gid0 = get_global_id(0);\n";
479 ss <<
" double fSum1 = 0.0;\n";
480 ss <<
" double fSum2 = 0.0;\n";
481 ss <<
" double fSumSqr1 = 0.0;\n";
482 ss <<
" double fSumSqr2 = 0.0;\n";
483 ss <<
" double fCount1 = 0.0;\n";
484 ss <<
" double fCount2 = 0.0;\n";
485 ss <<
" double arg1 = 0.0;\n";
486 ss <<
" double arg2 = 0.0;\n";
487 ss <<
" double mode = 0.0;\n";
488 ss <<
" double type = 0.0;\n";
489 ss <<
" double fT = 0.0;\n";
490 ss <<
" double fF = 0.0;\n";
491 if(vSubArguments.size() != 4)
493 ss <<
" return DBL_MAX;\n";
497 if(vSubArguments.size() != 4)
500 FormulaToken *pCur = vSubArguments[0]->GetFormulaToken();
501 FormulaToken *pCur1 = vSubArguments[1]->GetFormulaToken();
502 FormulaToken *pCur2 = vSubArguments[2]->GetFormulaToken();
503 FormulaToken *pCur3 = vSubArguments[3]->GetFormulaToken();
508 if(
ocPush == vSubArguments[2]->GetFormulaToken()->GetOpCode())
517 ss << vSubArguments[2]->GenSlidingWindowDeclRef() <<
";\n";
518 ss <<
" if (isnan(mode))\n";
519 ss <<
" mode = 0.0;\n";
521 ss <<
" mode = floor(mode);\n";
526 ss <<
" mode = floor(convert_double(";
531 ss <<
" return DBL_MAX;\n";
538 ss <<
" mode = floor(" ;
539 ss << vSubArguments[2]->GenSlidingWindowDeclRef() <<
");\n";
541 ss <<
" if(!(mode == 1.0 || mode == 2.0))\n";
542 ss <<
" return DBL_MAX;\n";
543 if(
ocPush==vSubArguments[3]->GetFormulaToken()->GetOpCode())
553 ss << vSubArguments[3]->GenSlidingWindowDeclRef() <<
"))\n";
554 ss <<
" type=0.0;\n";
556 ss <<
" type=floor(";
557 ss << vSubArguments[3]->GenSlidingWindowDeclRef() <<
");\n";
562 ss <<
" type = floor(convert_double(" << pCur3->
GetDouble() <<
567 ss <<
" return DBL_MAX;\n";
574 ss <<
" type=floor(";
575 ss << vSubArguments[3]->GenSlidingWindowDeclRef() <<
");\n";
577 ss <<
" if(!(type == 1.0||type == 2.0||type == 3.0))\n";
578 ss <<
" return DBL_MAX;\n";
591 if(nCurWindowSize == nCurWindowSize1)
593 ss <<
" if(type == 1.0)\n";
595 ss <<
" for (int i = ";
600 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
607 ss <<
" && i < gid0+"<< nCurWindowSize <<
"; i++)\n";
614 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
620 ss <<
"0; i < " << nCurWindowSize <<
"; i++)\n";
625 ss <<
"0; i < " << nCurWindowSize <<
"; i++)\n";
629 ss <<
" return DBL_MAX;\n";
636 ss << vSubArguments[0]->GenSlidingWindowDeclRef(
true) <<
";\n";
638 ss << vSubArguments[1]->GenSlidingWindowDeclRef(
true) <<
";\n";
639 ss <<
" if (isnan(arg1)||isnan(arg2))\n";
640 ss <<
" continue;\n";
641 ss <<
" fSum1 += arg1;\n";
642 ss <<
" fSum2 += arg2;\n";
643 ss <<
" fSumSqr1 += (arg1 - arg2)*(arg1 - arg2);\n";
644 ss <<
" fCount1 += 1;\n";
646 ss <<
" if(fCount1 < 1.0)\n";
647 ss <<
" return DBL_MAX;\n";
648 ss <<
" fT = sqrt(fCount1-1.0) * fabs(fSum1 - fSum2)\n";
649 ss <<
" /sqrt(fCount1 * fSumSqr1 - (fSum1-fSum2)\n";
650 ss <<
" *(fSum1-fSum2));\n";
651 ss <<
" fF = fCount1 - 1.0;\n";
655 ss <<
" return DBL_MAX;\n";
662 ss <<
" return DBL_MAX;\n";
667 ss <<
" if(type == 2.0 || type == 3.0)\n";
680 ss <<
" for (int i = ";
684 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
690 ss <<
" && i < gid0+"<< nCurWindowSize <<
"; i++)\n";
696 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
701 ss <<
"0; i < " << nCurWindowSize <<
"; i++)\n";
706 ss << vSubArguments[0]->GenSlidingWindowDeclRef(
true) <<
";\n";
707 ss <<
" if (isnan(arg1))\n";
708 ss <<
" continue;\n";
709 ss <<
" fSum1 += arg1;\n";
710 ss <<
" fSumSqr1 += arg1 * arg1;\n";
711 ss <<
" fCount1 += 1;\n";
714 ss <<
" for (int i = ";
718 ss <<
" && i < " << nCurWindowSize1 <<
"; i++)\n";
724 ss <<
" && i < gid0+"<< nCurWindowSize1 <<
"; i++)\n";
730 ss <<
" && i < " << nCurWindowSize1 <<
"; i++)\n";
735 ss <<
"0; i < " << nCurWindowSize1 <<
"; i++)\n";
739 ss << vSubArguments[1]->GenSlidingWindowDeclRef(
true) <<
";\n";
740 ss <<
" if (isnan(arg2))\n";
741 ss <<
" continue;\n";
742 ss <<
" fSum2 += arg2;\n";
743 ss <<
" fSumSqr2 += arg2 * arg2;\n";
744 ss <<
" fCount2 += 1;\n";
749 ss <<
" return DBL_MAX;\n";
754 ss <<
" if (fCount1 < 2.0 || fCount2 < 2.0)\n";
755 ss <<
" return DBL_MAX;\n";
757 ss <<
" if(type == 3.0)\n";
759 ss <<
" double fS1 = (fSumSqr1-fSum1*fSum1/fCount1)\n";
760 ss <<
" /(fCount1-1.0)/fCount1;\n";
761 ss <<
" double fS2 = (fSumSqr2-fSum2*fSum2/fCount2)\n";
762 ss <<
" /(fCount2-1.0)/fCount2;\n";
763 ss <<
" if (fS1 + fS2 == 0.0)\n";
764 ss <<
" return DBL_MAX;\n";
765 ss <<
" fT = fabs(fSum1/fCount1 - fSum2/fCount2)\n";
766 ss <<
" /sqrt(fS1+fS2);\n";
767 ss <<
" double c = fS1/(fS1+fS2);\n";
768 ss <<
" fF = 1.0/(c*c/(fCount1-1.0)+(1.0-c)*(1.0-c)\n";
769 ss <<
" /(fCount2-1.0));\n";
771 ss <<
" if(type == 2.0)\n";
773 ss <<
" double fS1 = (fSumSqr1 - fSum1*fSum1/fCount1)\n";
774 ss <<
" /(fCount1 - 1.0);\n";
775 ss <<
" double fS2 = (fSumSqr2 - fSum2*fSum2/fCount2)\n";
776 ss <<
" /(fCount2 - 1.0);\n";
777 ss <<
" fT = fabs( fSum1/fCount1 - fSum2/fCount2 )\n";
778 ss <<
" /sqrt( (fCount1-1.0)*fS1 + (fCount2-1.0)*fS2 )\n";
779 ss <<
" *sqrt( fCount1*fCount2*(fCount1+fCount2-2)\n";
780 ss <<
" /(fCount1+fCount2) );\n";
781 ss <<
" fF = fCount1 + fCount2 - 2;\n";
784 ss <<
" double tdist=GetTDist(fT, fF);\n";
785 ss <<
" if (mode==1)\n";
786 ss <<
" return tdist;\n";
788 ss <<
" return 2.0*tdist;\n";
791 void OpVarP::GenSlidingWindowFunction(std::stringstream &ss,
792 const std::string &sSymName,
SubArguments &vSubArguments)
794 ss <<
"\ndouble " << sSymName;
795 ss <<
"_" << BinFuncName() <<
"(";
796 for (
size_t i = 0;
i < vSubArguments.size();
i++)
800 vSubArguments[
i]->GenSlidingWindowDecl(ss);
803 ss <<
" int gid0 = get_global_id(0);\n";
804 ss <<
" double fSum = 0.0;\n";
805 ss <<
" double fMean = 0.0;\n";
806 ss <<
" double vSum = 0.0;\n";
807 ss <<
" double fCount = 0.0;\n";
808 ss <<
" double arg = 0.0;\n";
809 unsigned i = vSubArguments.size();
812 FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
814 if(
ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
821 ss <<
" for (int i = ";
825 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
831 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
837 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
846 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
848 ss <<
" if (isnan(arg))\n";
849 ss <<
" continue;\n";
850 ss <<
" fSum += arg;\n";
851 ss <<
" fCount += 1.0;\n";
861 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
862 ss <<
" if (!isnan(arg))\n";
864 ss <<
" fSum += arg;\n";
865 ss <<
" fCount += 1.0;\n";
871 ss <<
" arg = " << pCur->
GetDouble() <<
";\n";
872 ss <<
" fSum += arg;\n";
873 ss <<
" fCount += 1.0;\n";
879 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
880 ss <<
" fSum += arg;\n";
881 ss <<
" fCount += 1.0;\n";
885 ss <<
" fMean = fSum * pow(fCount,-1.0);\n";
888 i = vSubArguments.size();
891 FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
893 if(
ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
900 ss <<
" for (int i = ";
904 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
910 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
916 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
926 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
928 ss <<
" if (isnan(arg))\n";
929 ss <<
" continue;\n";
930 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
940 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
941 ss <<
" if (!isnan(arg))\n";
943 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
949 ss <<
" arg = " << pCur->
GetDouble() <<
";\n";
950 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
956 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
957 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
960 ss <<
" if (fCount == 0.0)\n";
961 ss <<
" return DBL_MAX;\n";
963 ss <<
" return vSum * pow(fCount,-1.0);\n";
967 void OpTDist::BinInlineFun(std::set<std::string>& decls,
968 std::set<std::string>& funs)
989 void OpTDist::GenSlidingWindowFunction(std::stringstream &ss,
990 const std::string &sSymName,
SubArguments &vSubArguments)
992 ss <<
"\ndouble " << sSymName;
993 ss <<
"_" << BinFuncName() <<
"(";
994 for (
size_t i = 0;
i < vSubArguments.size();
i++)
998 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1001 ss <<
" int gid0 = get_global_id(0);\n";
1002 ss <<
" double x = 0.0;\n";
1003 ss <<
" double fDF = 0.0;\n";
1004 ss <<
" double fFlag = 0.0;\n";
1005 if(vSubArguments.size() != 3)
1007 ss <<
" return DBL_MAX;\n}\n";
1010 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1012 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
1018 ss <<
" if(gid0 < ";
1022 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
1023 ss <<
" if(isnan(x))\n";
1024 ss <<
" x = 0.0;\n";
1029 ss <<
" x = " << tmpCur0->
GetDouble() <<
";\n";
1033 ss <<
" return DBL_MAX;\n}\n";
1040 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
1042 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
1044 if(
ocPush == vSubArguments[1]->GetFormulaToken()->GetOpCode())
1050 ss <<
" if(gid0 < ";
1054 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
1055 ss <<
" if(isnan(fDF))\n";
1056 ss <<
" fDF = 0.0;\n";
1058 ss <<
" fDF = floor(fDF);\n";
1063 ss <<
" fDF = floor(convert_double(";
1068 ss <<
" return DBL_MAX;\n}\n";
1074 ss <<
" fDF = floor(";
1075 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
");\n";
1078 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
1080 if(
ocPush == vSubArguments[2]->GetFormulaToken()->GetOpCode())
1086 ss <<
" if(gid0 < ";
1090 ss << vSubArguments[2]->GenSlidingWindowDeclRef() <<
";\n";
1091 ss <<
" if(isnan(fFlag))\n";
1092 ss <<
" fFlag = 0.0;\n";
1094 ss <<
" fFlag = floor(fFlag);\n";
1100 ss <<
" fFlag = floor(convert_double(";
1105 ss <<
" return DBL_MAX;\n}\n";
1111 ss <<
" fFlag = floor(";
1112 ss << vSubArguments[2]->GenSlidingWindowDeclRef() <<
");\n";
1114 ss <<
" if(fDF < 1.0 || x < 0.0 || (fFlag != 1.0 && fFlag != 2.0))\n";
1115 ss <<
" return DBL_MAX;\n";
1116 ss <<
" double R = GetTDist(x, fDF);\n";
1117 ss <<
" if (fFlag == 1.0)\n";
1118 ss <<
" return R;\n";
1120 ss <<
" return 2.0 * R;\n";
1123 void OpExponDist::GenSlidingWindowFunction(std::stringstream &ss,
1124 const std::string &sSymName,
SubArguments &vSubArguments)
1126 ss <<
"\ndouble " << sSymName;
1127 ss <<
"_"<< BinFuncName() <<
"(";
1128 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1132 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1135 ss <<
" double tmp = 0,tmp0=0,tmp1=0,tmp2=0;\n";
1136 ss <<
" int gid0 = get_global_id(0);\n";
1137 ss <<
" double rx,rlambda,rkum;\n";
1139 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1154 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
1156 ss <<
" if (isnan(";
1157 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
1159 ss <<
" tmp"<<
i<<
"= 0;\n";
1161 ss <<
" tmp"<<i<<
"=\n";
1162 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
1167 ss <<
"tmp"<<
i<<
"="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
1171 ss <<
" rx = tmp0;\n";
1172 ss <<
" rlambda = tmp1;\n";
1173 ss <<
" rkum = tmp2;\n";
1174 ss <<
" if(rlambda <= 0.0)\n";
1176 ss <<
" tmp = -DBL_MAX;\n";
1178 ss <<
" else if(rkum == 0)\n";
1180 ss <<
" if(rx >= 0)\n";
1181 ss <<
" tmp = rlambda*exp(-rlambda*rx);\n";
1183 ss <<
" tmp = 0.0;\n";
1187 ss <<
" if(rx > 0)\n";
1188 ss <<
" tmp = 1.0 - exp(-rlambda*rx);\n";
1190 ss <<
" tmp = 0.0;\n";
1192 ss <<
" return tmp;\n";
1195 void OpFdist::BinInlineFun(std::set<std::string>& decls,
1196 std::set<std::string>& funs)
1210 void OpFdist::GenSlidingWindowFunction(std::stringstream &ss,
1211 const std::string &sSymName,
SubArguments &vSubArguments)
1213 ss <<
"\ndouble " << sSymName;
1214 ss <<
"_"<< BinFuncName() <<
"(";
1215 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1219 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1222 ss <<
" double tmp = 0,tmp0=0,tmp1=0,tmp2=0;\n";
1223 ss <<
" int gid0 = get_global_id(0);\n";
1224 ss <<
" double rF1,rF2,rX;\n";
1226 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1241 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
1243 ss <<
" if (isnan(";
1244 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
1246 ss <<
" tmp"<<
i<<
"= 0;\n";
1248 ss <<
" tmp"<<i<<
"=\n";
1249 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
1254 ss <<
"tmp"<<
i<<
"="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
1258 ss <<
" rX = tmp0;\n";
1259 ss <<
" rF1 = floor(tmp1);\n";
1260 ss <<
" rF2 = floor(tmp2);\n";
1261 ss <<
" if (rX < 0.0 || rF1 < 1.0 || rF2 < 1.0 || rF1 >= 1.0E10 ||";
1262 ss <<
"rF2 >= 1.0E10)\n";
1264 ss <<
" tmp = -DBL_MAX;\n";
1266 ss <<
" tmp = GetFDist(rX, rF1, rF2);\n";
1267 ss <<
" return tmp;\n";
1271 void OpStandard::GenSlidingWindowFunction(std::stringstream &ss,
1272 const std::string &sSymName,
SubArguments &vSubArguments)
1274 ss <<
"\ndouble " << sSymName;
1275 ss <<
"_" << BinFuncName() <<
"(";
1276 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1280 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1283 ss <<
" int gid0 = get_global_id(0);\n";
1284 ss <<
" double x = 0.0;\n";
1285 ss <<
" double mu = 0.0;\n";
1286 ss <<
" double sigma = 0.0;\n";
1287 if(vSubArguments.size() != 3)
1289 ss <<
" return DBL_MAX;\n}\n";
1292 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1294 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
1303 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
1304 ss <<
" if (isnan(x))\n";
1305 ss <<
" x = 0.0;\n";
1310 ss <<
" x = " << tmpCur0->
GetDouble() <<
";\n";
1314 ss <<
" return DBL_MAX;\n}\n";
1321 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
1324 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
1326 if(
ocPush == vSubArguments[1]->GetFormulaToken()->GetOpCode())
1335 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
1336 ss <<
" if (isnan(mu))\n";
1337 ss <<
" mu = 0.0;\n";
1342 ss <<
" mu = " << tmpCur1->
GetDouble() <<
";\n";
1346 ss <<
" return DBL_MAX;\n}\n";
1353 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
1356 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
1358 if(
ocPush == vSubArguments[2]->GetFormulaToken()->GetOpCode())
1367 ss << vSubArguments[2]->GenSlidingWindowDeclRef() <<
";\n";
1368 ss <<
" if (isnan(sigma))\n";
1369 ss <<
" sigma = 0.0;\n";
1374 ss <<
" sigma = " << tmpCur2->
GetDouble() <<
";\n";
1378 ss <<
" return DBL_MAX;\n";
1386 ss << vSubArguments[2]->GenSlidingWindowDeclRef() <<
";\n";
1389 ss <<
" if(sigma <= 0.0)\n";
1390 ss <<
" return DBL_MAX;\n";
1392 ss <<
" return (x - mu)*pow(sigma,-1.0);\n";
1396 void OpWeibull::GenSlidingWindowFunction(std::stringstream &ss,
1397 const std::string &sSymName,
SubArguments &vSubArguments)
1399 ss <<
"\ndouble " << sSymName;
1400 ss <<
"_" << BinFuncName() <<
"(";
1401 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1405 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1408 ss <<
" int gid0 = get_global_id(0);\n";
1409 ss <<
" double x = 0.0;\n";
1410 ss <<
" double alpha = 0.0;\n";
1411 ss <<
" double beta = 0.0;\n";
1412 ss <<
" double kum = 0.0;\n";
1413 if(vSubArguments.size() != 4)
1415 ss <<
" return DBL_MAX;\n}\n";
1418 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1420 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
1429 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
1430 ss <<
" if (isnan(x))\n";
1431 ss <<
" x = 0.0;\n";
1436 ss <<
" x = " << tmpCur0->
GetDouble() <<
";\n";
1440 ss <<
" return DBL_MAX;\n}\n";
1447 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
1450 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
1452 if(
ocPush == vSubArguments[1]->GetFormulaToken()->GetOpCode())
1461 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
1462 ss <<
" if (isnan(alpha))\n";
1463 ss <<
" alpha = 0.0;\n";
1468 ss <<
" alpha = " << tmpCur1->
GetDouble() <<
";\n";
1472 ss <<
" return DBL_MAX;\n}\n";
1479 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
1482 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
1484 if(
ocPush == vSubArguments[2]->GetFormulaToken()->GetOpCode())
1493 ss << vSubArguments[2]->GenSlidingWindowDeclRef() <<
";\n";
1494 ss <<
" if (isnan(beta))\n";
1495 ss <<
" beta = 0.0;\n";
1500 ss <<
" beta = " << tmpCur2->
GetDouble() <<
";\n";
1504 ss <<
" return DBL_MAX;\n}\n";
1511 ss << vSubArguments[2]->GenSlidingWindowDeclRef() <<
";\n";
1514 FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
1516 if(
ocPush == vSubArguments[3]->GetFormulaToken()->GetOpCode())
1525 ss << vSubArguments[3]->GenSlidingWindowDeclRef() <<
";\n";
1526 ss <<
" if (isnan(kum))\n";
1527 ss <<
" kum = 0.0;\n";
1532 ss <<
" kum = " << tmpCur3->
GetDouble() <<
";\n";
1536 ss <<
" return DBL_MAX;\n}\n";
1543 ss << vSubArguments[3]->GenSlidingWindowDeclRef() <<
";\n";
1546 ss <<
" if(alpha <= 0.0 || beta <=0.0 || kum < 0.0)\n";
1547 ss <<
" return DBL_MAX;\n";
1548 ss <<
" else if(kum == 0.0)\n";
1550 ss <<
" return alpha*pow(pow(beta,alpha),-1.0)*pow(x,alpha-1.0)";
1551 ss <<
"*exp(-pow(x*pow(beta,-1.0),alpha));\n";
1554 ss <<
" return 1.0-exp(-pow(x*pow(beta,-1.0),alpha));\n";
1558 void OpSkew::GenSlidingWindowFunction(std::stringstream &ss,
1559 const std::string &sSymName,
SubArguments &vSubArguments)
1561 ss <<
"\ndouble " << sSymName;
1562 ss <<
"_" << BinFuncName() <<
"(";
1563 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1567 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1570 ss <<
" int gid0 = get_global_id(0);\n";
1571 ss <<
" double fSum = 0.0;\n";
1572 ss <<
" double fMean = 0.0;\n";
1573 ss <<
" double vSum = 0.0;\n";
1574 ss <<
" double fCount = 0.0;\n";
1575 ss <<
" double arg = 0.0;\n";
1576 unsigned i = vSubArguments.size();
1579 FormulaToken* pCur = vSubArguments[i]->GetFormulaToken();
1581 if(
ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
1588 ss <<
" for (int i = ";
1592 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
1598 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
1604 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
1614 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1615 ss <<
" if (isnan(arg))\n";
1616 ss <<
" continue;\n";
1617 ss <<
" fSum += arg;\n";
1618 ss <<
" fCount += 1.0;\n";
1628 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1629 ss <<
" if (!isnan(arg))\n";
1631 ss <<
" fSum += arg;\n";
1632 ss <<
" fCount += 1.0;\n";
1638 ss <<
" arg = " << pCur->
GetDouble() <<
";\n";
1639 ss <<
" fSum += arg;\n";
1640 ss <<
" fCount += 1.0;\n";
1646 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1647 ss <<
" fSum += arg;\n";
1648 ss <<
" fCount += 1.0;\n";
1653 ss <<
" if(fCount <= 2.0)\n";
1654 ss <<
" return DBL_MAX;\n";
1656 ss <<
" fMean = fSum * pow(fCount,-1.0);\n";
1659 i = vSubArguments.size();
1662 FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
1664 if(
ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
1671 ss <<
" for (int i = ";
1675 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
1681 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
1687 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
1697 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1698 ss <<
" if (isnan(arg))\n";
1699 ss <<
" continue;\n";
1700 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
1710 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1711 ss <<
" if (!isnan(arg))\n";
1713 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
1719 ss <<
" arg = " << pCur->
GetDouble() <<
";\n";
1720 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
1726 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1727 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
1730 ss <<
" double fStdDev = sqrt(vSum * pow(fCount - 1.0,-1.0));\n";
1731 ss <<
" double dx = 0.0;\n";
1732 ss <<
" double xcube = 0.0;\n";
1733 ss <<
" if(fStdDev == 0.0)\n";
1734 ss <<
" return DBL_MAX;\n";
1735 i = vSubArguments.size();
1738 FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
1740 if(
ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
1747 ss <<
" for (int i = ";
1751 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
1757 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
1763 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
1773 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1774 ss <<
" if (isnan(arg))\n";
1775 ss <<
" continue;\n";
1776 ss <<
" dx = (arg - fMean) * pow(fStdDev,-1.0);\n";
1777 ss <<
" xcube = xcube + dx * dx * dx;\n";
1787 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1788 ss <<
" if (!isnan(arg))\n";
1790 ss <<
" dx = (arg - fMean) * pow(fStdDev,-1.0);\n";
1791 ss <<
" xcube = xcube + dx * dx * dx;\n";
1797 ss <<
" arg = " << pCur->
GetDouble() <<
";\n";
1798 ss <<
" dx = (arg - fMean) * pow(fStdDev,-1.0);\n";
1799 ss <<
" xcube = xcube + dx * dx * dx;\n";
1805 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1806 ss <<
" dx = (arg - fMean) * pow(fStdDev,-1.0);\n";
1807 ss <<
" xcube = xcube + dx * dx * dx;\n";
1810 ss <<
" return ((xcube * fCount) * pow(fCount - 1.0,-1.0))";
1811 ss <<
" * pow(fCount - 2.0,-1.0);\n";
1815 void OpSkewp::GenSlidingWindowFunction(std::stringstream &ss,
1816 const std::string &sSymName,
SubArguments &vSubArguments)
1818 ss <<
"\ndouble " << sSymName;
1819 ss <<
"_" << BinFuncName() <<
"(";
1820 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1824 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1827 ss <<
" int gid0 = get_global_id(0);\n";
1828 ss <<
" double fSum = 0.0;\n";
1829 ss <<
" double fMean = 0.0;\n";
1830 ss <<
" double vSum = 0.0;\n";
1831 ss <<
" double fCount = 0.0;\n";
1832 ss <<
" double arg = 0.0;\n";
1833 unsigned i = vSubArguments.size();
1836 FormulaToken* pCur = vSubArguments[i]->GetFormulaToken();
1838 if(
ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
1845 ss <<
" for (int i = ";
1849 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
1855 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
1861 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
1871 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1872 ss <<
" if (isnan(arg))\n";
1873 ss <<
" continue;\n";
1874 ss <<
" fSum += arg;\n";
1875 ss <<
" fCount += 1.0;\n";
1885 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1886 ss <<
" if (!isnan(arg))\n";
1888 ss <<
" fSum += arg;\n";
1889 ss <<
" fCount += 1.0;\n";
1895 ss <<
" arg = " << pCur->
GetDouble() <<
";\n";
1896 ss <<
" fSum += arg;\n";
1897 ss <<
" fCount += 1.0;\n";
1903 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1904 ss <<
" fSum += arg;\n";
1905 ss <<
" fCount += 1.0;\n";
1910 ss <<
" if(fCount <= 2.0)\n";
1911 ss <<
" return DBL_MAX;\n";
1913 ss <<
" fMean = fSum * pow(fCount,-1.0);\n";
1916 i = vSubArguments.size();
1919 FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
1921 if(
ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
1928 ss <<
" for (int i = ";
1932 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
1938 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
1944 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
1954 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1955 ss <<
" if (isnan(arg))\n";
1956 ss <<
" continue;\n";
1957 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
1967 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1968 ss <<
" if (!isnan(arg))\n";
1970 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
1976 ss <<
" arg = " << pCur->
GetDouble() <<
";\n";
1977 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
1983 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1984 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
1987 ss <<
" double fStdDev = sqrt(vSum * pow(fCount,-1.0));\n";
1988 ss <<
" double dx = 0.0;\n";
1989 ss <<
" double xcube = 0.0;\n";
1990 ss <<
" if(fStdDev == 0.0)\n";
1991 ss <<
" return DBL_MAX;\n";
1992 i = vSubArguments.size();
1995 FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
1997 if(
ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
2004 ss <<
" for (int i = ";
2008 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2014 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
2020 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2030 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
2031 ss <<
" if (isnan(arg))\n";
2032 ss <<
" continue;\n";
2033 ss <<
" dx = (arg - fMean) * pow(fStdDev,-1.0);\n";
2034 ss <<
" xcube = xcube + dx * dx * dx;\n";
2044 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
2045 ss <<
" if (!isnan(arg))\n";
2047 ss <<
" dx = (arg - fMean) * pow(fStdDev,-1.0);\n";
2048 ss <<
" xcube = xcube + dx * dx * dx;\n";
2054 ss <<
" arg = " << pCur->
GetDouble() <<
";\n";
2055 ss <<
" dx = (arg - fMean) * pow(fStdDev,-1.0);\n";
2056 ss <<
" xcube = xcube + dx * dx * dx;\n";
2062 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
2063 ss <<
" dx = (arg - fMean) * pow(fStdDev,-1.0);\n";
2064 ss <<
" xcube = xcube + dx * dx * dx;\n";
2067 ss <<
" return xcube * pow(fCount,-1.0);\n";
2071 void OpTInv::BinInlineFun(std::set<std::string>& decls,
2072 std::set<std::string>& funs)
2100 void OpTInv::GenSlidingWindowFunction(std::stringstream &ss,
2101 const std::string &sSymName,
SubArguments &vSubArguments)
2103 ss <<
"\ndouble " << sSymName;
2104 ss <<
"_" << BinFuncName() <<
"(";
2105 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2109 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2112 ss <<
" int gid0 = get_global_id(0);\n";
2113 ss <<
" double x = 0.0;\n";
2114 ss <<
" double fDF = 0.0;\n";
2115 if(vSubArguments.size() != 2)
2117 ss <<
" return DBL_MAX;\n}\n";
2120 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
2122 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
2128 ss <<
" if(gid0 < ";
2132 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
2133 ss <<
" if(isnan(x))\n";
2134 ss <<
" x = 0.0;\n";
2139 ss <<
" x = " << tmpCur0->
GetDouble() <<
";\n";
2143 ss <<
" return DBL_MAX;\n}\n";
2150 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
2152 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
2154 if(
ocPush == vSubArguments[1]->GetFormulaToken()->GetOpCode())
2160 ss <<
" if(gid0 < ";
2164 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
2165 ss <<
" if(isnan(fDF))\n";
2166 ss <<
" fDF = 0.0;\n";
2168 ss <<
" fDF = floor(fDF);\n";
2173 ss <<
" fDF = floor(convert_double(";
2178 ss <<
" return DBL_MAX;\n}\n";
2184 ss <<
" fDF = floor(";
2185 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
");\n";
2187 ss <<
" if (x > 1.0||fDF < 1.0 || fDF > 1.0E10 || x <= 0.0)\n";
2188 ss <<
" return DBL_MAX;\n";
2189 ss <<
" bool bConvError;\n";
2190 ss <<
" double fVal = lcl_IterateInverse(\n";
2191 ss <<
" fDF*0.5, fDF, &bConvError,x,fDF );\n";
2192 ss <<
" if (bConvError)\n";
2193 ss <<
" return DBL_MAX;\n";
2194 ss <<
" return fVal;\n";
2198 void OpStDev::GenSlidingWindowFunction(std::stringstream &ss,
2199 const std::string &sSymName,
SubArguments &vSubArguments)
2201 ss <<
"\ndouble " << sSymName;
2202 ss <<
"_" << BinFuncName() <<
"(";
2203 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2207 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2210 ss <<
" int gid0 = get_global_id(0);\n";
2211 ss <<
" double fSum = 0.0;\n";
2212 ss <<
" double vSum = 0.0;\n";
2213 ss <<
" double fMean = 0.0;\n";
2214 ss <<
" double fCount = 0.0;\n";
2215 ss <<
" double arg = 0.0;\n";
2216 unsigned i = vSubArguments.size();
2219 FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
2221 if(
ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
2228 ss <<
" for (int i = ";
2232 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2238 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
2244 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2254 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
2255 ss <<
" if (isnan(arg))\n";
2256 ss <<
" continue;\n";
2257 ss <<
" fSum += arg;\n";
2258 ss <<
" fCount += 1.0;\n";
2268 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
2269 ss <<
" if (!isnan(arg))\n";
2271 ss <<
" fSum += arg;\n";
2272 ss <<
" fCount += 1.0;\n";
2278 ss <<
" arg = " << pCur->
GetDouble() <<
";\n";
2279 ss <<
" fSum += arg;\n";
2280 ss <<
" fCount += 1.0;\n";
2286 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
2287 ss <<
" fSum += arg;\n";
2288 ss <<
" fCount += 1.0;\n";
2292 ss <<
" fMean = fSum * pow(fCount,-1.0);\n";
2295 i = vSubArguments.size();
2298 FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
2300 if(
ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
2307 ss <<
" for (int i = ";
2311 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2317 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
2323 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2332 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
2333 ss <<
" if (isnan(arg))\n";
2334 ss <<
" continue;\n";
2335 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
2345 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
2346 ss <<
" if (!isnan(arg))\n";
2348 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
2354 ss <<
" arg = " << pCur->
GetDouble() <<
";\n";
2355 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
2361 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
2362 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
2365 ss <<
" if (fCount <= 1.0)\n";
2366 ss <<
" return DBL_MAX;\n";
2368 ss <<
" return sqrt(vSum * pow(fCount - 1.0,-1.0));\n";
2372 void OpStDevP::GenSlidingWindowFunction(std::stringstream &ss,
2373 const std::string &sSymName,
SubArguments &vSubArguments)
2375 ss <<
"\ndouble " << sSymName;
2376 ss <<
"_" << BinFuncName() <<
"(";
2377 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2381 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2384 ss <<
" int gid0 = get_global_id(0);\n";
2385 ss <<
" double fSum = 0.0;\n";
2386 ss <<
" double fMean = 0.0;\n";
2387 ss <<
" double vSum = 0.0;\n";
2388 ss <<
" double fCount = 0.0;\n";
2389 ss <<
" double arg = 0.0;\n";
2390 unsigned i = vSubArguments.size();
2393 FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
2395 if(
ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
2402 ss <<
" for (int i = ";
2406 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2412 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
2418 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2428 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
2429 ss <<
" if (isnan(arg))\n";
2430 ss <<
" continue;\n";
2431 ss <<
" fSum += arg;\n";
2432 ss <<
" fCount += 1.0;\n";
2442 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
2443 ss <<
" if (!isnan(arg))\n";
2445 ss <<
" fSum += arg;\n";
2446 ss <<
" fCount += 1.0;\n";
2452 ss <<
" arg = " << pCur->
GetDouble() <<
";\n";
2453 ss <<
" fSum += arg;\n";
2454 ss <<
" fCount += 1.0;\n";
2460 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
2461 ss <<
" fSum += arg;\n";
2462 ss <<
" fCount += 1.0;\n";
2467 ss <<
" fMean = fSum * pow(fCount,-1.0);\n";
2470 i = vSubArguments.size();
2473 FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
2475 if(
ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
2482 ss <<
" for (int i = ";
2486 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2492 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
2498 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2508 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
2509 ss <<
" if (isnan(arg))\n";
2510 ss <<
" continue;\n";
2511 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
2521 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
2522 ss <<
" if (!isnan(arg))\n";
2524 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
2530 ss <<
" arg = " << pCur->
GetDouble() <<
";\n";
2531 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
2537 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
2538 ss <<
" vSum += (arg - fMean) * (arg - fMean);\n";
2541 ss <<
" if (fCount == 0.0)\n";
2542 ss <<
" return DBL_MAX;\n";
2544 ss <<
" return sqrt(vSum * pow(fCount,-1.0));\n";
2548 void OpSlope::GenSlidingWindowFunction(std::stringstream &ss,
2549 const std::string &sSymName,
SubArguments &vSubArguments)
2552 ss <<
"\ndouble " << sSymName;
2553 ss <<
"_" << BinFuncName() <<
"(";
2554 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2558 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2561 ss <<
" int gid0 = get_global_id(0);\n";
2562 ss <<
" double fSumX = 0.0;\n";
2563 ss <<
" double fSumY = 0.0;\n";
2564 ss <<
" double fMeanX = 0.0;\n";
2565 ss <<
" double fMeanY = 0.0;\n";
2566 ss <<
" double fSumDeltaXDeltaY = 0.0;\n";
2567 ss <<
" double fSumSqrDeltaX = 0.0;\n";
2568 ss <<
" double fCount = 0.0;\n";
2569 ss <<
" double argX = 0.0;\n";
2570 ss <<
" double argY = 0.0;\n";
2571 FormulaToken *pCur = vSubArguments[1]->GetFormulaToken();
2572 FormulaToken *pCur1 = vSubArguments[0]->GetFormulaToken();
2591 if(nCurWindowSize != nCurWindowSize1)
2593 ss <<
" for (int i = ";
2597 ss <<
"gid0; i < " << arrayLength;
2598 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2604 ss <<
"0; i < " << arrayLength ;
2605 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
2611 ss <<
"0; i + gid0 < " << arrayLength;
2612 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2618 ss <<
"0; i < " << arrayLength <<
"; i++)\n";
2627 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
2629 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
2630 ss <<
" if (isnan(argX) || isnan(argY))\n";
2631 ss <<
" continue;\n";
2632 ss <<
" fSumX += argX;\n";
2633 ss <<
" fSumY += argY;\n";
2634 ss <<
" fCount += 1.0;\n";
2637 ss <<
" if (fCount < 1.0)\n";
2638 ss <<
" return CreateDoubleError(NoValue);\n";
2641 ss <<
" fMeanX = fSumX * pow(fCount,-1.0);\n";
2642 ss <<
" fMeanY = fSumY * pow(fCount,-1.0);\n";
2644 ss <<
" for (int i = ";
2648 ss <<
"gid0; i < " << arrayLength;
2649 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2655 ss <<
"0; i < " << arrayLength ;
2656 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
2662 ss <<
"0; i + gid0 < " << arrayLength;
2663 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2668 ss <<
"0; i < " << arrayLength <<
"; i++)\n";
2673 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
2675 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
2676 ss <<
" if (isnan(argX) || isnan(argY))\n";
2677 ss <<
" continue;\n";
2678 ss <<
" fSumDeltaXDeltaY += (argX-fMeanX)*(argY-fMeanY);\n";
2679 ss <<
" fSumSqrDeltaX += (argX-fMeanX) * (argX-fMeanX);\n";
2681 ss <<
" if(fSumSqrDeltaX == 0.0)\n";
2682 ss <<
" return CreateDoubleError(DivisionByZero);\n";
2685 ss <<
" return fSumDeltaXDeltaY*pow(fSumSqrDeltaX,-1.0);\n";
2691 void OpSTEYX::GenSlidingWindowFunction(std::stringstream &ss,
2692 const std::string &sSymName,
SubArguments &vSubArguments)
2694 ss <<
"\ndouble " << sSymName;
2695 ss <<
"_" << BinFuncName() <<
"(";
2696 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2700 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2703 ss <<
" int gid0 = get_global_id(0);\n";
2704 ss <<
" double fSumX = 0.0;\n";
2705 ss <<
" double fSumY = 0.0;\n";
2706 ss <<
" double fMeanX = 0.0;\n";
2707 ss <<
" double fMeanY = 0.0;\n";
2708 ss <<
" double fSumDeltaXDeltaY = 0.0;\n";
2709 ss <<
" double fSumSqrDeltaX = 0.0;\n";
2710 ss <<
" double fSumSqrDeltaY = 0.0;\n";
2711 ss <<
" double fCount = 0.0;\n";
2712 ss <<
" double argX = 0.0;\n";
2713 ss <<
" double argY = 0.0;\n";
2714 FormulaToken *pCur = vSubArguments[1]->GetFormulaToken();
2715 FormulaToken *pCur1 = vSubArguments[0]->GetFormulaToken();
2730 if(nCurWindowSize != nCurWindowSize1)
2732 ss <<
" return DBL_MAX;\n";
2736 ss <<
" for (int i = ";
2740 ss <<
"gid0; i < " << arrayLength;
2741 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2747 ss <<
"0; i < " << arrayLength;
2748 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
2754 ss <<
"0; i + gid0 < " << arrayLength;
2755 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2761 ss <<
"0; i < " << arrayLength <<
"; i++)\n";
2766 ss <<
"0; i < " << nCurWindowSize <<
"; i++)\n";
2770 ss <<
" return DBL_MAX;\n";
2776 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
2778 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
2779 ss <<
" if (isnan(argX) || isnan(argY))\n";
2780 ss <<
" continue;\n";
2781 ss <<
" fSumX += argX;\n";
2782 ss <<
" fSumY += argY;\n";
2783 ss <<
" fCount += 1.0;\n";
2786 ss <<
" if (fCount < 3.0)\n";
2787 ss <<
" return DBL_MAX;\n";
2790 ss <<
" fMeanX = fSumX * pow(fCount,-1.0);\n";
2791 ss <<
" fMeanY = fSumY * pow(fCount,-1.0);\n";
2793 ss <<
" for (int i = ";
2797 ss <<
"gid0; i < " << arrayLength;
2798 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2804 ss <<
"0; i < " << arrayLength ;
2805 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
2811 ss <<
"0; i + gid0 < " << arrayLength;
2812 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2817 ss <<
"0; i < " << arrayLength <<
"; i++)\n";
2822 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
2824 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
2825 ss <<
" if (isnan(argX)||isnan(argY))\n";
2826 ss <<
" continue;\n";
2827 ss <<
" fSumDeltaXDeltaY +=(argX-fMeanX)*(argY-fMeanY);\n";
2828 ss <<
" fSumSqrDeltaX += (argX-fMeanX)*(argX-fMeanX);\n";
2829 ss <<
" fSumSqrDeltaY += (argY-fMeanY)*(argY-fMeanY);\n";
2831 ss <<
" if(fSumSqrDeltaX == 0.0)\n";
2832 ss <<
" return DBL_MAX;\n";
2835 ss <<
" return sqrt((fSumSqrDeltaY - fSumDeltaXDeltaY * \n";
2836 ss <<
" fSumDeltaXDeltaY*pow(fSumSqrDeltaX,-1.0))\n";
2837 ss <<
" *pow(fCount - 2.0,-1.0));\n";
2844 ss <<
" return DBL_MAX;\n";
2848 void OpFisher::GenSlidingWindowFunction(
2849 std::stringstream &ss,
const std::string &sSymName,
SubArguments &
2852 ss <<
"\ndouble " << sSymName;
2853 ss <<
"_"<< BinFuncName() <<
"(";
2854 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2858 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2861 ss <<
" int gid0=get_global_id(0);\n";
2862 ss <<
" double arg0;\n";
2863 if(vSubArguments.size() != 1)
2865 ss <<
" return DBL_MAX;\n";
2868 FormulaToken *pCur = vSubArguments[0]->GetFormulaToken();
2872 ss <<
" return DBL_MAX;\n";
2879 ss <<
" arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
2881 ss<<
" if(isnan(arg0)||(gid0>=";
2888 ss <<
" arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
2890 ss <<
" if(isnan(arg0))\n";
2891 ss <<
" return DBL_MAX;\n";
2893 ss <<
" if (fabs(arg0) >= 1.0)\n";
2894 ss <<
" return DBL_MAX;\n";
2895 ss <<
" double tmp=0.5*log((1+arg0)*pow((1-arg0),-1));\n";
2896 ss <<
" return tmp;\n";
2900 void OpFisherInv::GenSlidingWindowFunction(
2901 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
2903 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
2906 ss <<
"\ndouble " << sSymName;
2907 ss <<
"_"<< BinFuncName() <<
"(";
2908 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2912 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2915 ss <<
"int gid0=get_global_id(0);\n\t";
2916 ss <<
"double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
2918 ss<<
"if(isnan(arg0)||(gid0>=";
2921 ss<<
"arg0 = 0;\n\t";
2922 ss <<
"double tmp=tanh(arg0);\n\t";
2923 ss <<
"return tmp;\n";
2927 void OpGamma::GenSlidingWindowFunction(
2928 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
2930 ss <<
"\ndouble " << sSymName;
2931 ss <<
"_"<< BinFuncName() <<
"(";
2932 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2936 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2939 ss <<
"int gid0=get_global_id(0);\n\t";
2940 ss <<
"double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
2942 ss <<
"double tmp=tgamma(arg0);\n\t";
2943 ss <<
"return tmp;\n";
2947 void OpCorrel::GenSlidingWindowFunction(
2948 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
2950 if( vSubArguments.size() !=2 ||vSubArguments[0]->GetFormulaToken()
2957 vSubArguments[0]->GetFormulaToken());
2960 vSubArguments[1]->GetFormulaToken());
2964 ss <<
"\ndouble " << sSymName;
2965 ss <<
"_"<< BinFuncName() <<
"(";
2966 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2970 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2973 ss <<
"double vSum = 0.0;\n\t";
2974 ss <<
"double vXSum = 0.0;\n\t";
2975 ss <<
"double vYSum = 0.0;\n\t";
2976 ss <<
"double vXMean = 0.0;\n\t";
2977 ss <<
"double vYMean = 0.0;\n\t";
2979 ss <<
"int gid0 = get_global_id(0);\n\t";
2980 ss <<
"double arg0 = 0.0;\n\t";
2981 ss <<
"double arg1 = 0.0;\n\t";
2982 ss <<
"int cnt = 0;\n\t";
2986 ss <<
"for (int i = ";
2988 ss <<
"gid0; i < " << nCurWindowSizeX <<
"; i++) {\n\t\t";
2989 ss <<
"arg0 = " << vSubArguments[0]
2990 ->GenSlidingWindowDeclRef(
true) <<
";\n\t\t";
2991 ss <<
"arg1 = " << vSubArguments[1]
2992 ->GenSlidingWindowDeclRef(
true) <<
";\n\t\t";
2993 ss <<
"if(isnan(arg0) || isnan(arg1) || (i >= ";
2996 ss <<
"arg0 = 0.0;\n\t\t\t";
2997 ss <<
"arg1 = 0.0;\n\t\t\t";
2998 ss <<
"--cnt;\n\t\t";
3000 ss <<
"++cnt;\n\t\t";
3001 ss <<
"vXSum += arg0;\n\t\t";
3002 ss <<
"vYSum += arg1;\n\t";
3005 ss <<
"0; i < gid0 + " << nCurWindowSizeX <<
"; i++) {\n\t\t";
3006 ss <<
"arg0 = " << vSubArguments[0]
3007 ->GenSlidingWindowDeclRef(
true) <<
";\n\t\t";
3008 ss <<
"arg1 = " << vSubArguments[1]
3009 ->GenSlidingWindowDeclRef(
true) <<
";\n\t\t";
3010 ss <<
"if(isnan(arg0) || isnan(arg1) || (i >= ";
3013 ss <<
"arg0 = 0.0;\n\t\t\t";
3014 ss <<
"arg1 = 0.0;\n\t\t\t";
3015 ss <<
"--cnt;\n\t\t";
3017 ss <<
"++cnt;\n\t\t";
3018 ss <<
"vXSum += arg0;\n\t\t";
3019 ss <<
"vYSum += arg1;\n\t";
3023 ss <<
"0; i < " << nCurWindowSizeX <<
"; i++) {\n\t\t";
3024 ss <<
"arg0 = " << vSubArguments[0]
3025 ->GenSlidingWindowDeclRef(
true) <<
";\n\t\t";
3026 ss <<
"arg1 = " << vSubArguments[1]
3027 ->GenSlidingWindowDeclRef(
true) <<
";\n\t\t";
3028 ss <<
"if(isnan(arg0) || isnan(arg1) || (i >= ";
3031 ss <<
"arg0 = 0.0;\n\t\t\t";
3032 ss <<
"arg1 = 0.0;\n\t\t\t";
3033 ss <<
"--cnt;\n\t\t";
3035 ss <<
"++cnt;\n\t\t";
3036 ss <<
"vXSum += arg0;\n\t\t";
3037 ss <<
"vYSum += arg1;\n\t";
3040 ss <<
"0; i < " << nCurWindowSizeX <<
"; i++) {\n\t\t";
3041 ss <<
"arg0 = " << vSubArguments[0]
3042 ->GenSlidingWindowDeclRef(
true) <<
";\n\t\t";
3043 ss <<
"arg1 = " << vSubArguments[1]
3044 ->GenSlidingWindowDeclRef(
true) <<
";\n\t\t";
3045 ss <<
"if(isnan(arg0) || isnan(arg1) || (i + gid0 >= ";
3048 ss <<
"arg0 = 0.0;\n\t\t\t";
3049 ss <<
"arg1 = 0.0;\n\t\t\t";
3050 ss <<
"--cnt;\n\t\t";
3052 ss <<
"++cnt;\n\t\t";
3053 ss <<
"vXSum += arg0;\n\t\t";
3054 ss <<
"vYSum += arg1;\n\t";
3058 ss <<
"if(cnt < 1) {\n\t\t";
3059 ss <<
"return DBL_MIN;\n\t";
3061 ss <<
"else {\n\t\t";
3062 ss <<
"vXMean = vXSum/cnt;\n\t\t";
3063 ss <<
"vYMean = vYSum/cnt;\n\t\t";
3064 ss <<
"vXSum = 0.0;\n\t\t";
3065 ss <<
"vYSum = 0.0;\n\t\t";
3067 ss <<
"for (int i = ";
3069 ss <<
"gid0; i < " << nCurWindowSizeX <<
"; i++) {\n\t\t\t";
3070 ss <<
"arg0 = " << vSubArguments[0]
3071 ->GenSlidingWindowDeclRef(
true) <<
";\n\t\t\t";
3072 ss <<
"arg1 = " << vSubArguments[1]
3073 ->GenSlidingWindowDeclRef(
true) <<
";\n\t\t\t";
3074 ss <<
"if(isnan(arg0) || isnan(arg1) || (i >= ";
3077 ss <<
"arg0 = vXMean;\n\t\t\t\t";
3078 ss <<
"arg1 = vYMean;\n\t\t\t";
3080 ss <<
"vXSum += pow(arg0 - vXMean, 2);\n\t\t\t";
3081 ss <<
"vYSum += pow(arg1 - vYMean, 2);\n\t\t\t";
3082 ss <<
"vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
3085 ss <<
"0; i < gid0 + " << nCurWindowSizeX <<
"; i++) {\n\t\t\t";
3086 ss <<
"arg0 = " << vSubArguments[0]
3087 ->GenSlidingWindowDeclRef(
true) <<
";\n\t\t\t";
3088 ss <<
"arg1 = " << vSubArguments[1]
3089 ->GenSlidingWindowDeclRef(
true) <<
";\n\t\t\t";
3090 ss <<
"if(isnan(arg0) || isnan(arg1) || (i >= ";
3093 ss <<
"arg0 = vXMean;\n\t\t\t\t";
3094 ss <<
"arg1 = vYMean;\n\t\t\t";
3096 ss <<
"vXSum += pow(arg0 - vXMean, 2);\n\t\t\t";
3097 ss <<
"vYSum += pow(arg1 - vYMean, 2);\n\t\t\t";
3098 ss <<
"vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
3101 ss <<
"0; i < " << nCurWindowSizeX <<
"; i++) {\n\t\t\t";
3102 ss <<
"arg0 = " << vSubArguments[0]
3103 ->GenSlidingWindowDeclRef(
true) <<
";\n\t\t\t";
3104 ss <<
"arg1 = " << vSubArguments[1]
3105 ->GenSlidingWindowDeclRef(
true) <<
";\n\t\t\t";
3106 ss <<
"if(isnan(arg0) || isnan(arg1) || (i >= ";
3109 ss <<
"arg0 = vXMean;\n\t\t\t\t";
3110 ss <<
"arg1 = vYMean;\n\t\t\t";
3112 ss <<
"vXSum += pow(arg0 - vXMean, 2);\n\t\t\t";
3113 ss <<
"vYSum += pow(arg1 - vYMean, 2);\n\t\t\t";
3114 ss <<
"vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
3117 ss <<
"0; i < " << nCurWindowSizeX <<
"; i++) {\n\t\t\t";
3118 ss <<
"arg0 = " << vSubArguments[0]
3119 ->GenSlidingWindowDeclRef(
true) <<
";\n\t\t\t";
3120 ss <<
"arg1 = " << vSubArguments[1]
3121 ->GenSlidingWindowDeclRef(
true) <<
";\n\t\t\t";
3122 ss <<
"if(isnan(arg0) || isnan(arg1) || (i + gid0 >= ";
3125 ss <<
"arg0 = vXMean;\n\t\t\t\t";
3126 ss <<
"arg1 = vYMean;\n\t\t\t";
3128 ss <<
"vXSum += ((arg0 - vXMean)*(arg0 - vXMean));\n\t\t\t";
3129 ss <<
"vYSum += ((arg1 - vYMean)*(arg1 - vYMean));\n\t\t\t";
3130 ss <<
"vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
3134 ss <<
"if(vXSum == 0.0 || vYSum == 0.0) {\n\t\t\t";
3135 ss <<
"return NAN;\n\t\t";
3137 ss <<
"else {\n\t\t\t";
3138 ss <<
"return vSum/pow(vXSum*vYSum, 0.5);\n\t\t";
3144 void OpNegbinomdist::GenSlidingWindowFunction(
3145 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
3147 ss <<
"\ndouble " << sSymName;
3148 ss <<
"_"<< BinFuncName() <<
"(";
3149 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3153 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3157 ss <<
"double f,s,p,tmp0,tmp1,tmp2;\n";
3158 ss <<
" int gid0=get_global_id(0);\n";
3160 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3175 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
3177 ss <<
" if (isnan(";
3178 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
3180 ss <<
" tmp"<<
i<<
"= 0;\n";
3182 ss <<
" tmp"<<i<<
"=\n";
3183 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
3188 ss <<
"tmp"<<
i<<
"="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
3192 ss <<
" p = tmp2;\n";
3193 ss <<
" s = tmp1;\n";
3194 ss <<
" f = tmp0;\n";
3195 ss <<
" double q = 1.0 - p;\n\t";
3196 ss <<
" double fFactor = pow(p,s);\n\t";
3197 ss <<
" for(int i=0; i<f; i++)\n\t";
3199 ss <<
" fFactor *= ((double)i+s)*pow(((double)i+1.0),-1.0)/pow(q,-1);\n";
3201 ss <<
" double temp=fFactor;\n\t";
3202 ss <<
" return temp;\n";
3206 void OpPearson::GenSlidingWindowFunction(
3207 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
3209 if( vSubArguments.size() !=2 ||vSubArguments[0]->GetFormulaToken()
3216 vSubArguments[0]->GetFormulaToken());
3219 vSubArguments[1]->GetFormulaToken());
3225 ss <<
"\ndouble " << sSymName;
3226 ss <<
"_"<< BinFuncName() <<
"(";
3227 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3231 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3235 ss <<
" int gid0=get_global_id(0);\n";
3236 ss <<
" double fCount = 0.0;\n";
3237 ss <<
" double fSumX = 0.0;\n";
3238 ss <<
" double fSumY = 0.0;\n";
3239 ss <<
" double fSumDeltaXDeltaY = 0.0;\n";
3240 ss <<
" double fInx;\n";
3241 ss <<
" double fIny;\n";
3242 ss <<
"for (int i = ";
3245 ss <<
" && i < " << nCurWindowSize <<
"; i++){\n";
3248 ss <<
" && i < gid0+"<< nCurWindowSize <<
"; i++){\n";
3251 ss <<
" && i < "<< nCurWindowSize <<
"; i++){\n";
3254 ss <<
"0; i < "<< nCurWindowSize <<
"; i++){\n";
3256 ss <<
" fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(
true);
3258 ss <<
" fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(
true);
3260 ss <<
" if(!isnan(fInx)&&!isnan(fIny)){\n";
3261 ss <<
" fSumX += fInx;\n";
3262 ss <<
" fSumY += fIny;\n";
3263 ss <<
" fCount = fCount + 1;\n";
3266 ss <<
" if(fCount < 1)\n";
3267 ss <<
" return CreateDoubleError(NoValue);\n";
3268 ss <<
" double fMeanX = fSumX / fCount;\n";
3269 ss <<
" double fMeanY = fSumY / fCount;\n";
3270 ss <<
" fSumX = 0.0;\n";
3271 ss <<
" fSumY = 0.0;\n";
3272 ss <<
"for (int i = ";
3275 ss <<
" && i < " << nCurWindowSize <<
"; i++){\n";
3278 ss <<
" && i < gid0+"<< nCurWindowSize <<
"; i++){\n";
3281 ss <<
" && i < "<< nCurWindowSize <<
"; i++){\n";
3284 ss <<
"0; i < "<< nCurWindowSize <<
"; i++){\n";
3286 ss <<
" fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(
true);
3288 ss <<
" fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(
true);
3290 ss <<
" if(!isnan(fInx)&&!isnan(fIny)){\n";
3291 ss <<
" fSumDeltaXDeltaY += (fInx - fMeanX) * (fIny - fMeanY);\n";
3292 ss <<
" fSumX += (fInx - fMeanX) * (fInx - fMeanX);\n";
3293 ss <<
" fSumY += (fIny - fMeanY) * (fIny - fMeanY);\n";
3296 ss <<
" if (fSumX == 0 || fSumY == 0)\n";
3297 ss <<
" return CreateDoubleError(DivisionByZero);\n";
3298 ss <<
" double tmp = ( fSumDeltaXDeltaY / sqrt( fSumX * fSumY));\n";
3299 ss <<
" return tmp;\n";
3303 void OpGammaLn::GenSlidingWindowFunction(
3304 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
3306 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
3309 ss <<
"\ndouble " << sSymName;
3310 ss <<
"_"<< BinFuncName() <<
"(";
3311 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3315 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3318 ss <<
"int gid0=get_global_id(0);\n\t";
3319 ss <<
"double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
3321 ss<<
"if(isnan(arg0)||(gid0>=";
3324 ss<<
"arg0 = 0;\n\t";
3325 ss <<
"double tmp=lgamma(arg0);\n\t";
3326 ss <<
"return tmp;\n";
3329 void OpGauss::BinInlineFun(std::set<std::string>& decls,
3330 std::set<std::string>& funs)
3338 void OpGauss::GenSlidingWindowFunction(
3339 std::stringstream &ss,
const std::string &sSymName,
SubArguments &
3342 ss <<
"\ndouble " << sSymName;
3343 ss <<
"_"<< BinFuncName() <<
"(";
3344 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3348 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3351 ss <<
" int gid0=get_global_id(0);\n";
3352 ss <<
" double arg0;\n";
3353 if(vSubArguments.size() != 1)
3355 ss <<
" return DBL_MAX;\n";
3358 FormulaToken *pCur = vSubArguments[0]->GetFormulaToken();
3362 ss <<
" return DBL_MAX;\n";
3369 ss <<
" arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
3371 ss<<
" if(isnan(arg0)||(gid0>=";
3378 ss <<
" arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
3380 ss <<
" if(isnan(arg0))\n";
3381 ss <<
" return DBL_MAX;\n";
3383 ss <<
" double tmp=gauss(arg0);\n";
3384 ss <<
" return tmp;\n";
3388 void OpGeoMean::GenSlidingWindowFunction(
3389 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
3391 ss <<
"__kernel void ";
3392 ss <<
"GeoMean_reduction( ";
3393 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3397 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3399 ss <<
", __global double *result)\n";
3401 ss <<
" double tmp =0;\n";
3402 ss <<
" int count = 0;\n";
3404 GenTmpVariables(ss,vSubArguments);
3405 ss <<
" double current_sum = 0.0;\n";
3406 ss <<
" int windowSize;\n";
3407 ss <<
" int arrayLength;\n";
3408 ss <<
" int current_count = 0;\n";
3409 ss <<
" int writePos = get_group_id(1);\n";
3410 ss <<
" int lidx = get_local_id(0);\n";
3411 ss <<
" __local double shm_buf[256];\n";
3412 ss <<
" __local int count_buf[256];\n";
3413 ss <<
" int loop;\n";
3414 ss <<
" int offset;\n";
3415 ss <<
" barrier(CLK_LOCAL_MEM_FENCE);\n";
3419 assert(rArg->GetFormulaToken());
3421 if(rArg->GetFormulaToken()->GetType() ==
3432 ss <<
" offset = 0;\n";
3434 ss <<
" offset = get_group_id(1);\n";
3437 ss <<
" windowSize = ";
3438 ss << nCurWindowSize;
3440 ss <<
" arrayLength = ";
3443 ss <<
" loop = arrayLength/512 + 1;\n";
3444 ss <<
" for (int l=0; l<loop; l++){\n";
3445 ss <<
" tmp = 0.0;\n";
3446 ss <<
" count = 0;\n";
3447 ss <<
" int loopOffset = l*512;\n";
3448 ss <<
" int p1 = loopOffset + lidx + offset, p2 = p1 + 256;\n";
3449 ss <<
" if (p2 < min(offset + windowSize, arrayLength)) {\n";
3450 ss <<
" tmp0 = 0.0;\n";
3451 std::string p1 =
"p1";
3452 std::string p2 =
"p2";
3455 rArg->GenDeclRef(ss);
3456 ss <<
"["<<p1.c_str()<<
"];\n";
3457 ss <<
" if(!isnan(tmp0))\n";
3459 ss <<
" tmp += log(tmp0);\n";
3460 ss <<
" count++;\n";
3464 rArg->GenDeclRef(ss);
3465 ss <<
"["<<p2.c_str()<<
"];\n";
3466 ss <<
" if(!isnan(tmp0))\n";
3468 ss <<
" tmp += log(tmp0);\n";
3469 ss <<
" count++;\n";
3473 ss <<
" else if (p1 < min(arrayLength, offset + windowSize)) {\n";
3476 rArg->GenDeclRef(ss);
3477 ss <<
"["<<p1.c_str()<<
"];\n";
3478 ss <<
" if(!isnan(tmp0))\n";
3480 ss <<
" tmp += log(tmp0);\n";
3481 ss <<
" count++;\n";
3485 ss <<
" shm_buf[lidx] = tmp;\n";
3486 ss <<
" count_buf[lidx] = count;\n";
3487 ss <<
" barrier(CLK_LOCAL_MEM_FENCE);\n";
3489 ss <<
" for (int i = 128; i >0; i/=2) {\n";
3490 ss <<
" if (lidx < i)\n";
3492 ss <<
" shm_buf[lidx] += shm_buf[lidx + i];\n";
3493 ss <<
" count_buf[lidx] += count_buf[lidx + i];\n";
3495 ss <<
" barrier(CLK_LOCAL_MEM_FENCE);\n";
3497 ss <<
" if (lidx == 0)\n";
3499 ss <<
" current_sum += shm_buf[0];\n";
3500 ss <<
" current_count += count_buf[0];\n";
3504 ss <<
" barrier(CLK_LOCAL_MEM_FENCE);\n";
3508 ss <<
" if (lidx == 0)\n";
3513 rArg->GenDeclRef(ss);
3514 ss <<
"[writePos];\n";
3518 rArg->GenDeclRef(ss);
3522 ss <<
" if(!isnan(tmp0))\n";
3524 ss <<
" current_sum += log(tmp0);\n";
3525 ss <<
" current_count++;\n";
3531 ss <<
" if (lidx == 0)\n";
3532 ss <<
" result[writePos] = exp(current_sum/current_count);\n";
3535 ss <<
"\ndouble " << sSymName;
3536 ss <<
"_"<< BinFuncName() <<
"(";
3537 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3541 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3544 ss <<
" int gid0=get_global_id(0);\n";
3545 ss <<
" double tmp =0;\n";
3547 vSubArguments[0]->GenDeclRef(ss);
3549 ss <<
" return tmp;\n";
3553 void OpHarMean::GenSlidingWindowFunction(
3554 std::stringstream &ss,
const std::string &sSymName,
SubArguments &
3558 ss <<
"\ndouble " << sSymName;
3559 ss <<
"_"<< BinFuncName() <<
"( ";
3560 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3564 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3568 ss <<
" int gid0 = get_global_id(0);\n";
3569 ss <<
" double nVal=0.0;\n";
3570 ss <<
" double tmp = 0;\n";
3571 ss <<
" int length;\n";
3572 ss <<
" int totallength=0;\n";
3573 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3582 ss <<
" length="<<nCurWindowSize;
3584 ss <<
" for (int i = ";
3585 ss <<
"0; i < "<< nCurWindowSize <<
"; i++)\n";
3587 ss <<
" double arg"<<
i<<
" = ";
3588 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
3590 ss <<
" if(isnan(arg"<<i<<
")||((gid0+i)>=";
3594 ss <<
" length--;\n";
3595 ss <<
" continue;\n";
3597 ss <<
" nVal += (1.0 *pow(";
3598 ss <<
" arg"<<i<<
",-1));\n";
3600 ss <<
" totallength +=length;\n";
3605 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
3607 ss <<
" if(!isnan(tmp))\n";
3609 ss <<
" nVal += (1.0 * pow( tmp,-1));\n";
3610 ss <<
" totallength +=1;\n";
3616 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
3618 ss <<
" nVal += (1.0 *pow( tmp,-1));\n";
3619 ss <<
" totallength +=1;\n";
3623 ss <<
" return DBL_MIN;\n";
3626 ss <<
" tmp = totallength*pow(nVal,-1);\n";
3627 ss <<
" return tmp;\n";
3631 void OpConfidence::BinInlineFun(std::set<std::string>& decls,
3632 std::set<std::string>& funs)
3638 void OpConfidence::GenSlidingWindowFunction(std::stringstream& ss,
3639 const std::string &sSymName,
SubArguments& vSubArguments)
3641 ss <<
"\ndouble " << sSymName;
3642 ss <<
"_"<< BinFuncName() <<
"(";
3643 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3647 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3650 ss <<
" double tmp = " << GetBottom() <<
";\n";
3651 ss <<
" int gid0 = get_global_id(0);\n";
3652 ss <<
" double alpha = " << GetBottom() <<
";\n";
3653 ss <<
" double sigma = " << GetBottom() <<
";\n";
3654 ss <<
" double size = " << GetBottom() <<
";\n";
3655 ss <<
" double tmp0,tmp1,tmp2;\n";
3657 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3672 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
3674 ss <<
" if (isnan(";
3675 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
3677 ss <<
" tmp"<<
i<<
"= 0;\n";
3679 ss <<
" tmp"<<i<<
"=\n";
3680 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
3685 ss <<
"tmp"<<
i<<
"="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
3689 ss <<
" alpha = tmp0;\n";
3690 ss <<
" sigma = tmp1;\n";
3691 ss <<
" size = tmp2;\n";
3692 ss <<
" double rn = floor(size);\n";
3693 ss <<
" if(sigma <= 0.0 || alpha <= 0.0 || alpha >= 1.0";
3694 ss <<
"|| rn < 1.0)\n";
3695 ss <<
" tmp = -DBL_MAX;\n";
3697 ss <<
" tmp = gaussinv(1.0 - alpha * pow(2.0,-1.0)) * sigma ";
3698 ss <<
"* pow(sqrt( rn ),-1);\n";
3699 ss <<
" return tmp;\n";
3703 void OpCritBinom::BinInlineFun(std::set<std::string>& decls,
3704 std::set<std::string>& funs)
3710 void OpCritBinom::GenSlidingWindowFunction(std::stringstream& ss,
3711 const std::string &sSymName,
SubArguments& vSubArguments)
3713 ss <<
"\ndouble " << sSymName;
3714 ss <<
"_"<< BinFuncName() <<
"(";
3715 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3719 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3722 ss <<
" double tmp = " << GetBottom() <<
";\n";
3723 ss <<
" int gid0 = get_global_id(0);\n";
3724 ss <<
" double n = " << GetBottom() <<
";\n";
3725 ss <<
" double p = " << GetBottom() <<
";\n";
3726 ss <<
" double alpha = " << GetBottom() <<
";\n";
3727 ss <<
" double tmp0 = 0.0,tmp1 = 0.0,tmp2 = 0.0;\n";
3729 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3744 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
3746 ss <<
" if (isnan(";
3747 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
3749 ss <<
" tmp"<<
i<<
"= 0;\n";
3751 ss <<
" tmp"<<i<<
"=\n";
3752 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
3757 ss <<
"tmp"<<
i<<
"="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
3761 ss <<
" n = tmp0;\n";
3762 ss <<
" p = tmp1;\n";
3763 ss <<
" alpha = tmp2;\n";
3764 ss <<
" double rn = floor(n);\n";
3765 ss <<
" if (rn < 0.0 || alpha <= 0.0 || alpha >= 1.0 || p < 0.0";
3766 ss <<
" || p > 1.0)\n";
3767 ss <<
" tmp = -DBL_MIN;\n";
3770 ss <<
" double rq = (0.5 - p) + 0.5;\n";
3771 ss <<
" double fFactor = pow(rq, rn);\n";
3772 ss <<
" if (fFactor <= Min)\n";
3774 ss <<
" fFactor = pow(p, rn);\n";
3775 ss <<
" if (fFactor <= Min)\n";
3776 ss <<
" tmp = -DBL_MAX;\n";
3779 ss <<
" double fSum = 1.0 - fFactor;\n";
3780 ss <<
" uint max =(uint)(rn), i;\n";
3781 ss <<
" for (i = 0; i < max && fSum >= alpha; i++)\n";
3783 ss <<
" fFactor *= (rn - i) * pow((double)(i + 1),-1.0) *";
3784 ss <<
" rq * pow(p, -1.0);\n";
3785 ss <<
" fSum -= fFactor;\n";
3787 ss <<
" tmp = (rn - i);\n";
3792 ss <<
" double fSum = fFactor;\n";
3793 ss <<
" uint max = (uint)(rn), i;\n";
3794 ss <<
" for (i = 0; i < max && fSum < alpha; i++)\n";
3796 ss <<
" fFactor *= (rn - i) * pow((double)(i + 1), -1.0) *";
3797 ss <<
" p * pow(rq, -1.0);\n";
3798 ss <<
" fSum += fFactor;\n";
3800 ss <<
" tmp = (i);\n";
3803 ss <<
" return tmp;\n";
3807 void OpRsq::GenSlidingWindowFunction(
3808 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
3810 if( vSubArguments.size() !=2 ||vSubArguments[0]->GetFormulaToken()
3817 vSubArguments[0]->GetFormulaToken());
3820 vSubArguments[1]->GetFormulaToken());
3826 ss <<
"\ndouble " << sSymName;
3827 ss <<
"_"<< BinFuncName() <<
"(";
3828 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3832 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3836 ss <<
" int gid0=get_global_id(0);\n";
3837 ss <<
" double fCount = 0.0;\n";
3838 ss <<
" double fSumX = 0.0;\n";
3839 ss <<
" double fSumY = 0.0;\n";
3840 ss <<
" double fSumDeltaXDeltaY = 0.0;\n";
3841 ss <<
" double fInx;\n";
3842 ss <<
" double fIny;\n";
3843 ss <<
" double tmp0,tmp1;\n";
3847 ss <<
" for(int i=0; i<"<<nCurWindowSize<<
"; i++)\n";
3850 ss << vSubArguments[0]->GenSlidingWindowDeclRef(
true);
3852 ss <<
" fInx = 0;\n";
3854 ss <<
" fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
3857 ss << vSubArguments[1]->GenSlidingWindowDeclRef(
true);
3859 ss <<
" fIny = 0;\n";
3861 ss <<
" fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
3863 ss <<
" fSumX += fInx;\n";
3864 ss <<
" fSumY += fIny;\n";
3865 ss <<
" fCount = fCount + 1;\n";
3867 ss <<
" double fMeanX = fSumX / fCount;\n";
3868 ss <<
" double fMeanY = fSumY / fCount;\n";
3869 ss <<
" fSumX = 0.0;\n";
3870 ss <<
" fSumY = 0.0;\n";
3871 ss <<
" for(int i=0; i<"<<nCurWindowSize<<
"; i++)\n";
3874 ss << vSubArguments[0]->GenSlidingWindowDeclRef(
true);
3876 ss <<
" fInx = 0;\n";
3878 ss <<
" fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
3881 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
3883 ss <<
" fIny = 0;\n";
3885 ss <<
" fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
3887 ss <<
" fSumDeltaXDeltaY += (fInx - fMeanX) * (fIny - fMeanY);\n";
3888 ss <<
" fSumX += pow(fInx - fMeanX,2);\n";
3889 ss <<
" fSumY += pow(fIny - fMeanY,2);\n";
3891 ss <<
" double tmp = pow( fSumDeltaXDeltaY,2) / (fSumX * fSumY);\n";
3892 ss <<
" return tmp ;\n";
3896 void OpChiInv::BinInlineFun(std::set<std::string>& decls,
3897 std::set<std::string>& funs)
3918 void OpChiInv::GenSlidingWindowFunction(
3919 std::stringstream &ss,
const std::string &sSymName,
3922 ss <<
"\ndouble " << sSymName;
3923 ss <<
"_"<< BinFuncName() <<
"(";
3924 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3928 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3932 ss <<
" double tmp0,tmp1,tmp;\n";
3933 ss <<
" int gid0=get_global_id(0);\n";
3935 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3944 ss <<
"for (int i = ";
3947 ss <<
" && i < " << nCurWindowSize <<
"; i++){\n";
3950 ss <<
" && i < gid0+"<< nCurWindowSize <<
"; i++){\n";
3953 ss <<
" && i < "<< nCurWindowSize <<
"; i++){\n";
3955 ss <<
"0; i < "<< nCurWindowSize <<
"; i++){\n";
3969 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
3972 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
3974 ss <<
" tmp"<<
i<<
"= 0;\n";
3976 ss <<
"tmp"<<i<<
"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
3981 ss <<
"tmp"<<
i<<
"="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
3985 ss <<
" tmp1 = floor(tmp1);";
3986 ss <<
" if (tmp1 < 1.0 || tmp0 <= 0.0 || tmp0 > 1.0 )\n";
3988 ss <<
" return DBL_MIN;\n";
3990 ss <<
" bool bConvError;\n";
3991 ss <<
" double fVal = lcl_IterateInverseChiInv";
3992 ss <<
"(tmp0, tmp1, tmp1*0.5, tmp1, &bConvError);\n";
3993 ss <<
" if(bConvError)\n";
3994 ss <<
" return DBL_MIN;\n";
3995 ss <<
" return fVal;\n";
3998 void OpNormdist::GenSlidingWindowFunction(
3999 std::stringstream &ss,
const std::string &sSymName,
4003 ss <<
"\ndouble " << sSymName;
4004 ss <<
"_"<< BinFuncName() <<
"(";
4005 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4009 vSubArguments[
i]->GenSlidingWindowDecl(ss);
4013 ss <<
" double x,mue,sigma,c;\n";
4014 ss <<
" int gid0=get_global_id(0);\n";
4015 ss <<
" double tmp0,tmp1,tmp2;\n";
4016 ss <<
" double tmp3 = 0;\n";
4018 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4032 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
4034 ss <<
" if (isnan(";
4035 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
4037 ss <<
" tmp"<<
i<<
"= 0;\n";
4039 ss <<
" tmp"<<i<<
"=\n";
4040 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
4045 ss <<
"tmp"<<
i<<
"="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
4049 ss <<
"x = tmp0;\n";
4050 ss <<
"mue = tmp1;\n";
4051 ss <<
"sigma = tmp2;\n";
4052 ss <<
"c = tmp3;\n";
4053 ss <<
"if(sigma <= 0)\n";
4054 ss <<
" return CreateDoubleError(IllegalArgument);\n";
4055 ss <<
"double mid,tmp;\n";
4056 ss <<
"mid = (x - mue)/sigma;\n";
4058 ss <<
" tmp = 0.5 *erfc(-mid * 0.7071067811865475);\n";
4060 ss <<
" tmp=(0.39894228040143268*exp(-pow(mid,2)/2.0))/sigma;\n";
4061 ss <<
"return tmp;\n";
4064 void OpNormsdist::GenSlidingWindowFunction(
4065 std::stringstream &ss,
const std::string &sSymName,
4068 ss <<
"\ndouble " << sSymName;
4069 ss <<
"_"<< BinFuncName() <<
"(";
4070 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4074 vSubArguments[
i]->GenSlidingWindowDecl(ss);
4078 ss <<
" double x = 0,tmp0 = 0;\n";
4079 ss <<
" int gid0=get_global_id(0);\n";
4081 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4096 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
4098 ss <<
" if (isnan(";
4099 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
4101 ss <<
" tmp"<<
i<<
"= 0;\n";
4103 ss <<
" tmp"<<i<<
"=\n";
4104 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
4109 ss <<
"tmp"<<
i<<
"="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
4113 ss <<
" x = tmp0;\n";
4114 ss <<
" double tmp = 0.5 * erfc((-1)*x * 0.7071067811865475);\n";
4115 ss <<
" return tmp;\n";
4119 void OpPermut::GenSlidingWindowFunction(
4120 std::stringstream &ss,
const std::string &sSymName,
4123 ss <<
"\ndouble " << sSymName;
4124 ss <<
"_"<< BinFuncName() <<
"(";
4125 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4129 vSubArguments[
i]->GenSlidingWindowDecl(ss);
4132 ss <<
" int gid0=get_global_id(0);\n";
4133 ss <<
" double inA;\n";
4134 ss <<
" double inB;\n";
4135 ss <<
" double tmp0,tmp1;\n";
4136 ss <<
" double tmp = 1 ;\n";
4138 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4154 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
4156 ss <<
" if (isnan(";
4157 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
4159 ss <<
" tmp"<<
i<<
"= 0;\n";
4161 ss <<
" tmp"<<i<<
"=\n";
4162 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
4167 ss <<
"tmp"<<
i<<
"="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
4171 ss <<
" inA = tmp0;\n";
4172 ss <<
" inB = tmp1;\n";
4173 ss <<
" for( int i =0; i<inB; i++)\n";
4175 ss <<
" tmp *= inA ;\n";
4176 ss <<
" inA = inA - 1.0;\n";
4178 ss <<
" return tmp;\n";
4181 void OpPermutationA::GenSlidingWindowFunction(
4182 std::stringstream &ss,
const std::string &sSymName,
4185 ss <<
"\ndouble " << sSymName;
4186 ss <<
"_"<< BinFuncName() <<
"(";
4187 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4191 vSubArguments[
i]->GenSlidingWindowDecl(ss);
4194 ss <<
" int gid0=get_global_id(0);\n";
4195 ss <<
" double inA;\n";
4196 ss <<
" double inB;\n";
4197 ss <<
" double tmp = 1.0;\n";
4198 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
4201 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
4204 ss <<
"int buffer_fIna_len = ";
4207 ss <<
" int buffer_fInb_len = ";
4210 ss <<
" if((gid0)>=buffer_fIna_len || isnan(";
4211 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
4213 ss <<
" inA = 0;\nelse \n";
4214 ss <<
" inA = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
4216 ss <<
"if((gid0)>=buffer_fInb_len || isnan(";
4217 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
4219 ss <<
"inB = 0;\nelse \n";
4220 ss <<
" inB = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
4222 ss <<
" for(int i=0; i<inB; i++)\n";
4224 ss <<
" tmp *= inA;\n";
4226 ss <<
" return tmp;\n";
4230 void OpPhi::GenSlidingWindowFunction(
4231 std::stringstream &ss,
const std::string &sSymName,
4234 ss <<
"\ndouble " << sSymName;
4235 ss <<
"_"<< BinFuncName() <<
"(";
4236 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4240 vSubArguments[
i]->GenSlidingWindowDecl(ss);
4244 ss <<
" double x,tmp0;\n";
4245 ss <<
" int gid0=get_global_id(0);\n";
4247 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4262 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
4264 ss <<
" if (isnan(";
4265 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
4267 ss <<
" tmp"<<
i<<
"= 0;\n";
4269 ss <<
" tmp"<<i<<
"=\n";
4270 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
4275 ss <<
"tmp"<<
i<<
"="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
4279 ss <<
" x = tmp0;\n";
4280 ss <<
" double tmp = 0.39894228040143268 * exp((-1)*pow(x,2) / 2.0);\n";
4281 ss <<
" return tmp;\n";
4285 void OpNorminv::GenSlidingWindowFunction(
4286 std::stringstream &ss,
const std::string &sSymName,
4289 ss <<
"\ndouble " << sSymName;
4290 ss <<
"_"<< BinFuncName() <<
"(";
4291 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4295 vSubArguments[
i]->GenSlidingWindowDecl(ss);
4299 ss <<
" double q,t,z;\n";
4300 ss <<
" double x,mue,sigma;\n";
4301 ss <<
" double tmp0,tmp1,tmp2;\n";
4302 ss <<
" int gid0=get_global_id(0);\n";
4304 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4319 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
4321 ss <<
" if (isnan(";
4322 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
4324 ss <<
" tmp"<<
i<<
"= 0;\n";
4326 ss <<
" tmp"<<i<<
"=\n";
4327 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
4332 ss <<
"tmp"<<
i<<
"="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
4336 ss <<
" x = tmp0;\n";
4337 ss <<
" mue = tmp1;\n";
4338 ss <<
" sigma = tmp2;\n";
4339 ss <<
" q = x -0.5;\n";
4340 ss <<
" if(fabs(q)<=.425)\n";
4342 ss <<
" t=0.180625-pow(q,2);\n";
4352 "t*2509.0809287301226727";
4353 ss <<
"+33430.575583588128105\n"
4355 "*t+67265.770927008700853\n"
4357 "*t+45921.953931549871457\n"
4359 "*t+13731.693765509461125\n"
4361 "*t+1971.5909503065514427\n"
4363 "*t+133.14166789178437745\n"
4365 "*t+3.387132872796366608\n"
4375 "t*5226.495278852854561";
4376 ss <<
"+28729.085735721942674\n"
4378 "*t+39307.89580009271061\n"
4380 "*t+21213.794301586595867\n"
4382 "*t+5394.1960214247511077\n"
4384 "*t+687.1870074920579083\n"
4386 "*t+42.313330701600911252\n"
4390 ss <<
"}\nelse\n{\n";
4391 ss <<
" if(q>0)\nt=1-x;\n";
4392 ss <<
"else\nt=x;\n";
4393 ss <<
"t=sqrt(-log(t));\n";
4394 ss <<
"if(t<=5.0)\n{\n";
4404 "t*7.7454501427834140764e-4";
4405 ss <<
"+0.0227238449892691845833\n"
4407 "*t+0.24178072517745061177\n"
4409 "*t+1.27045825245236838258\n"
4411 "*t+3.64784832476320460504\n"
4413 "*t+5.7694972214606914055\n"
4415 "*t+4.6303378461565452959\n"
4417 "*t+1.42343711074968357734\n"
4427 "t*1.05075007164441684324e-9";
4428 ss <<
"+5.475938084995344946e-4\n"
4430 "*t+0.0151986665636164571966\n"
4432 "*t+0.14810397642748007459\n"
4434 "*t+0.68976733498510000455\n"
4436 "*t+1.6763848301838038494\n"
4438 "*t+2.05319162663775882187\n"
4452 "t*2.01033439929228813265e-7";
4453 ss<<
"+2.71155556874348757815e-5\n"
4455 "*t+0.0012426609473880784386\n"
4457 "*t+0.026532189526576123093\n"
4459 "*t+0.29656057182850489123\n"
4461 "*t+1.7848265399172913358\n"
4463 "*t+5.4637849111641143699\n"
4465 "*t+6.6579046435011037772\n"
4475 "t*2.04426310338993978564e-15"
4476 "+1.4215117583164458887e-7\n"
4478 "*t+1.8463183175100546818e-5\n"
4480 "*t+7.868691311456132591e-4\n"
4482 "*t+0.0148753612908506148525\n"
4484 "*t+0.13692988092273580531\n"
4486 "*t+0.59983220655588793769\n"
4491 ss <<
"z = q < 0.0 ? (-1)*z : z;\n";
4493 ss<<
"double tmp = z*sigma + mue;\n";
4494 ss<<
"return tmp;\n";
4497 void OpNormsinv:: GenSlidingWindowFunction
4498 (std::stringstream &ss,
const std::string &sSymName,
4501 ss <<
"\ndouble " << sSymName;
4502 ss <<
"_"<< BinFuncName() <<
"(";
4503 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4507 vSubArguments[
i]->GenSlidingWindowDecl(ss);
4511 ss <<
" double q,t,z,x,tmp0;\n";
4512 ss <<
" int gid0=get_global_id(0);\n";
4514 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4529 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
4531 ss <<
" if (isnan(";
4532 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
4534 ss <<
" tmp"<<
i<<
"= 0;\n";
4536 ss <<
" tmp"<<i<<
"=\n";
4537 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
4542 ss <<
"tmp"<<
i<<
"="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
4546 ss <<
" x = tmp0;\n";
4547 ss <<
" q = x -0.5;\n";
4548 ss <<
" if(fabs(q)<=.425)\n";
4550 ss <<
" t=0.180625-pow(q,2);\n";
4560 "t*2509.0809287301226727";
4561 ss <<
"+33430.575583588128105\n"
4563 "*t+67265.770927008700853\n"
4565 "*t+45921.953931549871457\n"
4567 "*t+13731.693765509461125\n"
4569 "*t+1971.5909503065514427\n"
4571 "*t+133.14166789178437745\n"
4573 "*t+3.387132872796366608\n"
4583 "t*5226.495278852854561";
4584 ss <<
"+28729.085735721942674\n"
4586 "*t+39307.89580009271061\n"
4588 "*t+21213.794301586595867\n"
4590 "*t+5394.1960214247511077\n"
4592 "*t+687.1870074920579083\n"
4594 "*t+42.313330701600911252\n"
4598 ss <<
"}\nelse\n{\n";
4599 ss <<
" if(q>0)\nt=1-x;\n";
4600 ss <<
"else\nt=x;\n";
4601 ss <<
"t=sqrt(-log(t));\n";
4602 ss <<
"if(t<=5.0)\n{\n";
4612 "t*7.7454501427834140764e-4";
4613 ss <<
"+0.0227238449892691845833\n"
4615 "*t+0.24178072517745061177\n"
4617 "*t+1.27045825245236838258\n"
4619 "*t+3.64784832476320460504\n"
4621 "*t+5.7694972214606914055\n"
4623 "*t+4.6303378461565452959\n"
4625 "*t+1.42343711074968357734\n"
4635 "t*1.05075007164441684324e-9";
4636 ss <<
"+5.475938084995344946e-4\n"
4638 "*t+0.0151986665636164571966\n"
4640 "*t+0.14810397642748007459\n"
4642 "*t+0.68976733498510000455\n"
4644 "*t+1.6763848301838038494\n"
4646 "*t+2.05319162663775882187\n"