20 void OpCos::GenSlidingWindowFunction(std::stringstream &ss,
21 const std::string &sSymName,
SubArguments &vSubArguments)
23 ss <<
"\ndouble " << sSymName;
24 ss <<
"_"<< BinFuncName() <<
"(";
25 for (
size_t i = 0;
i < vSubArguments.size();
i++)
28 vSubArguments[
i]->GenSlidingWindowDecl(ss);
32 ss <<
" int gid0=get_global_id(0);\n";
33 ss <<
" double arg0 = 0.0f;\n";
34 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
36 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
44 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
47 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
51 ss <<
" { arg0 = 0.0f; }\n";
55 ss <<
" arg0=" << tmpCur->
GetDouble() <<
";\n";
61 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
64 ss <<
" return cos(arg0);\n";
68 void OpSec::GenSlidingWindowFunction(std::stringstream &ss,
69 const std::string &sSymName,
SubArguments &vSubArguments)
71 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
74 ss <<
"\ndouble " << sSymName;
75 ss <<
"_"<< BinFuncName() <<
"(";
76 for (
size_t i = 0;
i < vSubArguments.size();
i++)
80 vSubArguments[
i]->GenSlidingWindowDecl(ss);
83 ss <<
" int gid0=get_global_id(0);\n";
84 ss <<
" double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
86 ss<<
" if(isnan(arg0)||(gid0>=";
90 ss <<
" return pow(cos(arg0),-1 );\n";
93 void OpCosh::BinInlineFun(std::set<std::string>& decls,
94 std::set<std::string>& funs)
99 void OpSecH::GenSlidingWindowFunction(std::stringstream &ss,
100 const std::string &sSymName,
SubArguments &vSubArguments)
102 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
105 ss <<
"\ndouble " << sSymName;
106 ss <<
"_"<< BinFuncName() <<
"(";
107 for (
size_t i = 0;
i < vSubArguments.size();
i++)
111 vSubArguments[
i]->GenSlidingWindowDecl(ss);
114 ss <<
" int gid0=get_global_id(0);\n";
115 ss <<
" double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
117 ss<<
" if(isnan(arg0)||(gid0>=";
121 ss <<
" return pow(cosh(arg0),-1 );\n";
124 void OpMROUND::GenSlidingWindowFunction(std::stringstream &ss,
125 const std::string &sSymName,
SubArguments &vSubArguments)
128 ss <<
"\ndouble " << sSymName;
129 ss <<
"_"<< BinFuncName() <<
"(";
130 for (
size_t i = 0;
i < vSubArguments.size();
i++)
134 vSubArguments[
i]->GenSlidingWindowDecl(ss);
137 ss<<
" double tmp = 0;\n";
138 ss<<
" int gid0 = get_global_id(0);\n";
139 ss<<
" double arg0=0;\n";
140 ss<<
" double arg1=0;\n";
143 for (
size_t i = 0;
i < vSubArguments.size();
i++)
158 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
161 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
163 ss <<
" if (isnan(tmp))\n";
164 ss <<
" arg"<<
i<<
"= 0;\n";
166 ss <<
" arg"<<i<<
"=tmp;\n";
171 ss<<
" arg"<<
i<<
"="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
175 ss<<
" if(arg1==0)\n";
176 ss<<
" return arg1;\n";
177 ss<<
" tmp=arg1 * round(arg0 * pow(arg1,-1));\n";
178 ss<<
" return tmp;\n";
181 void OpCosh::GenSlidingWindowFunction(std::stringstream &ss,
182 const std::string &sSymName,
SubArguments &vSubArguments)
184 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
187 ss <<
"\ndouble " << sSymName;
188 ss <<
"_"<< BinFuncName() <<
"(";
189 for (
size_t i = 0;
i < vSubArguments.size();
i++)
193 vSubArguments[
i]->GenSlidingWindowDecl(ss);
196 ss <<
" int gid0=get_global_id(0);\n";
197 ss <<
" double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
199 ss<<
" if(isnan(arg0)||(gid0>=";
203 ss <<
" double tmp=local_cosh(arg0);\n";
204 ss <<
" return tmp;\n";
208 void OpCot::GenSlidingWindowFunction(std::stringstream &ss,
209 const std::string &sSymName,
SubArguments &vSubArguments)
211 ss <<
"\ndouble " << sSymName;
212 ss <<
"_"<< BinFuncName() <<
"(";
213 for (
size_t i = 0;
i < vSubArguments.size();
i++)
217 vSubArguments[
i]->GenSlidingWindowDecl(ss);
221 ss <<
" int gid0=get_global_id(0);\n";
222 ss <<
" double arg0 = 0.0f;\n";
223 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
225 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
233 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
236 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
240 ss <<
" { arg0 = 0.0f; }\n";
251 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
254 ss <<
" arg0 = arg0 * M_1_PI;\n";
255 ss <<
" return cospi(arg0) * pow(sinpi(arg0), -1);\n";
259 void OpCoth::BinInlineFun(std::set<std::string>& decls,
260 std::set<std::string>& funs)
266 void OpCoth::GenSlidingWindowFunction(std::stringstream &ss,
267 const std::string &sSymName,
SubArguments &vSubArguments)
269 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
272 ss <<
"\ndouble " << sSymName;
273 ss <<
"_"<< BinFuncName() <<
"(";
274 for (
size_t i = 0;
i < vSubArguments.size();
i++)
278 vSubArguments[
i]->GenSlidingWindowDecl(ss);
281 ss <<
" int gid0=get_global_id(0);\n";
282 ss <<
" double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
284 ss<<
" if(isnan(arg0)||(gid0>=";
288 ss <<
" double tmp=local_coth(arg0);\n";
289 ss <<
" return tmp;\n";
293 void OpCombinA::BinInlineFun(std::set<std::string>& decls,
294 std::set<std::string>& funs)
300 void OpCombinA::GenSlidingWindowFunction(std::stringstream &ss,
301 const std::string &sSymName,
SubArguments &vSubArguments)
303 ss <<
"\ndouble " << sSymName;
304 ss <<
"_"<< BinFuncName() <<
"(";
305 for (
size_t i = 0;
i < vSubArguments.size();
i++)
309 vSubArguments[
i]->GenSlidingWindowDecl(ss);
312 ss <<
" int gid0 = get_global_id(0);\n";
313 ss <<
" double tem;\n";
314 ss <<
" double arg0,arg1;\n";
315 for (
size_t i = 0;
i < vSubArguments.size();
i++)
319 ss <<
" arg"<<
i<<
" = "<<vSubArguments[
i]->GenSlidingWindowDeclRef();
325 ss <<
" if(isnan(arg" <<
i <<
")||(gid0 >= ";
328 ss <<
" arg" << i <<
" = 0;\n";
332 ss <<
" if(isnan(arg" <<
i <<
"))\n";
333 ss <<
" arg" << i <<
" = 0;\n";
336 ss <<
" arg0 = trunc(arg0);\n";
337 ss <<
" arg1 = trunc(arg1);\n";
338 ss <<
" if(arg0 >= arg1 && arg0 > 0 && arg1 > 0)\n";
339 ss <<
" tem = bik(arg0+arg1-1,arg1);\n";
340 ss <<
" else if(arg0 == 0 && arg1 == 0)\n";
342 ss <<
" else if(arg0 > 0 && arg1 == 0)\n";
345 ss <<
" tem = -1;\n";
346 ss <<
" double i = tem - trunc(tem);\n";
347 ss <<
" if(i < 0.5)\n";
348 ss <<
" tem = trunc(tem);\n";
350 ss <<
" tem = trunc(tem) + 1;\n";
351 ss <<
" return tem;\n";
354 void OpEven::GenSlidingWindowFunction(std::stringstream &ss,
355 const std::string &sSymName,
SubArguments &vSubArguments)
357 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
360 ss <<
"\ndouble " << sSymName;
361 ss <<
"_"<< BinFuncName() <<
"(";
362 for (
size_t i = 0;
i < vSubArguments.size();
i++)
366 vSubArguments[
i]->GenSlidingWindowDecl(ss);
369 ss <<
" int gid0=get_global_id(0);\n";
370 ss <<
" double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
372 ss<<
" if(isnan(arg0)||(gid0>=";
376 ss <<
" double tmp;\n";
377 ss <<
" tmp = fabs(arg0 / 2);\n";
378 ss <<
" if ( trunc(tmp) == tmp )\n";
379 ss <<
" tmp = tmp * 2;\n";
381 ss <<
" tmp = (trunc(tmp) + 1) * 2;\n";
382 ss <<
" if (arg0 < 0)\n";
383 ss <<
" tmp = tmp * -1.0;\n";
384 ss <<
" return tmp;\n";
388 void OpMod::GenSlidingWindowFunction(std::stringstream &ss,
389 const std::string &sSymName,
SubArguments &vSubArguments)
391 ss <<
"\ndouble " << sSymName;
392 ss <<
"_"<< BinFuncName() <<
"(";
393 for (
size_t i = 0;
i < vSubArguments.size();
i++)
397 vSubArguments[
i]->GenSlidingWindowDecl(ss);
400 ss <<
" int gid0=get_global_id(0);\n";
401 ss <<
" double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
403 ss <<
" double arg1 =" << vSubArguments[1]->GenSlidingWindowDeclRef();
405 ss <<
" if(isnan(arg0)||arg0 == 0)\n";
406 ss <<
" return 0;\n";
407 ss <<
" if(isnan(arg1) || arg1 ==0)\n";
408 ss <<
" return NAN;\n";
409 ss <<
" double tem;\n";
410 ss <<
" if(arg0 < 0 && arg1 > 0)\n";
411 ss <<
" while(arg0 < 0)\n";
412 ss <<
" arg0 += arg1;\n";
413 ss <<
" else if (arg0 > 0 && arg1 < 0)\n";
414 ss <<
" while(arg0 > 0)\n";
415 ss <<
" arg0 += arg1;\n";
416 ss <<
" tem = fmod(arg0,arg1);\n";
417 ss <<
" if(arg1 < 0 && tem > 0)\n";
418 ss <<
" tem = -tem;\n";
419 ss <<
" return tem;\n";
422 void OpLog::GenSlidingWindowFunction(std::stringstream &ss,
423 const std::string &sSymName,
SubArguments &vSubArguments)
425 ss <<
"\ndouble " << sSymName;
426 ss <<
"_"<< BinFuncName() <<
"(";
427 for (
size_t i = 0;
i < vSubArguments.size();
i++)
431 vSubArguments[
i]->GenSlidingWindowDecl(ss);
434 ss <<
" int gid0 = get_global_id(0);\n";
435 ss <<
" double tem;\n";
436 ss <<
" double arg0,arg1;\n";
437 for (
size_t i = 0;
i < vSubArguments.size();
i++)
441 ss <<
" arg"<<
i<<
" = "<<vSubArguments[
i]->GenSlidingWindowDeclRef();
447 ss <<
" if(isnan(arg" <<
i <<
")||(gid0 >= ";
451 ss <<
" arg0 = 0;\n";
453 ss <<
" arg1 = 10;\n";
457 ss <<
" if(isnan(arg" <<
i <<
"))\n";
459 ss <<
" arg0 = 0;\n";
461 ss <<
" arg1 = 10;\n";
464 if (vSubArguments.size() < 2)
465 ss <<
" arg1 = 10;\n";
466 ss <<
" tem = log10(arg0)/log10(arg1);;\n";
467 ss <<
" return tem;\n";
470 void OpCsc::GenSlidingWindowFunction(
471 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
473 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
476 ss <<
"\ndouble " << sSymName;
477 ss <<
"_"<< BinFuncName() <<
"(";
478 for (
size_t i = 0;
i < vSubArguments.size();
i++)
482 vSubArguments[
i]->GenSlidingWindowDecl(ss);
485 ss <<
"int gid0=get_global_id(0);\n\t";
486 ss <<
"double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
488 ss<<
"if(isnan(arg0)||(gid0>=";
492 ss <<
"double tmp=1/sin(arg0);\n\t";
493 ss <<
"return tmp;\n";
496 void OpCountIfs::GenSlidingWindowFunction(std::stringstream &ss,
497 const std::string &sSymName,
SubArguments &vSubArguments)
499 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
505 ss <<
"\ndouble " << sSymName;
506 ss <<
"_"<< BinFuncName() <<
"(";
507 for (
size_t i = 0;
i < vSubArguments.size();
i++)
511 vSubArguments[
i]->GenSlidingWindowDecl(ss);
514 ss <<
" int gid0=get_global_id(0);\n";
515 ss <<
" int tmp =0;\n";
516 ss <<
" int loop;\n";
517 GenTmpVariables(ss,vSubArguments);
519 ss<<
" int singleIndex =gid0;\n";
522 std::stringstream tmpss;
524 for(
size_t j=0;j<vSubArguments.size();j+=2,m++)
526 CheckSubArgumentIsNan(tmpss,vSubArguments,j);
527 CheckSubArgumentIsNan(ss,vSubArguments,j+1);
528 tmpss <<
" if(isequal(";
536 tmpss <<
" tmp ++;\n";
537 for(
size_t j=0;j<vSubArguments.size();j+=2,m--)
539 for(
int n = 0;
n<m+1;
n++)
545 UnrollDoubleVector(ss,tmpss,pCurDVR,nCurWindowSize);
547 ss <<
"return tmp;\n";
550 void OpSumIfs::GenSlidingWindowFunction(std::stringstream &ss,
551 const std::string &sSymName,
SubArguments &vSubArguments)
553 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
560 mNeedReductionKernel = vSubArguments[0]->NeedParallelReduction();
561 if (mNeedReductionKernel)
565 ss <<
"__kernel void ";
566 ss << vSubArguments[0]->GetName();
567 ss <<
"_SumIfs_reduction( ";
568 for (
size_t i = 0;
i < vSubArguments.size();
i++)
572 vSubArguments[
i]->GenSlidingWindowDecl(ss);
574 ss <<
", __global double *result,int arrayLength,int windowSize";
577 ss <<
" double tmp =0;\n";
580 GenTmpVariables(ss,vSubArguments);
581 ss <<
" double current_result = 0.0;\n";
582 ss <<
" int writePos = get_group_id(1);\n";
584 ss <<
" int offset = 0;\n";
586 ss <<
" int offset = get_group_id(1);\n";
590 ss <<
" int lidx = get_local_id(0);\n";
591 ss <<
" __local double shm_buf[256];\n";
592 ss <<
" barrier(CLK_LOCAL_MEM_FENCE);\n";
593 ss <<
" int loop = arrayLength/512 + 1;\n";
594 ss <<
" for (int l=0; l<loop; l++){\n";
595 ss <<
" tmp = 0.0;\n";
596 ss <<
" int loopOffset = l*512;\n";
598 ss <<
" int p1 = loopOffset + lidx + offset, p2 = p1 + 256;\n";
599 ss <<
" if (p2 < min(offset + windowSize, arrayLength)) {\n";
600 ss <<
" tmp0 = 0.0;\n";
602 std::string p1 =
"p1";
603 std::string p2 =
"p2";
604 for(
size_t j=1;j<vSubArguments.size();j+=2,mm++)
606 CheckSubArgumentIsNan2(ss,vSubArguments,j,p1);
607 CheckSubArgumentIsNan2(ss,vSubArguments,j+1,p1);
618 CheckSubArgumentIsNan2(ss,vSubArguments,0,p1);
619 ss <<
" tmp += tmp0;\n";
620 for(
size_t j=1;j<vSubArguments.size();j+=2,mm--)
622 for(
int n = 0;
n<mm+1;
n++)
629 for(
size_t j=1;j<vSubArguments.size();j+=2,mm++)
631 CheckSubArgumentIsNan2(ss,vSubArguments,j,p2);
632 CheckSubArgumentIsNan2(ss,vSubArguments,j+1,p2);
641 CheckSubArgumentIsNan2(ss,vSubArguments,0,p2);
642 ss <<
" tmp += tmp0;\n";
643 for(
size_t j=1;j< vSubArguments.size();j+=2,mm--)
645 for(
int n = 0;
n<mm+1;
n++)
653 ss <<
" else if (p1 < min(arrayLength, offset + windowSize)) {\n";
655 for(
size_t j=1;j<vSubArguments.size();j+=2,mm++)
657 CheckSubArgumentIsNan2(ss,vSubArguments,j,p1);
658 CheckSubArgumentIsNan2(ss,vSubArguments,j+1,p1);
668 CheckSubArgumentIsNan2(ss,vSubArguments,0,p1);
669 ss <<
" tmp += tmp0;\n";
670 for(
size_t j=1;j<vSubArguments.size();j+=2,mm--)
672 for(
int n = 0;
n<mm+1;
n++)
680 ss <<
" shm_buf[lidx] = tmp;\n";
681 ss <<
" barrier(CLK_LOCAL_MEM_FENCE);\n";
682 ss <<
" for (int i = 128; i >0; i/=2) {\n";
683 ss <<
" if (lidx < i)\n";
684 ss <<
" shm_buf[lidx] += shm_buf[lidx + i];\n";
685 ss <<
" barrier(CLK_LOCAL_MEM_FENCE);\n";
687 ss <<
" if (lidx == 0)\n";
688 ss <<
" current_result += shm_buf[0];\n";
689 ss <<
" barrier(CLK_LOCAL_MEM_FENCE);\n";
692 ss <<
" if (lidx == 0)\n";
693 ss <<
" result[writePos] = current_result;\n";
697 ss <<
"\ndouble " << sSymName;
698 ss <<
"_"<< BinFuncName() <<
"(";
699 for (
size_t i = 0;
i < vSubArguments.size();
i++)
703 vSubArguments[
i]->GenSlidingWindowDecl(ss);
706 ss <<
" int gid0=get_global_id(0);\n";
707 ss <<
" double tmp =0;\n";
708 if (!mNeedReductionKernel)
711 GenTmpVariables(ss,vSubArguments);
714 ss <<
"gid0; i < "<< nCurWindowSize <<
"; i++)\n";
716 ss <<
"0; i < gid0+"<< nCurWindowSize <<
"; i++)\n";
718 ss <<
"0; i < "<< nCurWindowSize <<
"; i++)\n";
723 ss<<
" int doubleIndex =i+gid0;\n";
726 ss<<
" int doubleIndex =i;\n";
728 ss<<
" int singleIndex =gid0;\n";
730 for(
size_t j=1;j<vSubArguments.size();j+=2,m++)
732 CheckSubArgumentIsNan(ss,vSubArguments,j);
733 CheckSubArgumentIsNan(ss,vSubArguments,j+1);
742 CheckSubArgumentIsNan(ss,vSubArguments,0);
743 ss <<
" tmp += tmp0;\n";
744 for(
size_t j=1;j<=vSubArguments.size();j+=2,m--)
746 for(
int n = 0;
n<m+1;
n++)
753 if (mNeedReductionKernel)
756 vSubArguments[0]->GenDeclRef(ss);
759 ss <<
"return tmp;\n";
762 void OpCscH::GenSlidingWindowFunction(
763 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
765 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
768 ss <<
"\ndouble " << sSymName;
769 ss <<
"_"<< BinFuncName() <<
"(";
770 for (
size_t i = 0;
i < vSubArguments.size();
i++)
774 vSubArguments[
i]->GenSlidingWindowDecl(ss);
777 ss <<
"int gid0=get_global_id(0);\n\t";
778 ss <<
"double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
780 ss<<
"if(isnan(arg0)||(gid0>=";
784 ss <<
"double tmp=1/sinh(arg0);\n\t";
785 ss <<
"return tmp;\n";
788 void OpExp::GenSlidingWindowFunction(std::stringstream &ss,
789 const std::string &sSymName,
SubArguments &vSubArguments)
791 ss <<
"\ndouble " << sSymName;
792 ss <<
"_"<< BinFuncName() <<
"(";
793 for (
size_t i = 0;
i < vSubArguments.size();
i++)
796 vSubArguments[
i]->GenSlidingWindowDecl(ss);
800 ss <<
" int gid0=get_global_id(0);\n";
801 ss <<
" double arg0 = 0.0f;\n";
802 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
804 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
812 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
815 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
819 ss <<
" { arg0 = 0.0f; }\n";
823 ss <<
" arg0=" << tmpCur->
GetDouble() <<
";\n";
829 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
832 ss <<
" return pow(M_E, arg0);\n";
836 void OpAverageIfs::GenSlidingWindowFunction(std::stringstream &ss,
837 const std::string &sSymName,
SubArguments &vSubArguments)
839 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
845 ss <<
"\ndouble " << sSymName;
846 ss <<
"_"<< BinFuncName() <<
"(";
847 for (
size_t i = 0;
i < vSubArguments.size();
i++)
851 vSubArguments[
i]->GenSlidingWindowDecl(ss);
854 ss <<
" int gid0=get_global_id(0);\n";
855 ss <<
" double tmp =0;\n";
856 ss <<
" int count=0;\n";
858 GenTmpVariables(ss,vSubArguments);
859 ss<<
" int singleIndex =gid0;\n";
861 std::stringstream tmpss;
862 for(
size_t j=1;j<vSubArguments.size();j+=2,m++)
864 CheckSubArgumentIsNan(tmpss,vSubArguments,j);
865 CheckSubArgumentIsNan(ss,vSubArguments,j+1);
866 tmpss <<
" if(isequal(";
874 CheckSubArgumentIsNan(tmpss,vSubArguments,0);
875 tmpss <<
" tmp += tmp0;\n";
876 tmpss <<
" count++;\n";
877 for(
size_t j=1;j<vSubArguments.size();j+=2,m--)
879 for(
int n = 0;
n<m+1;
n++)
886 UnrollDoubleVector(ss,tmpss,pCurDVR,nCurWindowSize);
888 ss <<
" if(count!=0)\n";
889 ss <<
" tmp=tmp/count;\n";
892 ss <<
"return tmp;\n";
896 void OpLog10::GenSlidingWindowFunction(std::stringstream &ss,
897 const std::string &sSymName,
SubArguments &vSubArguments)
899 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
902 ss <<
"\ndouble " << sSymName;
903 ss <<
"_"<< BinFuncName() <<
"(";
904 for (
size_t i = 0;
i < vSubArguments.size();
i++)
908 vSubArguments[
i]->GenSlidingWindowDecl(ss);
911 ss <<
"int gid0=get_global_id(0);\n\t";
912 ss <<
"double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
914 ss<<
"if(isnan(arg0)||(gid0>=";
918 ss <<
"double tmp=log10(arg0);\n\t";
919 ss <<
"return tmp;\n";
923 void OpSinh::GenSlidingWindowFunction(std::stringstream &ss,
924 const std::string &sSymName,
SubArguments &vSubArguments)
926 ss <<
"\ndouble " << sSymName;
927 ss <<
"_"<< BinFuncName() <<
"(";
928 for (
size_t i = 0;
i < vSubArguments.size();
i++)
932 vSubArguments[
i]->GenSlidingWindowDecl(ss);
935 ss <<
" int gid0=get_global_id(0);\n";
936 ss <<
" double arg0 = " <<
937 vSubArguments[0]->GenSlidingWindowDeclRef();
939 ss<<
" if(isnan(arg0))\n";
941 ss <<
" double tmp=( exp(arg0)-exp(-arg0) )/2;\n";
942 ss <<
" return tmp;\n";
945 void OpSin::GenSlidingWindowFunction(std::stringstream &ss,
946 const std::string &sSymName,
SubArguments &vSubArguments)
948 ss <<
"\ndouble " << sSymName;
949 ss <<
"_"<< BinFuncName() <<
"(";
950 for (
size_t i = 0;
i < vSubArguments.size();
i++)
953 vSubArguments[
i]->GenSlidingWindowDecl(ss);
957 ss <<
" int gid0=get_global_id(0);\n";
958 ss <<
" double arg0 = 0.0f;\n";
959 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
961 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
969 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
972 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
976 ss <<
" { arg0 = 0.0f; }\n";
980 ss <<
" arg0=" << tmpCur->
GetDouble() <<
";\n";
986 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
989 ss <<
" arg0 = arg0 * M_1_PI;\n";
990 ss <<
" return sinpi(arg0);\n";
994 void OpAbs::GenSlidingWindowFunction(std::stringstream &ss,
995 const std::string &sSymName,
SubArguments &vSubArguments)
997 ss <<
"\ndouble " << sSymName;
998 ss <<
"_"<< BinFuncName() <<
"(";
999 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1003 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1006 ss <<
" int gid0 = get_global_id(0);\n";
1007 ss <<
" double tmp = " << GetBottom() <<
";\n";
1008 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1011 ss <<
" int buffer_len = ";
1014 ss <<
" if((gid0)>=buffer_len || isnan(";
1015 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1017 ss <<
" tmp = " << GetBottom() <<
";\n else \n";
1019 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1021 ss <<
" return fabs(tmp);\n";
1024 void OpArcCos::BinInlineFun(std::set<std::string>& decls,
1025 std::set<std::string>& funs)
1030 void OpArcCos::GenSlidingWindowFunction(std::stringstream &ss,
1031 const std::string &sSymName,
SubArguments &vSubArguments)
1033 ss <<
"\ndouble " << sSymName;
1034 ss <<
"_"<< BinFuncName() <<
"(";
1035 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1038 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1041 ss <<
" int gid0 = get_global_id(0);\n";
1042 ss <<
" double tmp = " << GetBottom() <<
";\n";
1043 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1046 ss <<
" int buffer_len = "<< tmpCurDVR0->
GetArrayLength()<<
";\n";
1047 ss <<
" if((gid0)>=buffer_len || isnan(";
1048 ss << vSubArguments[0]->GenSlidingWindowDeclRef()<<
"))\n";
1049 ss <<
" tmp = " << GetBottom() <<
";\n";
1052 ss << vSubArguments[0]->GenSlidingWindowDeclRef()<<
";\n";
1053 ss <<
" return arctan2(sqrt(1.0 - pow(tmp, 2)), tmp);\n";
1056 void OpArcCosHyp::GenSlidingWindowFunction(std::stringstream &ss,
1057 const std::string &sSymName,
SubArguments &vSubArguments)
1059 ss <<
"\ndouble " << sSymName;
1060 ss <<
"_"<< BinFuncName() <<
"(";
1061 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1064 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1067 ss <<
" int gid0 = get_global_id(0);\n";
1068 ss <<
" double tmp = " << GetBottom() <<
";\n";
1069 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1071 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
1078 ss <<
" if((gid0)>=buffer_len || isnan(";
1079 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
"))\n";
1080 ss <<
" tmp = " << GetBottom() <<
";\n";
1082 ss <<
" tmp = " << vSubArguments[0]->GenSlidingWindowDeclRef();
1087 ss <<
" tmp = " << tmpCur0->
GetDouble() <<
";\n";
1092 ss <<
" tmp = " << vSubArguments[0]->GenSlidingWindowDeclRef();
1096 ss <<
" return log( tmp + pow( (pown(tmp, 2) - 1.0), 0.5));\n";
1099 void OpTan::GenSlidingWindowFunction(std::stringstream &ss,
1100 const std::string &sSymName,
SubArguments &vSubArguments)
1102 ss <<
"\ndouble " << sSymName;
1103 ss <<
"_"<< BinFuncName() <<
"(";
1104 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1107 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1111 ss <<
" int gid0=get_global_id(0);\n";
1112 ss <<
" double arg0 = 0.0f;\n";
1113 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
1115 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
1123 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1126 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1130 ss <<
" { arg0 = 0.0f; }\n";
1134 ss <<
" arg0=" << tmpCur->
GetDouble() <<
";\n";
1140 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1143 ss <<
" arg0 = arg0 * M_1_PI;\n";
1144 ss <<
" return sinpi(arg0) * pow(cospi(arg0), -1);\n";
1147 void OpTanH::GenSlidingWindowFunction(std::stringstream &ss,
1148 const std::string &sSymName,
SubArguments &vSubArguments)
1150 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
1153 ss <<
"\ndouble " << sSymName;
1154 ss <<
"_"<< BinFuncName() <<
"(";
1155 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1159 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1163 ss <<
" int gid0=get_global_id(0);\n";
1164 ss <<
" double arg0 = "<< vSubArguments[0]->GenSlidingWindowDeclRef();
1166 ss <<
" if(isnan(arg0)||(gid0>=";
1169 ss <<
" arg0 = 0;\n";
1170 ss <<
" double tmp=tanh(arg0);\n";
1171 ss <<
" return tmp;\n";
1174 void OpPower::GenSlidingWindowFunction(std::stringstream &ss,
1175 const std::string &sSymName,
SubArguments &vSubArguments)
1177 ss <<
"\ndouble " << sSymName;
1178 ss <<
"_"<< BinFuncName() <<
"(";
1179 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1183 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1187 ss <<
" int gid0=get_global_id(0);\n";
1188 ss <<
" double arg[2];\n";
1189 for(
size_t i=0;
i < vSubArguments.size(); ++
i)
1193 if(
ocPush == vSubArguments[
i]->GetFormulaToken()->GetOpCode())
1200 ss <<
" int i = 0;\n";
1201 ss <<
" arg["<<
i<<
"] = ";
1202 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
1204 ss <<
" if(isnan(arg["<<i;
1205 ss <<
"])||(gid0>=";
1216 ss <<
" arg["<<
i<<
"] = ";
1217 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
1219 ss <<
" if(isnan(arg["<<i;
1220 ss <<
"])||(gid0>=";
1228 ss <<
" arg["<<
i<<
"] = ";
1234 ss <<
" arg["<<
i<<
"] = ";
1235 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
1239 ss <<
" return pow(arg[0],arg[1]);\n";
1242 void OpSqrt::GenSlidingWindowFunction(std::stringstream &ss,
1243 const std::string &sSymName,
SubArguments &vSubArguments)
1245 ss <<
"\ndouble " << sSymName;
1246 ss <<
"_"<< BinFuncName() <<
"(";
1247 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1251 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1255 ss <<
" int gid0=get_global_id(0);\n";
1256 ss <<
" double arg0 = 0.0f;\n";
1257 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
1259 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
1267 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1270 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1274 ss <<
" { arg0 = 0; }\n";
1289 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1292 ss <<
" if( arg0 < 0 )\n";
1293 ss <<
" return CreateDoubleError(IllegalArgument);\n";
1294 ss <<
" return sqrt(arg0);\n";
1297 void OpArcCot::GenSlidingWindowFunction(std::stringstream &ss,
1298 const std::string &sSymName,
SubArguments &vSubArguments)
1300 ss <<
"\ndouble " << sSymName;
1301 ss <<
"_"<< BinFuncName() <<
"(";
1302 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1305 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1308 ss <<
" int gid0 = get_global_id(0);\n";
1309 ss <<
" double tmp = " << GetBottom() <<
";\n";
1310 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1313 ss <<
" int buffer_len = " << tmpCurDVR0->
GetArrayLength()<<
";\n";
1314 ss <<
" if((gid0)>=buffer_len || isnan(";
1315 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
"))\n";
1316 ss <<
" tmp = " << GetBottom() <<
";\n";
1318 ss <<
" tmp = " << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
1319 ss <<
" return M_PI_2 - atan(tmp);\n";
1322 void OpArcCotHyp::GenSlidingWindowFunction(std::stringstream &ss,
1323 const std::string &sSymName,
SubArguments &vSubArguments)
1325 ss <<
"\ndouble " << sSymName;
1326 ss <<
"_"<< BinFuncName() <<
"(";
1327 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1330 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1334 ss <<
" int gid0=get_global_id(0);\n";
1335 ss <<
" double arg0 = 0.0f;\n";
1336 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
1338 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
1346 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1349 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1353 ss <<
" { arg0 = 0.0f; }\n";
1364 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1367 ss <<
" return 0.5 * log(1 + 2 * pown(arg0 - 1.0, -1));\n";
1370 void OpArcSin::BinInlineFun(std::set<std::string>& decls,
1371 std::set<std::string>& funs)
1376 void OpArcSin::GenSlidingWindowFunction(std::stringstream &ss,
1377 const std::string &sSymName,
SubArguments &vSubArguments)
1379 ss <<
"\ndouble " << sSymName;
1380 ss <<
"_"<< BinFuncName() <<
"(";
1381 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1384 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1387 ss <<
" int gid0 = get_global_id(0);\n";
1388 ss <<
" double tmp = " << GetBottom() <<
";\n";
1389 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1392 ss <<
" int buffer_len = " << tmpCurDVR0->
GetArrayLength() <<
";\n";
1393 ss <<
" if((gid0)>=buffer_len || isnan(";
1394 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
"))\n";
1395 ss <<
" tmp = " << GetBottom() <<
";\n";
1397 ss <<
" tmp = " << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
1398 ss <<
" return arctan2(tmp, sqrt(1.0 - pow(tmp, 2)));\n";
1401 void OpArcSinHyp::GenSlidingWindowFunction(std::stringstream &ss,
1402 const std::string &sSymName,
SubArguments &vSubArguments)
1404 ss <<
"\ndouble " << sSymName;
1405 ss <<
"_"<< BinFuncName() <<
"(";
1406 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1409 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1412 ss <<
" int gid0 = get_global_id(0);\n";
1413 ss <<
" double tmp = " << GetBottom() <<
";\n";
1414 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1416 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
1423 ss <<
" if((gid0)>=buffer_len || isnan(";
1424 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
"))\n";
1425 ss <<
" tmp = " << GetBottom() <<
";\n";
1427 ss <<
" tmp = " << vSubArguments[0]->GenSlidingWindowDeclRef();
1432 ss <<
" tmp = " << tmpCur0->
GetDouble() <<
";\n";
1437 ss <<
" tmp = " << vSubArguments[0]->GenSlidingWindowDeclRef();
1440 ss <<
" return log( tmp + pow((pown(tmp, 2) + 1.0), 0.5));\n";
1443 void OpArcTan2::BinInlineFun(std::set<std::string>& decls,
1444 std::set<std::string>& funs)
1449 void OpArcTan2::GenSlidingWindowFunction(std::stringstream &ss,
1450 const std::string &sSymName,
SubArguments &vSubArguments)
1452 ss <<
"\ndouble " << sSymName;
1453 ss <<
"_"<< BinFuncName() <<
"(";
1454 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1457 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1460 ss <<
" int gid0 = get_global_id(0);\n";
1461 ss <<
" double x_num = " << GetBottom() <<
";\n";
1462 ss <<
" double y_num = " << GetBottom() <<
";\n";
1463 FormulaToken *iXNum = vSubArguments[0]->GetFormulaToken();
1466 FormulaToken *iYNum = vSubArguments[1]->GetFormulaToken();
1469 ss <<
" int buffer_x_len = " << tmpCurDVRX->
GetArrayLength() <<
";\n";
1470 ss <<
" int buffer_y_len = " << tmpCurDVRY->
GetArrayLength() <<
";\n";
1471 ss <<
" if((gid0)>=buffer_x_len || isnan(";
1472 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
"))\n";
1473 ss <<
" x_num = " << GetBottom() <<
";\n";
1475 ss <<
" x_num = "<< vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
1476 ss <<
" if((gid0)>=buffer_y_len || isnan(";
1477 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
"))\n";
1478 ss <<
" y_num = " << GetBottom() <<
";\n";
1480 ss <<
" y_num = "<< vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
1481 ss <<
" return arctan2(y_num, x_num);\n";
1484 void OpArcTan::GenSlidingWindowFunction(std::stringstream &ss,
1485 const std::string &sSymName,
SubArguments &vSubArguments)
1487 ss <<
"\ndouble " << sSymName;
1488 ss <<
"_"<< BinFuncName() <<
"(";
1489 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1492 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1496 ss <<
" int gid0=get_global_id(0);\n";
1497 ss <<
" double arg0 = 0.0f;\n";
1498 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
1500 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
1508 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1511 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1515 ss <<
" { arg0 = 0.0f; }\n";
1519 ss <<
" arg0=" << tmpCur->
GetDouble() <<
";\n";
1525 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1528 ss <<
" return atan(arg0);\n";
1531 void OpArcTanH::GenSlidingWindowFunction(std::stringstream &ss,
1532 const std::string &sSymName,
SubArguments &vSubArguments)
1534 ss <<
"\ndouble " << sSymName;
1535 ss <<
"_"<< BinFuncName() <<
"(";
1536 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1539 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1542 ss <<
" int gid0 = get_global_id(0);\n";
1543 ss <<
" double tmp = " << GetBottom() <<
";\n";
1544 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1547 ss <<
" int buffer_len = " << tmpCurDVR0->
GetArrayLength() <<
";\n";
1548 ss <<
" if((gid0)>=buffer_len || isnan(";
1549 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
"))\n";
1550 ss <<
" tmp = " << GetBottom() <<
";\n";
1552 ss <<
" tmp = " << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
1553 ss <<
" double a = 1.0 + tmp;\n";
1554 ss <<
" double b = 1.0 - tmp;\n";
1555 ss <<
" return log(pow(a/b, 0.5));\n";
1558 void OpBitAnd::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++)
1566 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1569 ss <<
" int gid0 = get_global_id(0);\n";
1570 ss <<
" double num1 = " << GetBottom() <<
";\n";
1571 ss <<
" double num2 = " << GetBottom() <<
";\n";
1572 FormulaToken *iNum1 = vSubArguments[0]->GetFormulaToken();
1575 FormulaToken *iNum2 = vSubArguments[1]->GetFormulaToken();
1578 ss <<
" int buffer_num1_len = "<<tmpCurDVRNum1->
GetArrayLength()<<
";\n";
1579 ss <<
" int buffer_num2_len = "<<tmpCurDVRNum2->
GetArrayLength()<<
";\n";
1580 ss <<
" if((gid0)>=buffer_num1_len || isnan(";
1581 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
"))\n";
1582 ss <<
" num1 = " << GetBottom() <<
";\n";
1584 ss <<
" num1 = " << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
1585 ss <<
" if((gid0)>=buffer_num2_len || isnan(";
1586 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
"))\n";
1587 ss <<
" num2 = " << GetBottom() <<
";\n";
1589 ss <<
" num2 = " << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
1590 ss <<
" return (long)num1 & (long)num2;\n";
1593 void OpLn::GenSlidingWindowFunction(
1594 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
1596 ss <<
"\ndouble " << sSymName;
1597 ss <<
"_"<< BinFuncName() <<
"(";
1598 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1602 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1605 ss <<
" int gid0=get_global_id(0);\n";
1606 ss <<
" int singleIndex = gid0;\n";
1608 GenTmpVariables(ss,vSubArguments);
1609 CheckAllSubArgumentIsNan(ss,vSubArguments);
1611 ss <<
" double tmp=log1p(tmp0-1);\n";
1612 ss <<
" return tmp;\n";
1616 void OpRound::GenSlidingWindowFunction(std::stringstream &ss,
1617 const std::string &sSymName,
SubArguments &vSubArguments)
1620 ss <<
"\ndouble " << sSymName;
1621 ss <<
"_"<< BinFuncName() <<
"(";
1622 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1626 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1629 ss <<
" int gid0=get_global_id(0);\n";
1630 ss <<
" int singleIndex = gid0;\n";
1631 GenTmpVariables(ss,vSubArguments);
1632 CheckAllSubArgumentIsNan(ss,vSubArguments);
1633 if(vSubArguments.size() ==2)
1635 ss <<
" for(int i=0;i<tmp1;i++)\n";
1636 ss <<
" tmp0 = tmp0 * 10;\n";
1637 ss <<
" for(int i=0;i>tmp1;i--)\n";
1638 ss <<
" tmp0 = tmp0 / 10;\n";
1640 ss <<
" double tmp=round(tmp0);\n";
1641 if(vSubArguments.size() ==2)
1643 ss <<
" for(int i=0;i<tmp1;i++)\n";
1644 ss <<
" tmp = tmp / 10;\n";
1645 ss <<
" for(int i=0;i>tmp1;i--)\n";
1646 ss <<
" tmp = tmp * 10;\n";
1648 ss <<
" return tmp;\n";
1651 void OpRoundUp::GenSlidingWindowFunction(std::stringstream &ss,
1652 const std::string &sSymName,
SubArguments &vSubArguments)
1654 ss <<
"\ndouble " << sSymName;
1655 ss <<
"_"<< BinFuncName() <<
"(";
1656 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1660 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1663 ss <<
" int gid0=get_global_id(0);\n";
1664 ss <<
" int singleIndex = gid0;\n";
1665 ss <<
" int intTmp;\n";
1666 ss <<
" double doubleTmp;\n";
1667 ss <<
" double tmp;\n";
1668 GenTmpVariables(ss,vSubArguments);
1669 CheckAllSubArgumentIsNan(ss,vSubArguments);
1670 ss <<
" if(tmp1 >20 || tmp1 < -20)";
1672 ss <<
" tmp = NAN;\n";
1675 ss <<
" for(int i=0;i<tmp1;i++)\n";
1676 ss <<
" tmp0 = tmp0 * 10;\n";
1677 ss <<
" intTmp = (int)tmp0;\n";
1678 ss <<
" doubleTmp = intTmp;\n";
1679 ss <<
" if(isequal(doubleTmp,tmp0))\n";
1680 ss <<
" tmp = doubleTmp;\n";
1682 ss <<
" tmp = doubleTmp + 1;\n";
1683 ss <<
" for(int i=0;i<tmp1;i++)\n";
1684 ss <<
" tmp = tmp / 10;\n";
1686 ss <<
" return tmp;\n";
1689 void OpRoundDown::GenSlidingWindowFunction(std::stringstream &ss,
1690 const std::string &sSymName,
SubArguments &vSubArguments)
1692 ss <<
"\ndouble " << sSymName;
1693 ss <<
"_"<< BinFuncName() <<
"(";
1694 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1698 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1701 ss <<
" int gid0=get_global_id(0);\n";
1702 ss <<
" int singleIndex = gid0;\n";
1703 ss <<
" int intTmp;\n";
1704 ss <<
" double tmp;\n";
1705 GenTmpVariables(ss,vSubArguments);
1706 CheckAllSubArgumentIsNan(ss,vSubArguments);
1707 ss <<
" if(tmp1 >20 || tmp1 < -20)";
1709 ss <<
" tmp = NAN;\n";
1712 ss <<
" for(int i=0;i<tmp1;i++)\n";
1713 ss <<
" tmp0 = tmp0 * 10;\n";
1714 ss <<
" intTmp = (int)tmp0;\n";
1715 ss <<
" tmp = intTmp;\n";
1716 ss <<
" for(int i=0;i<tmp1;i++)\n";
1717 ss <<
" tmp = tmp / 10;\n";
1719 ss <<
" return tmp;\n";
1722 void OpInt::GenSlidingWindowFunction(std::stringstream &ss,
1723 const std::string &sSymName,
SubArguments &vSubArguments)
1725 ss <<
"\ndouble " << sSymName;
1726 ss <<
"_"<< BinFuncName() <<
"(";
1727 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1731 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1734 ss <<
" int gid0=get_global_id(0);\n";
1735 ss <<
" int singleIndex = gid0;\n";
1736 ss <<
" int intTmp;\n";
1737 ss <<
" double tmp;\n";
1738 GenTmpVariables(ss,vSubArguments);
1739 CheckAllSubArgumentIsNan(ss,vSubArguments);
1740 ss <<
" intTmp = (int)tmp0;\n";
1741 ss <<
" tmp = intTmp;\n";
1742 ss <<
" return tmp;\n";
1745 void OpNegSub::GenSlidingWindowFunction(std::stringstream &ss,
1746 const std::string &sSymName,
SubArguments &vSubArguments)
1748 ss <<
"\ndouble " << sSymName;
1749 ss <<
"_"<< BinFuncName() <<
"(";
1750 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1754 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1757 ss <<
" int gid0=get_global_id(0);\n";
1758 ss <<
" int singleIndex = gid0;\n";
1759 GenTmpVariables(ss,vSubArguments);
1760 CheckAllSubArgumentIsNan(ss,vSubArguments);
1761 ss <<
" return -tmp0;\n";
1765 void OpRadians::GenSlidingWindowFunction(std::stringstream &ss,
1766 const std::string &sSymName,
SubArguments &vSubArguments)
1768 ss <<
"\ndouble " << sSymName;
1769 ss <<
"_"<< BinFuncName() <<
"(";
1770 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1774 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1777 ss <<
" int gid0=get_global_id(0);\n";
1778 ss <<
" int singleIndex = gid0;\n";
1779 ss <<
" double tmp;\n";
1780 GenTmpVariables(ss,vSubArguments);
1781 CheckAllSubArgumentIsNan(ss,vSubArguments);
1782 ss <<
" tmp = tmp0 * 3.14159265358979 * pow(180.0,-1);\n";
1783 ss <<
" return tmp;\n";
1786 void OpIsEven::GenSlidingWindowFunction(std::stringstream &ss,
1787 const std::string &sSymName,
SubArguments &vSubArguments)
1789 ss <<
"\ndouble " << sSymName;
1790 ss <<
"_"<< BinFuncName() <<
"(";
1791 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1795 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1798 ss <<
" int gid0=get_global_id(0);\n";
1799 ss <<
" int singleIndex = gid0;\n";
1800 ss <<
" double tmp;\n";
1801 GenTmpVariables(ss,vSubArguments);
1802 CheckAllSubArgumentIsNan(ss,vSubArguments);
1803 ss <<
" tmp = (fmod(floor(fabs(tmp0)), 2.0)<0.5);\n";
1804 ss <<
" return tmp;\n";
1807 void OpIsOdd::GenSlidingWindowFunction(std::stringstream &ss,
1808 const std::string &sSymName,
SubArguments &vSubArguments)
1810 ss <<
"\ndouble " << sSymName;
1811 ss <<
"_"<< BinFuncName() <<
"(";
1812 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1816 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1819 ss <<
" int gid0=get_global_id(0);\n";
1820 ss <<
" int singleIndex = gid0;\n";
1821 ss <<
" double tmp;\n";
1822 GenTmpVariables(ss,vSubArguments);
1823 CheckAllSubArgumentIsNan(ss,vSubArguments);
1824 ss <<
" tmp = !(fmod(floor(fabs(tmp0)), 2.0)<0.5);\n";
1825 ss <<
" return tmp;\n";
1828 void OpOdd::GenSlidingWindowFunction(
1829 std::stringstream &ss,
const std::string &sSymName,
1832 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
1836 ss <<
"\ndouble " << sSymName;
1837 ss <<
"_"<< BinFuncName() <<
"(";
1838 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1842 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1845 ss <<
" int gid0=get_global_id(0);\n";
1846 ss <<
" double tmp=0;\n";
1847 ss <<
" double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
1849 ss<<
" if(isnan(arg0)||(gid0>=";
1853 ss <<
" if (arg0 > 0.0 ){\n";
1854 ss <<
" tmp=Intg(arg0);\n";
1855 ss <<
" if(tmp-trunc(tmp/2)*2 == 0)\n";
1856 ss <<
" tmp=tmp+1;\n";
1857 ss <<
" }else if (arg0 < 0.0 ){\n";
1858 ss <<
" tmp=Intg(arg0);\n";
1859 ss <<
" if(tmp-trunc(tmp/2)*2 == 0)\n";
1860 ss <<
" tmp=tmp-1.0;\n";
1861 ss <<
" }else if (arg0 == 0.0 )\n";
1862 ss <<
" tmp=1.0;\n";
1863 ss <<
" return tmp;\n";
1866 void OpCountIf::GenSlidingWindowFunction(std::stringstream &ss,
1867 const std::string &sSymName,
SubArguments &vSubArguments)
1869 ss <<
"\ndouble " << sSymName;
1870 ss <<
"_"<< BinFuncName() <<
"(";
1871 for (
unsigned i = 0;
i < 2;
i++)
1875 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1879 ss <<
" int gid0=get_global_id(0);\n";
1880 ss <<
" double vara, varb;\n";
1881 ss <<
" int varc = 0;\n";
1882 FormulaToken *tmpCur = vSubArguments[1]->GetFormulaToken();
1884 if(
ocPush == vSubArguments[1]->GetFormulaToken()->GetOpCode())
1892 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1894 ss <<
" if(isnan(varb)||(gid0>=";
1897 ss <<
" varb = 0;\n";
1908 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1911 tmpCur = vSubArguments[0]->GetFormulaToken();
1913 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
1921 ss <<
" for (int i = ";
1925 ss <<
" && i < " << nCurWindowSize <<
"; ++i)\n";
1931 ss <<
" && i < gid0+"<< nCurWindowSize <<
"; ++i)\n";
1937 ss <<
" && i < "<< nCurWindowSize <<
"; ++i)\n";
1942 ss <<
"0; i < "<< nCurWindowSize <<
"; ++i)\n";
1946 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1948 ss <<
" if (isnan(vara))\n";
1949 ss <<
" continue;\n";
1950 ss <<
" (vara == varb) && varc++;\n";
1959 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1961 ss <<
" if(isnan(vara)||(gid0>=";
1964 ss <<
" return 0;\n";
1965 ss <<
" (vara == varb) && varc++;\n";
1968 ss <<
" return varc;\n";
1971 void OpSumIf::GenSlidingWindowFunction(std::stringstream &ss,
1972 const std::string &sSymName,
SubArguments &vSubArguments)
1974 ss <<
"\ndouble " << sSymName;
1975 ss <<
"_"<< BinFuncName() <<
"(";
1976 int flag = 3 == vSubArguments.size() ? 2 : 0;
1977 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1981 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1985 ss <<
" int gid0=get_global_id(0);\n";
1986 ss <<
" double vara, varb, varc, sum = 0.0f;\n";
1987 FormulaToken *tmpCur = vSubArguments[1]->GetFormulaToken();
1989 if(
ocPush == vSubArguments[1]->GetFormulaToken()->GetOpCode())
1997 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1999 ss <<
" if(isnan(varb)||(gid0>=";
2002 ss <<
" varb = 0;\n";
2013 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
2016 tmpCur = vSubArguments[0]->GetFormulaToken();
2018 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
2026 ss <<
" for (int i = ";
2030 ss <<
" && i < " << nCurWindowSize <<
"; ++i)\n";
2036 ss <<
" && i < gid0+"<< nCurWindowSize <<
"; ++i)\n";
2042 ss <<
" && i < "<< nCurWindowSize <<
"; ++i)\n";
2047 ss <<
"0; i < "<< nCurWindowSize <<
"; ++i)\n";
2051 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2053 ss <<
" if (isnan(vara))\n";
2054 ss <<
" continue;\n";
2056 ss << vSubArguments[flag]->GenSlidingWindowDeclRef();
2058 ss <<
" if (isnan(varc))\n";
2059 ss <<
" varc = 0.0f;\n";
2060 ss <<
" (vara == varb)&&(sum = sum + varc);\n";
2069 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2071 ss <<
" if(isnan(vara)||(gid0>=";
2074 ss <<
" return 0;\n";
2075 ss <<
" int i = 0;\n";
2077 ss << vSubArguments[flag]->GenSlidingWindowDeclRef();
2079 ss <<
" if(isnan(varc)||(gid0>=";
2082 ss <<
" varc = 0.0f;\n";
2084 ss <<
" (vara == varb)&&(sum = sum + varc);\n";
2088 ss <<
" return sum;\n";
2091 void OpTrunc::GenSlidingWindowFunction(std::stringstream &ss,
2092 const std::string &sSymName,
SubArguments &vSubArguments)
2094 ss <<
"\ndouble " << sSymName;
2095 ss <<
"_"<< BinFuncName() <<
"(";
2096 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2100 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2104 ss <<
" int gid0=get_global_id(0);\n";
2105 ss <<
" double arg[2];\n";
2106 for(
size_t i=0;
i < vSubArguments.size(); ++
i)
2110 if(
ocPush == vSubArguments[
i]->GetFormulaToken()->GetOpCode())
2117 ss <<
" int i = 0;\n";
2118 ss <<
" arg["<<
i<<
"] = ";
2119 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
2121 ss <<
" if(isnan(arg["<<i;
2122 ss <<
"])||(gid0>=";
2133 ss <<
" arg["<<
i<<
"] = ";
2134 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
2136 ss <<
" if(isnan(arg["<<i;
2137 ss <<
"])||(gid0>=";
2145 ss <<
" arg["<<
i<<
"] = ";
2151 ss <<
" arg["<<
i<<
"] = ";
2152 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
2156 ss <<
" double argm = arg[0];\n";
2157 ss <<
" int n = (int)arg[1];\n";
2158 ss <<
" double nn = 1.0f;\n";
2159 ss <<
" for(int i = 0; i < n; ++i)\n";
2161 ss <<
" argm = argm * 10;\n";
2162 ss <<
" nn = nn * 10;\n";
2164 ss <<
" modf(argm, &argm);\n";
2165 ss <<
" return argm / nn;\n";
2168 void OpFloor::GenSlidingWindowFunction(
2169 std::stringstream &ss,
const std::string &sSymName,
2172 ss <<
"\ndouble " << sSymName;
2173 ss <<
"_"<< BinFuncName() <<
"(";
2174 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2178 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2181 ss <<
" int gid0=get_global_id(0);\n";
2182 ss <<
" double arg0,arg1,arg2=0.0;\n";
2183 ss <<
" arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
2185 ss <<
" arg1 = " << vSubArguments[1]->GenSlidingWindowDeclRef();
2187 if ( 3 == vSubArguments.size() )
2189 ss <<
" arg2 = " << vSubArguments[2]->GenSlidingWindowDeclRef();
2192 ss <<
" if(isnan(arg0) || isnan(arg1))\n";
2193 ss <<
" return 0;\n";
2194 ss <<
" if(isnan(arg2))\n";
2195 ss <<
" arg2 = 0.0;\n";
2196 ss <<
" if(arg0*arg1<0)\n";
2197 ss <<
" return NAN;\n";
2198 ss <<
" else if(arg2==0.0&&arg0<0.0)\n";
2199 ss <<
" return (trunc(arg0/arg1)+1)*arg1;\n";
2201 ss <<
" return trunc(arg0/arg1)*arg1;\n";
2204 void OpBitOr::GenSlidingWindowFunction(std::stringstream &ss,
2205 const std::string &sSymName,
SubArguments &vSubArguments)
2207 ss <<
"\ndouble " << sSymName;
2208 ss <<
"_"<< BinFuncName() <<
"(";
2209 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2212 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2215 ss <<
" int gid0 = get_global_id(0);\n";
2216 ss <<
" double num1 = " << GetBottom() <<
";\n";
2217 ss <<
" double num2 = " << GetBottom() <<
";\n";
2218 FormulaToken *iNum1 = vSubArguments[0]->GetFormulaToken();
2221 FormulaToken *iNum2 = vSubArguments[1]->GetFormulaToken();
2224 ss <<
" int buffer_num1_len = "<<tmpCurDVRNum1->
GetArrayLength()<<
";\n";
2225 ss <<
" int buffer_num2_len = "<<tmpCurDVRNum2->
GetArrayLength()<<
";\n";
2226 ss <<
" if((gid0)>=buffer_num1_len || isnan(";
2227 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
"))\n";
2228 ss <<
" num1 = " << GetBottom() <<
";\n";
2230 ss <<
" num1 = floor(" << vSubArguments[0]->GenSlidingWindowDeclRef();
2232 ss <<
" if((gid0)>=buffer_num2_len || isnan(";
2233 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
"))\n";
2234 ss <<
" num2 = " << GetBottom() <<
";\n";
2236 ss <<
" num2 = floor(" << vSubArguments[1]->GenSlidingWindowDeclRef();
2238 ss <<
" return (long)num1 | (long)num2;\n";
2241 void OpBitXor::GenSlidingWindowFunction(std::stringstream &ss,
2242 const std::string &sSymName,
SubArguments &vSubArguments)
2244 ss <<
"\ndouble " << sSymName;
2245 ss <<
"_"<< BinFuncName() <<
"(";
2246 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2249 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2252 ss <<
" int gid0 = get_global_id(0);\n";
2253 ss <<
" double num1 = " << GetBottom() <<
";\n";
2254 ss <<
" double num2 = " << GetBottom() <<
";\n";
2255 FormulaToken *iNum1 = vSubArguments[0]->GetFormulaToken();
2258 FormulaToken *iNum2 = vSubArguments[1]->GetFormulaToken();
2261 ss <<
" int buffer_num1_len = " << tmpCurDVRNum1->
GetArrayLength() <<
";\n";
2262 ss <<
" int buffer_num2_len = " << tmpCurDVRNum2->
GetArrayLength() <<
";\n";
2264 ss <<
" if((gid0)>=buffer_num1_len || isnan(";
2265 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
"))\n";
2266 ss <<
" num1 = " << GetBottom() <<
";\n";
2268 ss <<
" num1 = floor(" << vSubArguments[0]->GenSlidingWindowDeclRef();
2270 ss <<
" if((gid0)>=buffer_num2_len || isnan(";
2271 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
"))\n";
2272 ss <<
" num2 = " << GetBottom() <<
";\n";
2274 ss <<
" num2 = floor(" << vSubArguments[1]->GenSlidingWindowDeclRef();
2276 ss <<
" return (long)num1 ^ (long)num2;\n";
2279 void OpBitLshift::GenSlidingWindowFunction(std::stringstream &ss,
2280 const std::string &sSymName,
SubArguments &vSubArguments)
2282 ss <<
"\ndouble " << sSymName;
2283 ss <<
"_"<< BinFuncName() <<
"(";
2284 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2287 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2290 ss <<
" int gid0 = get_global_id(0);\n";
2291 ss <<
" double num = " << GetBottom() <<
";\n";
2292 ss <<
" double shift_amount = " << GetBottom() <<
";\n";
2293 FormulaToken *iNum = vSubArguments[0]->GetFormulaToken();
2296 FormulaToken *iShiftAmount = vSubArguments[1]->GetFormulaToken();
2299 ss <<
" int buffer_num_len = "<< tmpCurDVRNum->
GetArrayLength()<<
";\n";
2300 ss <<
" int buffer_shift_amount_len = ";
2302 ss <<
" if((gid0)>=buffer_num_len || isnan(";
2303 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
"))\n";
2304 ss <<
" num = " << GetBottom() <<
";\n";
2306 ss <<
" num = floor(";
2307 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
");\n";
2308 ss <<
" if((gid0)>=buffer_shift_amount_len || isnan(";
2309 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
"))\n";
2310 ss <<
" shift_amount = " << GetBottom() <<
";\n";
2312 ss <<
" shift_amount = floor(";
2313 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
");\n";
2314 ss <<
" return floor(shift_amount >= 0 ? ";
2315 ss <<
"num * pow(2.0, shift_amount) : ";
2316 ss <<
"num / pow(2.0, fabs(shift_amount)));\n";
2319 void OpBitRshift::GenSlidingWindowFunction(std::stringstream &ss,
2320 const std::string &sSymName,
SubArguments &vSubArguments)
2322 ss <<
"\ndouble " << sSymName;
2323 ss <<
"_"<< BinFuncName() <<
"(";
2324 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2327 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2330 ss <<
" int gid0 = get_global_id(0);\n";
2331 ss <<
" double num = " << GetBottom() <<
";\n";
2332 ss <<
" double shift_amount = " << GetBottom() <<
";\n";
2333 FormulaToken *iNum = vSubArguments[0]->GetFormulaToken();
2336 FormulaToken *iShiftAmount = vSubArguments[1]->GetFormulaToken();
2339 ss <<
" int buffer_num_len = ";
2341 ss <<
" int buffer_shift_amount_len = ";
2344 ss <<
" if((gid0)>=buffer_num_len || isnan(";
2345 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
"))\n";
2346 ss <<
" num = " << GetBottom() <<
";\n";
2348 ss <<
" num = floor(";
2349 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
");\n";
2350 ss <<
" if((gid0)>=buffer_shift_amount_len || isnan(";
2351 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
"))\n";
2352 ss <<
" shift_amount = " <<GetBottom()<<
";\n";
2354 ss <<
" shift_amount = floor(";
2355 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
");\n";
2356 ss <<
" return floor(";
2357 ss <<
"shift_amount >= 0 ? num / pow(2.0, shift_amount) : ";
2358 ss <<
"num * pow(2.0, fabs(shift_amount)));\n";
2361 void OpSumSQ::GenSlidingWindowFunction(std::stringstream &ss,
2362 const std::string &sSymName,
SubArguments &vSubArguments)
2364 ss <<
"\ndouble " << sSymName;
2365 ss <<
"_"<< BinFuncName() <<
"(";
2366 for (
size_t i = 0;
i < vSubArguments.size(); ++
i)
2370 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2374 ss <<
" int gid0=get_global_id(0);\n";
2375 ss <<
" double sum = 0.0f, arg;\n";
2380 if(
ocPush == rArg->GetFormulaToken()->GetOpCode())
2387 ss <<
" for (int i = ";
2391 ss <<
" && i < " << nCurWindowSize <<
"; ++i)\n";
2397 ss <<
" && i < gid0+"<< nCurWindowSize <<
"; ++i)\n";
2403 ss <<
" && i < "<< nCurWindowSize <<
"; ++i)\n";
2408 ss <<
"0; i < "<< nCurWindowSize <<
"; ++i)\n";
2412 ss << rArg->GenSlidingWindowDeclRef();
2414 ss <<
" if (isnan(arg))\n";
2415 ss <<
" continue;\n";
2416 ss <<
" sum += pown(arg, 2);\n";
2425 ss << rArg->GenSlidingWindowDeclRef();
2427 ss <<
" if(isnan(arg)||(gid0>=";
2430 ss <<
" arg = 0.0f;\n";
2431 ss <<
" sum += pown(arg, 2);\n";
2437 ss <<
" sum += pown(arg, 2);\n";
2443 ss << rArg->GenSlidingWindowDeclRef();
2445 ss <<
" sum += pown(arg, 2);\n";
2448 ss <<
" return sum;\n";
2451 void OpSqrtPi::GenSlidingWindowFunction(std::stringstream &ss,
2452 const std::string &sSymName,
SubArguments &vSubArguments)
2454 ss <<
"\ndouble " << sSymName;
2455 ss <<
"_"<< BinFuncName() <<
"(";
2456 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2460 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2464 ss <<
" int gid0=get_global_id(0);\n";
2465 ss <<
" double arg0 = 0.0f;\n";
2466 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
2468 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
2476 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2479 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2483 ss <<
" { arg0 = 0.0f; }\n";
2494 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2497 ss <<
" return (double)sqrt(arg0 *";
2498 ss <<
" 3.1415926535897932);\n";
2501 void OpCeil::GenSlidingWindowFunction(std::stringstream &ss,
2502 const std::string &sSymName,
SubArguments &vSubArguments)
2504 ss <<
"\ndouble " << sSymName;
2505 ss <<
"_"<< BinFuncName() <<
"(";
2506 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2509 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2512 ss <<
" int gid0 = get_global_id(0);\n";
2513 ss <<
" double num = " << GetBottom() <<
";\n";
2514 ss <<
" double significance = " << GetBottom() <<
";\n";
2515 ss <<
" double bAbs = 0;\n";
2517 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
"))\n";
2518 ss <<
" num = " << GetBottom() <<
";\n";
2520 ss <<
" num = " << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
2522 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
"))\n";
2523 ss <<
" return 0.0;\n";
2525 ss <<
" significance = ";
2526 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
2527 if (vSubArguments.size() > 2)
2529 FormulaToken *bAbs = vSubArguments[2]->GetFormulaToken();
2534 ss<<
" if((gid0)>=" << tmpCurSVRIsAbs->
GetArrayLength() <<
" ||";
2540 ss<<
" if((gid0)>=" << tmpCurDVRIsAbs->
GetArrayLength() <<
" ||";
2547 ss << vSubArguments[2]->GenSlidingWindowDeclRef() <<
"))\n";
2548 ss <<
" bAbs = 0;\n";
2550 ss <<
" bAbs = "<<vSubArguments[2]->GenSlidingWindowDeclRef()<<
";\n";
2552 ss <<
" if(significance == 0.0)\n";
2553 ss <<
" return 0.0;\n";
2555 ss <<
"( !(int)bAbs && num < 0.0 ? floor( num / significance ) : ";
2556 ss <<
"ceil( num / significance ) )";
2557 ss <<
"*significance;\n";
2560 void OpCombin::GenSlidingWindowFunction(std::stringstream &ss,
2561 const std::string &sSymName,
SubArguments &vSubArguments)
2563 ss <<
"\ndouble " << sSymName;
2564 ss <<
"_"<< BinFuncName() <<
"(";
2565 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2568 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2571 ss <<
" int gid0 = get_global_id(0);\n";
2572 ss <<
" double num = " << GetBottom() <<
";\n";
2573 ss <<
" double num_chosen = " << GetBottom() <<
";\n";
2574 ss <<
" double result = -1.0;\n";
2575 FormulaToken *iNum = vSubArguments[0]->GetFormulaToken();
2576 FormulaToken *iNumChosen = vSubArguments[1]->GetFormulaToken();
2579 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
2585 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
"))\n";
2586 ss <<
" num = " << GetBottom() <<
";\n";
2588 ss <<
" num = floor(";
2589 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
");\n";
2591 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
"))\n";
2592 ss <<
" num_chosen = " << GetBottom() <<
";\n";
2594 ss <<
" num_chosen = floor(";
2595 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
");\n";
2600 ss <<
" num = floor(" << iNum->
GetDouble() <<
");\n";
2601 ss <<
" num_chosen = floor("<< iNumChosen->
GetDouble()<<
");\n";
2606 ss <<
" num = floor(";
2607 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
");\n";
2608 ss <<
" num_chosen = floor(";
2609 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
");\n";
2611 ss <<
" result = select(result, 0.0, (ulong)(num < num_chosen));\n";
2612 ss <<
" result = select(result, 1.0, (ulong)(num_chosen == 0.0));\n";
2613 ss <<
" if(result == 0 || result ==1)\n";
2614 ss <<
" return result;\n";
2615 ss <<
" double4 db4num;\n";
2616 ss <<
" double4 db4num_chosen;\n";
2617 ss <<
" double4 db4result;\n";
2618 ss <<
" double2 db2result;\n";
2619 ss <<
" result = 1.0;\n";
2620 ss <<
" int loop = num_chosen/4;\n";
2621 ss <<
" for(int i=0; i<loop; i++)\n";
2623 ss <<
" db4num = (double4){num,\n";
2624 ss <<
" num-1.0,\n";
2625 ss <<
" num-2.0,\n";
2626 ss <<
" num-3.0};\n";
2627 ss <<
" db4num_chosen = (double4){num_chosen,\n";
2628 ss <<
" num_chosen-1.0,\n";
2629 ss <<
" num_chosen-2.0,\n";
2630 ss <<
" num_chosen-3.0};\n";
2631 ss <<
" db4result = db4num * pown(db4num_chosen, -1);\n";
2632 ss <<
" db2result = db4result.xy * db4result.zw;\n";
2633 ss <<
" result *= db2result.x * db2result.y;\n";
2634 ss <<
" num = num - 4.0;\n";
2635 ss <<
" num_chosen = num_chosen - 4.0;\n";
2637 ss <<
" while ( num_chosen > 0){\n";
2638 ss <<
" result *= num / num_chosen;\n";
2639 ss <<
" num = num - 1.0;\n";
2640 ss <<
" num_chosen = num_chosen - 1.0;\n";
2642 ss <<
" return result;\n";
2645 void OpConvert::GenSlidingWindowFunction(
2646 std::stringstream &ss,
const std::string &sSymName,
2654 int arg1=vSubArguments[1]->GetFormulaToken()->GetString().
2655 getString().toAsciiUpperCase().hashCode();
2656 int arg2=vSubArguments[2]->GetFormulaToken()->GetString().
2657 getString().toAsciiUpperCase().hashCode();
2661 if( !((arg1==5584&&arg2==108)||
2662 (arg1==108&&arg2==5584)||
2663 (arg1==5665&&arg2==268206)||
2664 (arg1==268206&&arg2==5665)) )
2667 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
2670 ss <<
"\ndouble " << sSymName;
2671 ss <<
"_"<< BinFuncName() <<
"(";
2672 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2676 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2679 ss <<
" int gid0=get_global_id(0);\n";
2680 ss <<
" double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
2682 ss <<
" double arg1 = " << vSubArguments[1]->GenSlidingWindowDeclRef();
2684 ss <<
" double arg2 = " << vSubArguments[2]->GenSlidingWindowDeclRef();
2686 ss<<
" if(isnan(arg0)||(gid0>=";
2690 ss<<
" if(isnan(arg1)||(gid0>=";
2694 ss<<
" if(isnan(arg2)||(gid0>=";
2698 ss<<
" if(arg1==5584U&&arg2==108U)\n";
2699 ss<<
" return arg0*1000.0;\n";
2700 ss<<
" else if(arg1==108U&&arg2==3385U)\n";
2701 ss<<
" return arg0/1000.0;\n";
2702 ss<<
" else if(arg1==5665U&&arg2==268206U)\n";
2703 ss<<
" return arg0*60.0;\n";
2704 ss<<
" else if(arg1==268206U&&arg2==5665U)\n";
2705 ss<<
" return arg0/60.0;\n";
2707 ss<<
" return -9999999999;\n";
2712 void OpProduct::GenSlidingWindowFunction(std::stringstream &ss,
2713 const std::string &sSymName,
SubArguments &vSubArguments)
2715 ss <<
"\ndouble " << sSymName;
2716 ss <<
"_"<< BinFuncName() <<
"( ";
2717 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2721 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2724 ss <<
" int gid0 = get_global_id(0);\n";
2725 ss <<
" int i = 0;\n";
2726 ss <<
" double product=1.0;\n";
2727 ss <<
" int count = 0;\n\n";
2738 ss <<
" for (int i = ";
2742 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2748 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
2754 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
2763 ss <<
" if(!isnan("<<rArg->GenSlidingWindowDeclRef()<<
"))\n";
2765 ss <<
" product = product*";
2766 ss << rArg->GenSlidingWindowDeclRef()<<
";\n";
2767 ss <<
" ++count;\n";
2773 ss <<
" if(!isnan("<<rArg->GenSlidingWindowDeclRef()<<
"))\n";
2775 ss <<
" product = product*";
2776 ss << rArg->GenSlidingWindowDeclRef()<<
";\n";
2777 ss <<
" ++count;\n";
2782 ss <<
" if(!isnan("<<rArg->GenSlidingWindowDeclRef()<<
"))\n";
2784 ss <<
" product = product*";
2785 ss << rArg->GenSlidingWindowDeclRef()<<
";\n";
2786 ss <<
" ++count;\n";
2790 ss <<
" if(count == 0)\n";
2791 ss <<
" return 0;\n";
2792 ss <<
" return product;\n";
2795 void OpAverageIf::GenSlidingWindowFunction(std::stringstream &ss,
2796 const std::string &sSymName,
SubArguments &vSubArguments)
2799 ss <<
"\ndouble " << sSymName;
2800 ss <<
"_"<< BinFuncName() <<
"(";
2801 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2804 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2807 ss <<
" int gid0=get_global_id(0);\n";
2808 ss <<
" double tmp =0;\n";
2809 ss <<
" double count=0;\n";
2810 ss <<
" int singleIndex =gid0;\n";
2811 ss <<
" int doubleIndex;\n";
2814 GenTmpVariables(ss,vSubArguments);
2816 unsigned paraOneIsDoubleVector = 0;
2817 unsigned paraOneWidth = 1;
2818 unsigned paraTwoWidth = 1;
2819 unsigned loopTimes = 0;
2823 paraOneIsDoubleVector = 1;
2824 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
2827 paraOneWidth = pCurDVR0->
GetArrays().size();
2828 loopTimes = paraOneWidth;
2829 if(paraOneWidth > 1)
2835 if(vSubArguments[paraOneWidth]->GetFormulaToken()->GetType() ==
2839 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
2842 paraTwoWidth = pCurDVR1->
GetArrays().size();
2843 if(paraTwoWidth > 1)
2855 ss <<
" doubleIndex =i+gid0;\n";
2858 ss <<
" doubleIndex =i;\n";
2862 CheckSubArgumentIsNan(ss,vSubArguments,paraOneWidth);
2864 unsigned paraThreeIndex = paraOneWidth + paraTwoWidth;
2865 if(vSubArguments.size() > paraThreeIndex)
2867 if(vSubArguments[paraThreeIndex]->GetFormulaToken()->GetType() ==
2871 vSubArguments[paraThreeIndex]->GetFormulaToken();
2874 unsigned paraThreeWidth = pCurDVR2->
GetArrays().size();
2875 if(paraThreeWidth > 1)
2882 if(paraOneIsDoubleVector)
2884 unsigned loopIndex = 0;
2885 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
2892 for(loopIndex =0; loopIndex < loopTimes; loopIndex++)
2896 ss <<
"gid0; i < "<< nCurWindowSize <<
"; i++)\n";
2898 ss <<
"0; i < gid0+"<< nCurWindowSize <<
"; i++)\n";
2900 ss <<
"0; i < "<< nCurWindowSize <<
"; i++)\n";
2905 ss <<
" doubleIndex =i+gid0;\n";
2908 ss <<
" doubleIndex =i;\n";
2911 CheckSubArgumentIsNan(ss,vSubArguments, loopIndex);
2913 ss <<
" if ( isequal( tmp";
2914 ss << loopIndex<<
" , tmp"<<paraOneWidth<<
") ) \n";
2916 if(vSubArguments.size() == paraThreeIndex)
2917 ss <<
" tmp += tmp"<<loopIndex<<
";\n";
2920 CheckSubArgumentIsNan(ss,vSubArguments,
2921 paraThreeIndex+loopIndex);
2922 ss <<
" tmp += tmp";
2923 ss << paraThreeIndex+loopIndex<<
";\n";
2925 ss <<
" count+=1.0;\n";
2932 CheckSubArgumentIsNan(ss,vSubArguments, 0);
2933 ss <<
" if ( isequal( tmp0 , tmp1 ) ) \n";
2935 if(vSubArguments.size() == 2)
2936 ss <<
" tmp += tmp0;\n";
2939 CheckSubArgumentIsNan(ss,vSubArguments,2);
2940 ss <<
" tmp += tmp2;\n";
2942 ss <<
" count+=1.0;\n";
2946 ss <<
" if(count!=0)\n";
2947 ss <<
" tmp=tmp/count;\n";
2949 ss <<
" tmp= 0 ;\n";
2950 ss <<
" return tmp;\n";
2953 void OpDeg::GenSlidingWindowFunction(std::stringstream &ss,
2954 const std::string &sSymName,
SubArguments &vSubArguments)
2956 ss <<
"\ndouble " << sSymName;
2957 ss <<
"_"<< BinFuncName() <<
"(";
2958 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2962 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2966 ss <<
" int gid0=get_global_id(0);\n";
2967 ss <<
" double arg0 = 0.0f;\n";
2968 FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
2970 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
2978 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2981 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2985 ss <<
" { arg0 = 0.0f; }\n";
2996 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2999 ss <<
" return arg0 * pown(M_PI, -1) * 180;;\n";
3003 void OpFact::GenSlidingWindowFunction(std::stringstream& ss,
3004 const std::string &sSymName,
SubArguments& vSubArguments)
3006 ss <<
"\ndouble " << sSymName;
3007 ss <<
"_" << BinFuncName() <<
"(";
3008 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3012 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3015 ss <<
" double tmp = " << GetBottom() <<
";\n";
3016 ss <<
" int gid0 = get_global_id(0);\n";
3017 ss <<
" double arg0 = " << GetBottom() <<
";\n";
3018 FormulaToken* pCur = vSubArguments[0]->GetFormulaToken();
3030 if(
ocPush==vSubArguments[0]->GetFormulaToken()->GetOpCode())
3032 ss <<
" if (isnan(";
3033 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3035 ss <<
" arg0 = 0;\n";
3038 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
3039 ss <<
" arg0 = floor(arg0);\n";
3040 ss <<
" if (arg0 < 0.0)\n";
3041 ss <<
" return 0.0;\n";
3042 ss <<
" else if (arg0 == 0.0)\n";
3043 ss <<
" return 1.0;\n";
3044 ss <<
" else if (arg0 <= 170.0)\n";
3046 ss <<
" double fTemp = arg0;\n";
3047 ss <<
" while (fTemp > 2.0)\n";
3049 ss <<
" fTemp = fTemp - 1;\n";
3050 ss <<
" arg0 = arg0 * fTemp;\n";
3054 ss <<
" return -DBL_MAX;\n";
3060 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
3062 ss <<
" return arg0;\n";
3065 void OpQuotient::GenSlidingWindowFunction(std::stringstream &ss,
3066 const std::string &sSymName,
SubArguments &vSubArguments)
3068 ss <<
"\ndouble " << sSymName;
3069 ss <<
"_"<< BinFuncName() <<
"(";
3070 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3073 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3076 ss <<
" int gid0 = get_global_id(0);\n";
3077 ss <<
" double num1 = 1.0;\n";
3078 ss <<
" double num2 = 1.0;\n";
3080 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
"))\n";
3081 ss <<
" num1 = 1.0;\n";
3083 ss <<
" num1 = " << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
3085 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
"))\n";
3086 ss <<
" num2 = 1.0;\n";
3088 ss <<
" num2 = " << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
3089 ss <<
" return trunc(num1/num2);\n";
3092 void OpSeriesSum::GenSlidingWindowFunction(std::stringstream &ss,
3093 const std::string &sSymName,
SubArguments &vSubArguments)
3096 ss <<
"\ndouble " << sSymName;
3097 ss <<
"_"<< BinFuncName() <<
"(";
3098 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3102 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3106 ss <<
" int gid0=get_global_id(0);\n";
3107 ss <<
" double var[3], coeff, res = 0.0f;\n";
3109 for(
int i = 0;
i < 3; ++
i)
3111 tmpCur = vSubArguments[
i]->GetFormulaToken();
3113 if(
ocPush == vSubArguments[
i]->GetFormulaToken()->GetOpCode())
3120 ss <<
" var["<<
i<<
"] = ";
3121 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
3123 ss <<
" if(isnan(var["<<i<<
"])||(gid0>=";
3126 ss <<
" var["<<i<<
"] = 0;\n";
3130 ss <<
" var["<<
i<<
"] = ";
3136 ss <<
" var["<<
i<<
"] = ";
3137 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
3141 tmpCur = vSubArguments[3]->GetFormulaToken();
3143 if(
ocPush == vSubArguments[3]->GetFormulaToken()->GetOpCode())
3151 ss <<
" int j = 0;\n";
3152 ss <<
" for (int i = ";
3156 ss <<
" && i < " << nCurWindowSize <<
"; ++i)\n";
3162 ss <<
" && i < gid0+"<< nCurWindowSize <<
"; ++i)\n";
3168 ss <<
" && i < "<< nCurWindowSize <<
"; ++i)\n";
3173 ss <<
"0; i < "<< nCurWindowSize <<
"; ++i)\n";
3177 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
3179 ss <<
" if (isnan(coeff))\n";
3180 ss <<
" continue;\n";
3181 ss <<
" res = res + coeff * pow(var[0],";
3182 ss <<
" var[1] + j * var[2]);\n";
3192 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
3194 ss <<
" if(isnan(coeff)||(gid0>=";
3197 ss <<
" return 0;\n";
3202 ss <<
" return res;\n";
std::string Math_Intg_Str
std::shared_ptr< DynamicKernelArgument > DynamicKernelArgumentRef
std::vector< DynamicKernelArgumentRef > SubArguments
std::string local_cothDecl
Arguments that are actually compile-time constant string Currently, only the hash is passed...
#define CHECK_PARAMETER_COUNT(min, max)
OUString getString(const Any &_rAny)
std::string local_coshDecl