LCOV - code coverage report
Current view: top level - sc/source/core/opencl - op_math.cxx (source / functions) Hit Total Coverage
Test: commit 0e63ca4fde4e446f346e35849c756a30ca294aab Lines: 1 2320 0.1 %
Date: 2014-04-11 Functions: 2 72 2.8 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  */
       9             : 
      10             : #include "op_math.hxx"
      11             : 
      12             : #include "formulagroup.hxx"
      13             : #include "document.hxx"
      14             : #include "formulacell.hxx"
      15             : #include "tokenarray.hxx"
      16             : #include "compiler.hxx"
      17             : #include "interpre.hxx"
      18             : #include "formula/vectortoken.hxx"
      19             : #include "opinlinefun_math.hxx"
      20             : #include <sstream>
      21             : 
      22             : using namespace formula;
      23             : 
      24             : namespace sc { namespace opencl {
      25             : 
      26           0 : void OpCos::GenSlidingWindowFunction(std::stringstream &ss,
      27             :             const std::string &sSymName, SubArguments &vSubArguments)
      28             : {
      29           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
      30             :     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
      31           0 :           formula::SingleVectorRefToken *>(tmpCur);
      32           0 :     ss << "\ndouble " << sSymName;
      33           0 :     ss << "_"<< BinFuncName() <<"(";
      34           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
      35             :     {
      36           0 :         if (i)
      37           0 :             ss << ",";
      38           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
      39             :     }
      40           0 :     ss << ") {\n\t";
      41           0 :     ss <<"int gid0=get_global_id(0);\n\t";
      42           0 :     ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
      43           0 :     ss << ";\n\t";
      44             : #ifdef ISNAN
      45           0 :     ss<< "if(isNan(arg0)||(gid0>=";
      46           0 :     ss<<tmpCurDVR->GetArrayLength();
      47           0 :     ss<<"))\n\t\t";
      48           0 :     ss<<"arg0 = 0;\n\t";
      49             : #endif
      50           0 :     ss << "double tmp=cos(arg0);\n\t";
      51           0 :     ss << "return tmp;\n";
      52           0 :     ss << "}";
      53           0 : }
      54           0 : void OpSec::GenSlidingWindowFunction(std::stringstream &ss,
      55             :             const std::string &sSymName, SubArguments &vSubArguments)
      56             : {
      57           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
      58             :     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
      59           0 :           formula::SingleVectorRefToken *>(tmpCur);
      60           0 :     ss << "\ndouble " << sSymName;
      61           0 :     ss << "_"<< BinFuncName() <<"(";
      62           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
      63             :     {
      64           0 :         if (i)
      65           0 :             ss << ",";
      66           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
      67             :     }
      68           0 :     ss << ") {\n";
      69           0 :     ss <<"    int gid0=get_global_id(0);\n";
      70           0 :     ss <<"    double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
      71           0 :     ss <<";\n";
      72             : #ifdef ISNAN
      73           0 :     ss<<"    if(isNan(arg0)||(gid0>=";
      74           0 :     ss<<tmpCurDVR->GetArrayLength();
      75           0 :     ss<<"))\n";
      76           0 :     ss<<"        arg0 = 0;\n";
      77             : #endif
      78           0 :     ss << "    return pow(cos(arg0),-1 );\n";
      79           0 :     ss << "}";
      80           0 : }
      81           0 : void OpCosh::BinInlineFun(std::set<std::string>& decls,
      82             :     std::set<std::string>& funs)
      83             : {
      84           0 :     decls.insert(local_coshDecl);
      85           0 :     funs.insert(local_cosh);
      86           0 : }
      87           0 : void OpSecH::GenSlidingWindowFunction(std::stringstream &ss,
      88             :             const std::string &sSymName, SubArguments &vSubArguments)
      89             : {
      90           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
      91             :     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
      92           0 :           formula::SingleVectorRefToken *>(tmpCur);
      93           0 :     ss << "\ndouble " << sSymName;
      94           0 :     ss << "_"<< BinFuncName() <<"(";
      95           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
      96             :     {
      97           0 :         if (i)
      98           0 :             ss << ",";
      99           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     100             :     }
     101           0 :     ss << ") {\n";
     102           0 :     ss <<"    int gid0=get_global_id(0);\n";
     103           0 :     ss <<"    double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     104           0 :     ss <<";\n";
     105             : #ifdef ISNAN
     106           0 :     ss<<"    if(isNan(arg0)||(gid0>=";
     107           0 :     ss<<tmpCurDVR->GetArrayLength();
     108           0 :     ss<<"))\n";
     109           0 :     ss<<"        arg0 = 0;\n";
     110             : #endif
     111           0 :     ss << "    return pow(cosh(arg0),-1 );\n";
     112           0 :     ss << "}";
     113           0 : }
     114           0 : void OpMROUND::GenSlidingWindowFunction(std::stringstream &ss,
     115             :         const std::string &sSymName, SubArguments &vSubArguments)
     116             : {
     117           0 :     ss << "\ndouble " << sSymName;
     118           0 :     ss << "_"<< BinFuncName() <<"(";
     119           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
     120             :     {
     121           0 :         if (i)
     122           0 :             ss << ", ";
     123           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     124             :     }
     125           0 :     ss<<") {\n";
     126           0 :     ss<<"    double tmp = 0;\n";
     127           0 :     ss<<"    int gid0 = get_global_id(0);\n";
     128           0 :     ss<<"    double arg0=0;\n";
     129           0 :     ss<<"    double arg1=0;\n";
     130           0 :     ss <<"\n    ";
     131             :     //while (i-- > 1)
     132           0 :     for (size_t i = 0; i < vSubArguments.size(); i++)
     133             :     {
     134           0 :         FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
     135             :         assert(pCur);
     136           0 :         if (pCur->GetType() == formula::svSingleVectorRef)
     137             :         {
     138             : #ifdef  ISNAN
     139             :             const formula::SingleVectorRefToken* pSVR =
     140           0 :                 static_cast< const formula::SingleVectorRefToken* >(pCur);
     141           0 :             ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n";
     142             : #else
     143             : #endif
     144             :         }
     145           0 :         else if (pCur->GetType() == formula::svDouble)
     146             :         {
     147             : #ifdef  ISNAN
     148           0 :             ss << "{\n";
     149             : #endif
     150             :         }
     151             :         else
     152             :         {
     153             : #ifdef  ISNAN
     154             : #endif
     155             :         }
     156             : #ifdef  ISNAN
     157           0 :         if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
     158             :         {
     159           0 :             ss << "        tmp=";
     160           0 :             ss << vSubArguments[i]->GenSlidingWindowDeclRef();
     161           0 :             ss << ";\n";
     162           0 :             ss << "        if (isNan(tmp))\n";
     163           0 :             ss << "            arg"<<i<<"= 0;\n";
     164           0 :             ss << "        else\n";
     165           0 :             ss << "            arg"<<i<<"=tmp;\n";
     166           0 :             ss << "    }\n";
     167             :         }
     168             :         else
     169             :         {
     170           0 :             ss<<"    arg"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
     171           0 :             ss<<";\n";
     172             :         }
     173             : #else
     174             :         ss<<"arg"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
     175             :         ss<<";\n";
     176             : #endif
     177             :     }
     178           0 :     ss<<"    if(arg1==0)\n";
     179           0 :     ss<<"        return arg1;\n";
     180           0 :     ss<<"    tmp=arg1 * round(arg0 * pow(arg1,-1));\n";
     181           0 :     ss<<"    return tmp;\n";
     182           0 :     ss<<"}";
     183           0 : }
     184           0 : void OpCosh::GenSlidingWindowFunction(std::stringstream &ss,
     185             :             const std::string &sSymName, SubArguments &vSubArguments)
     186             : {
     187           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     188             :     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
     189           0 :           formula::SingleVectorRefToken *>(tmpCur);
     190           0 :     ss << "\ndouble " << sSymName;
     191           0 :     ss << "_"<< BinFuncName() <<"(";
     192           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
     193             :     {
     194           0 :         if (i)
     195           0 :             ss << ",";
     196           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     197             :     }
     198           0 :     ss << ")\n{\n";
     199           0 :     ss <<"    int gid0=get_global_id(0);\n";
     200           0 :     ss << "    double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     201           0 :     ss << ";\n";
     202             : #ifdef ISNAN
     203           0 :     ss<< "    if(isNan(arg0)||(gid0>=";
     204           0 :     ss<<tmpCurDVR->GetArrayLength();
     205           0 :     ss<<"))\n";
     206           0 :     ss<<"        arg0 = 0;\n";
     207             : #endif
     208           0 :     ss << "    double tmp=local_cosh(arg0);\n";
     209           0 :     ss << "    return tmp;\n";
     210           0 :     ss << "}";
     211           0 : }
     212             : 
     213           0 : void OpCot::GenSlidingWindowFunction(std::stringstream &ss,
     214             :     const std::string &sSymName, SubArguments &vSubArguments)
     215             : {
     216           0 :     ss << "\ndouble " << sSymName;
     217           0 :     ss << "_"<< BinFuncName() <<"(";
     218           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
     219             :     {
     220           0 :         if (i)
     221           0 :             ss << ",";
     222           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     223             :     }
     224           0 :     ss << ")\n";
     225           0 :     ss << "{\n";
     226           0 :     ss << "    int gid0=get_global_id(0);\n";
     227           0 :     ss << "    double arg0 = 0.0f;\n";
     228           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     229             :     assert(tmpCur);
     230           0 :     if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
     231             :     {
     232           0 :         if(tmpCur->GetType() == formula::svSingleVectorRef)
     233             :         {
     234             :             const formula::SingleVectorRefToken*tmpCurDVR=
     235             :                 static_cast
     236           0 :                 <const formula::SingleVectorRefToken *>(tmpCur);
     237           0 :             ss << "    arg0 = ";
     238           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     239           0 :             ss << ";\n";
     240             : #ifdef ISNAN
     241           0 :             ss << "    if(isNan(";
     242           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     243           0 :             ss << ")||(gid0>=";
     244           0 :             ss << tmpCurDVR->GetArrayLength();
     245           0 :             ss << "))\n";
     246           0 :             ss << "    { arg0 = 0.0f; }\n";
     247             : #endif
     248             :         }
     249           0 :         else if(tmpCur->GetType() == formula::svDouble)
     250             :         {
     251           0 :             ss << "    arg0=";
     252           0 :             ss << tmpCur->GetDouble() << ";\n";
     253             :         }
     254             :     }
     255             :     else
     256             :     {
     257           0 :         ss << "        arg0 = ";
     258           0 :         ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     259           0 :         ss << ";\n";
     260             :     }
     261           0 :     ss << "    arg0 = arg0 * M_1_PI;\n";
     262           0 :     ss << "    return cospi(arg0) * pow(sinpi(arg0), -1);\n";
     263           0 :     ss << "}";
     264           0 : }
     265             : 
     266             : 
     267           0 : void OpCoth::BinInlineFun(std::set<std::string>& decls,
     268             :     std::set<std::string>& funs)
     269             : {
     270           0 :     decls.insert(local_cothDecl);
     271           0 :     funs.insert(local_coth);
     272           0 : }
     273             : 
     274           0 : void OpCoth::GenSlidingWindowFunction(std::stringstream &ss,
     275             :             const std::string &sSymName, SubArguments &vSubArguments)
     276             : {
     277           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     278             :     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
     279           0 :           formula::SingleVectorRefToken *>(tmpCur);
     280           0 :     ss << "\ndouble " << sSymName;
     281           0 :     ss << "_"<< BinFuncName() <<"(";
     282           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
     283             :     {
     284           0 :         if (i)
     285           0 :             ss << ",";
     286           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     287             :     }
     288           0 :     ss << ")\n{\n";
     289           0 :     ss <<"    int gid0=get_global_id(0);\n";
     290           0 :     ss << "    double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     291           0 :     ss << ";\n";
     292             : #ifdef ISNAN
     293           0 :     ss<< "    if(isNan(arg0)||(gid0>=";
     294           0 :     ss<<tmpCurDVR->GetArrayLength();
     295           0 :     ss<<"))\n";
     296           0 :     ss<<"        arg0 = 0;\n";
     297             : #endif
     298           0 :     ss << "    double tmp=local_coth(arg0);\n";
     299           0 :     ss << "    return tmp;\n";
     300           0 :     ss << "}";
     301           0 : }
     302             : 
     303           0 : void OpCombina::BinInlineFun(std::set<std::string>& decls,
     304             :     std::set<std::string>& funs)
     305             : {
     306           0 :     decls.insert(bikDecl);
     307           0 :     funs.insert(bik);
     308           0 : }
     309             : 
     310           0 : void OpCombina::GenSlidingWindowFunction(std::stringstream &ss,
     311             :             const std::string &sSymName, SubArguments &vSubArguments)
     312             : {
     313           0 :     ss << "\ndouble " << sSymName;
     314           0 :     ss << "_"<< BinFuncName() <<"(";
     315           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
     316             :     {
     317           0 :         if (i)
     318           0 :             ss << ",";
     319           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     320             :     }
     321           0 :     ss << ")\n{\n";
     322           0 :     ss << "    int gid0 = get_global_id(0);\n";
     323           0 :     ss << "    double tem;\n";
     324           0 :     ss << "    double arg0,arg1;\n";
     325           0 :     for (unsigned int i = 0; i < vSubArguments.size(); i++)
     326             :     {
     327           0 :         FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
     328             :         assert(pCur);
     329           0 :         ss << "    arg"<<i<<" = "<<vSubArguments[i]->GenSlidingWindowDeclRef();
     330           0 :         ss << ";\n";
     331           0 :         if(pCur->GetType() == formula::svSingleVectorRef)
     332             :         {
     333             : #ifdef ISNAN
     334             :             const formula::SingleVectorRefToken* pSVR =
     335           0 :             static_cast< const formula::SingleVectorRefToken* >(pCur);
     336           0 :             ss << "    if(isNan(arg" << i <<")||(gid0 >= ";
     337           0 :             ss << pSVR->GetArrayLength();
     338           0 :             ss << "))\n";
     339           0 :             ss << "        arg" << i << " = 0;\n";
     340             :         }
     341           0 :         else if (pCur->GetType() == formula::svDouble)
     342             :         {
     343           0 :             ss << "    if(isNan(arg" << i <<"))\n";
     344           0 :             ss << "        arg" << i << " = 0;\n";
     345             :         }
     346             : #endif
     347             :     }
     348           0 :     ss << "    arg0 = trunc(arg0);\n";
     349           0 :     ss << "    arg1 = trunc(arg1);\n";
     350           0 :     ss << "    if(arg0 >= arg1 && arg0 > 0 && arg1 > 0)\n";
     351           0 :     ss << "        tem = bik(arg0+arg1-1,arg1);\n";
     352           0 :     ss << "    else if(arg0 == 0 && arg1 == 0)\n";
     353           0 :     ss << "        tem = 0;\n";
     354           0 :     ss << "    else if(arg0 > 0 && arg1 == 0)\n";
     355           0 :     ss << "        tem = 1;\n";
     356           0 :     ss << "    else\n";
     357           0 :     ss << "        tem = -1;\n";
     358           0 :     ss << "    double i = tem - trunc(tem);\n";
     359           0 :     ss << "    if(i < 0.5)\n";
     360           0 :     ss << "        tem = trunc(tem);\n";
     361           0 :     ss << "    else\n";
     362           0 :     ss << "        tem = trunc(tem) + 1;\n";
     363           0 :     ss << "    return tem;\n";
     364           0 :     ss << "}";
     365           0 : }
     366           0 : void OpEven::GenSlidingWindowFunction(std::stringstream &ss,
     367             :             const std::string &sSymName, SubArguments &vSubArguments)
     368             : {
     369           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     370             :     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
     371           0 :           formula::SingleVectorRefToken *>(tmpCur);
     372           0 :     ss << "\ndouble " << sSymName;
     373           0 :     ss << "_"<< BinFuncName() <<"(";
     374           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
     375             :     {
     376           0 :         if (i)
     377           0 :             ss << ",";
     378           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     379             :     }
     380           0 :     ss << ")\n{\n";
     381           0 :     ss <<"    int gid0=get_global_id(0);\n";
     382           0 :     ss << "    double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     383           0 :     ss << ";\n";
     384             : #ifdef ISNAN
     385           0 :     ss<< "    if(isNan(arg0)||(gid0>=";
     386           0 :     ss<<tmpCurDVR->GetArrayLength();
     387           0 :     ss<<"))\n";
     388           0 :     ss<<"        arg0 = 0;\n";
     389             : #endif
     390           0 :     ss << "    double tmp;\n";
     391           0 :     ss << "    tmp = fabs(arg0 / 2);\n";
     392           0 :     ss << "    if ( trunc(tmp) == tmp )\n";
     393           0 :     ss << "        tmp = tmp * 2;\n";
     394           0 :     ss << "    else\n";
     395           0 :     ss << "        tmp = (trunc(tmp) + 1) * 2;\n";
     396           0 :     ss << "    if (arg0 < 0)\n";
     397           0 :     ss << "        tmp = tmp * -1.0;\n";
     398           0 :     ss << "    return tmp;\n";
     399           0 :     ss << "}";
     400           0 : }
     401             : 
     402           0 : void OpMod::GenSlidingWindowFunction(std::stringstream &ss,
     403             :             const std::string &sSymName, SubArguments &vSubArguments)
     404             : {
     405             : #ifdef ISNAN
     406           0 :     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
     407             :     const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
     408           0 :           formula::SingleVectorRefToken *>(tmpCur0);
     409           0 :     FormulaToken *tmpCur1 = vSubArguments[0]->GetFormulaToken();
     410             :     const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
     411           0 :           formula::SingleVectorRefToken *>(tmpCur1);
     412             : #endif
     413           0 :     ss << "\ndouble " << sSymName;
     414           0 :     ss << "_"<< BinFuncName() <<"(";
     415           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
     416             :     {
     417           0 :         if (i)
     418           0 :             ss << ",";
     419           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     420             :     }
     421           0 :     ss << ")\n{\n";
     422           0 :     ss <<"    int gid0=get_global_id(0);\n";
     423           0 :     ss << "    double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     424           0 :     ss << ";\n";
     425           0 :     ss <<"    double arg1 =" << vSubArguments[1]->GenSlidingWindowDeclRef();
     426           0 :     ss << ";\n";
     427             : #ifdef ISNAN
     428           0 :     ss<< "    if(isNan(arg0)||(gid0>=";
     429           0 :     ss<<tmpCurDVR0->GetArrayLength();
     430           0 :     ss<<"))\n";
     431           0 :     ss<<"        arg0 = 0;\n";
     432             : #endif
     433             : #ifdef ISNAN
     434           0 :     ss<< "    if(isNan(arg1)||(gid0>=";
     435           0 :     ss<<tmpCurDVR1->GetArrayLength();
     436           0 :     ss<<"))\n";
     437           0 :     ss<<"        arg1 = 0;\n";
     438             : #endif
     439           0 :     ss << "    double tem;\n";
     440           0 :     ss << "    if(arg1 != 0) {\n";
     441           0 :     ss << "        if(arg0 < 0 && arg1 > 0)\n";
     442           0 :     ss << "            while(arg0 < 0)\n";
     443           0 :     ss << "                arg0 += arg1;\n";
     444           0 :     ss << "        else if (arg0 > 0 && arg1 < 0)\n";
     445           0 :     ss << "            while(arg0 > 0)\n";
     446           0 :     ss << "                arg0 += arg1;\n";
     447           0 :     ss << "        tem = fmod(arg0,arg1);\n";
     448           0 :     ss << "    }\n";
     449           0 :     ss << "    else\n";
     450           0 :     ss << "        tem = 0;\n";
     451           0 :     ss << "    if(arg1 < 0 && tem > 0)\n";
     452           0 :     ss << "        tem = -tem;\n";
     453           0 :     ss << "    return tem;\n";
     454           0 :     ss << "}";
     455           0 : }
     456           0 : void OpLog::GenSlidingWindowFunction(std::stringstream &ss,
     457             :             const std::string &sSymName, SubArguments &vSubArguments)
     458             : {
     459           0 :     ss << "\ndouble " << sSymName;
     460           0 :     ss << "_"<< BinFuncName() <<"(";
     461           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
     462             :     {
     463           0 :         if (i)
     464           0 :             ss << ",";
     465           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     466             :     }
     467           0 :     ss << ")\n{\n";
     468           0 :     ss << "    int gid0 = get_global_id(0);\n";
     469           0 :     ss << "    double tem;\n";
     470           0 :     ss << "    double arg0,arg1;\n";
     471           0 :     for (unsigned int i = 0; i < vSubArguments.size(); i++)
     472             :     {
     473           0 :         FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
     474             :         assert(pCur);
     475           0 :         ss << "    arg"<<i<<" = "<<vSubArguments[i]->GenSlidingWindowDeclRef();
     476           0 :         ss << ";\n";
     477           0 :         if(pCur->GetType() == formula::svSingleVectorRef)
     478             :         {
     479             : #ifdef ISNAN
     480             :             const formula::SingleVectorRefToken* pSVR =
     481           0 :             static_cast< const formula::SingleVectorRefToken* >(pCur);
     482           0 :             ss << "    if(isNan(arg" << i <<")||(gid0 >= ";
     483           0 :             ss << pSVR->GetArrayLength();
     484           0 :             ss << "))\n";
     485           0 :             if( i == 0)
     486           0 :                 ss << "        arg0 = 0;\n";
     487           0 :             else if ( i == 1)
     488           0 :                 ss << "        arg1 = 10;\n";
     489             :         }
     490           0 :         else if (pCur->GetType() == formula::svDouble)
     491             :         {
     492           0 :             ss << "    if(isNan(arg" << i <<"))\n";
     493           0 :             if( i == 0)
     494           0 :                 ss << "        arg0 = 0;\n";
     495           0 :             else if ( i == 1)
     496           0 :                 ss << "        arg1 = 10;\n";
     497             :         }
     498             : #endif
     499             :     }
     500           0 :     if (vSubArguments.size() < 2)
     501           0 :         ss << "    arg1 = 10;\n";
     502           0 :     ss << "    tem = log10(arg0)/log10(arg1);;\n";
     503           0 :     ss << "    return tem;\n";
     504           0 :     ss << "}";
     505           0 : }
     506           0 : void OpCsc::GenSlidingWindowFunction(
     507             :     std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
     508             : {
     509           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     510             :     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
     511           0 :           formula::SingleVectorRefToken *>(tmpCur);
     512           0 :     ss << "\ndouble " << sSymName;
     513           0 :     ss << "_"<< BinFuncName() <<"(";
     514           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
     515             :     {
     516           0 :         if (i)
     517           0 :             ss << ",";
     518           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     519             :     }
     520           0 :     ss << ")\n{\n\t";
     521           0 :     ss <<"int gid0=get_global_id(0);\n\t";
     522           0 :     ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     523           0 :     ss << ";\n\t";
     524             : #ifdef ISNAN
     525           0 :     ss<< "if(isNan(arg0)||(gid0>=";
     526           0 :     ss<<tmpCurDVR->GetArrayLength();
     527           0 :     ss<<"))\n\t\t";
     528           0 :     ss<<"arg0 = 0;\n\t";
     529             : #endif
     530           0 :     ss << "double tmp=1/sin(arg0);\n\t";
     531           0 :     ss << "return tmp;\n";
     532           0 :     ss << "}";
     533           0 : }
     534           0 : void OpCountIfs::GenSlidingWindowFunction(std::stringstream &ss,
     535             :             const std::string &sSymName, SubArguments &vSubArguments)
     536             : {
     537           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     538             :     const formula::DoubleVectorRefToken*pCurDVR= static_cast<const
     539           0 :          formula::DoubleVectorRefToken *>(tmpCur);
     540           0 :     size_t nCurWindowSize = pCurDVR->GetArrayLength() <
     541           0 :     pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength():
     542           0 :     pCurDVR->GetRefRowSize() ;
     543           0 :     ss << "\ndouble " << sSymName;
     544           0 :     ss << "_"<< BinFuncName() <<"(";
     545           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
     546             :     {
     547           0 :         if (i)
     548           0 :             ss << ",";
     549           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     550             :     }
     551           0 :     ss << ")\n    {\n";
     552           0 :     ss <<"    int gid0=get_global_id(0);\n";
     553           0 :     ss << "    int tmp =0;\n";
     554           0 :     ss << "    int loop;\n";
     555           0 :     GenTmpVariables(ss,vSubArguments);
     556             : 
     557           0 :      ss<< "    int singleIndex =gid0;\n";
     558           0 :      int m=0;
     559             : 
     560           0 :      std::stringstream tmpss;
     561             : 
     562           0 :      for(unsigned j=0;j<vSubArguments.size();j+=2,m++)
     563             :      {
     564           0 :         CheckSubArgumentIsNan(tmpss,vSubArguments,j);
     565           0 :         CheckSubArgumentIsNan(ss,vSubArguments,j+1);
     566           0 :         tmpss <<"    if(isequal(";
     567           0 :         tmpss <<"tmp";
     568           0 :         tmpss <<j;
     569           0 :         tmpss <<" , ";
     570           0 :         tmpss << "tmp";
     571           0 :         tmpss << j+1;
     572           0 :         tmpss << ")){\n";
     573             :      }
     574           0 :     tmpss << "    tmp ++;\n";
     575           0 :     for(unsigned j=0;j<vSubArguments.size();j+=2,m--)
     576             :      {
     577           0 :          for(int n = 0;n<m+1;n++)
     578             :         {
     579           0 :             tmpss << "    ";
     580             :         }
     581           0 :         tmpss<< "}\n";
     582             :      }
     583           0 :      UnrollDoubleVector(ss,tmpss,pCurDVR,nCurWindowSize);
     584             : 
     585           0 :     ss << "return tmp;\n";
     586           0 :     ss << "}";
     587           0 : }
     588           0 : void OpSumIfs::GenSlidingWindowFunction(std::stringstream &ss,
     589             :             const std::string &sSymName, SubArguments &vSubArguments)
     590             : {
     591           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     592             :     const formula::DoubleVectorRefToken*pCurDVR= static_cast<const
     593           0 :          formula::DoubleVectorRefToken *>(tmpCur);
     594           0 :     size_t nCurWindowSize = pCurDVR->GetArrayLength() <
     595           0 :     pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength():
     596           0 :     pCurDVR->GetRefRowSize() ;
     597             : 
     598           0 :     mNeedReductionKernel = vSubArguments[0]->NeedParallelReduction();
     599           0 :     if (mNeedReductionKernel)
     600             :     {
     601             :         // generate reduction functions
     602             : 
     603           0 :         ss << "__kernel void ";
     604           0 :         ss << vSubArguments[0]->GetName();
     605           0 :         ss << "_SumIfs_reduction(  ";
     606           0 :         for (unsigned i = 0; i < vSubArguments.size(); i++)
     607             :         {
     608           0 :             if (i)
     609           0 :                 ss << ",";
     610           0 :             vSubArguments[i]->GenSlidingWindowDecl(ss);
     611             :         }
     612           0 :         ss << ", __global double *result,int arrayLength,int windowSize";
     613             : 
     614           0 :         ss << ")\n{\n";
     615           0 :         ss << "    double tmp =0;\n";
     616           0 :         ss << "    int i ;\n";
     617             : 
     618           0 :         GenTmpVariables(ss,vSubArguments);
     619           0 :         ss << "    double current_result = 0.0;\n";
     620           0 :         ss << "    int writePos = get_group_id(1);\n";
     621           0 :         if (pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed())
     622           0 :             ss << "    int offset = 0;\n";
     623           0 :         else if (!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
     624           0 :             ss << "    int offset = get_group_id(1);\n";
     625             :         else
     626           0 :             throw Unhandled();
     627             :         // actually unreachable
     628           0 :         ss << "    int lidx = get_local_id(0);\n";
     629           0 :         ss << "    __local double shm_buf[256];\n";
     630           0 :         ss << "    barrier(CLK_LOCAL_MEM_FENCE);\n";
     631           0 :         ss << "    int loop = arrayLength/512 + 1;\n";
     632           0 :         ss << "    for (int l=0; l<loop; l++){\n";
     633           0 :         ss << "        tmp = 0.0;\n";
     634           0 :         ss << "        int loopOffset = l*512;\n";
     635             : 
     636           0 :         ss << "        int p1 = loopOffset + lidx + offset, p2 = p1 + 256;\n";
     637           0 :         ss << "        if (p2 < min(offset + windowSize, arrayLength)) {\n";
     638           0 :         ss << "            tmp0 = 0.0;\n";
     639           0 :         int mm=0;
     640           0 :         std::string p1 = "p1";
     641           0 :         std::string p2 = "p2";
     642           0 :         for(unsigned j=1;j<vSubArguments.size();j+=2,mm++)
     643             :         {
     644           0 :             CheckSubArgumentIsNan2(ss,vSubArguments,j,p1);
     645           0 :             CheckSubArgumentIsNan2(ss,vSubArguments,j+1,p1);
     646           0 :             ss << "";
     647           0 :             ss <<"    if(isequal(";
     648           0 :             ss <<"tmp";
     649           0 :             ss <<j;
     650           0 :             ss <<" , ";
     651           0 :             ss << "tmp";
     652           0 :             ss << j+1;
     653           0 :             ss << "))";
     654           0 :             ss << "{\n";
     655             :         }
     656           0 :         CheckSubArgumentIsNan2(ss,vSubArguments,0,p1);
     657           0 :         ss << "    tmp += tmp0;\n";
     658           0 :         for(unsigned j=1;j<vSubArguments.size();j+=2,mm--)
     659             :         {
     660           0 :             for(int n = 0;n<mm+1;n++)
     661             :             {
     662           0 :                 ss << "    ";
     663             :             }
     664           0 :             ss<< "}\n\n";
     665             :         }
     666           0 :         mm=0;
     667           0 :         for(unsigned j=1;j<vSubArguments.size();j+=2,mm++)
     668             :         {
     669           0 :             CheckSubArgumentIsNan2(ss,vSubArguments,j,p2);
     670           0 :             CheckSubArgumentIsNan2(ss,vSubArguments,j+1,p2);
     671           0 :             ss <<"    if(isequal(";
     672           0 :             ss <<"tmp";
     673           0 :             ss <<j;
     674           0 :             ss <<" , ";
     675           0 :             ss << "tmp";
     676           0 :             ss << j+1;
     677           0 :             ss << ")){\n";
     678             :         }
     679           0 :         CheckSubArgumentIsNan2(ss,vSubArguments,0,p2);
     680           0 :         ss << "    tmp += tmp0;\n";
     681           0 :         for(unsigned j=1;j< vSubArguments.size();j+=2,mm--)
     682             :         {
     683           0 :             for(int n = 0;n<mm+1;n++)
     684             :             {
     685           0 :                 ss << "    ";
     686             :             }
     687           0 :             ss<< "}\n";
     688             :         }
     689           0 :         ss << "    }\n";
     690             : 
     691           0 :         ss << "    else if (p1 < min(arrayLength, offset + windowSize)) {\n";
     692           0 :         mm=0;
     693           0 :         for(unsigned j=1;j<vSubArguments.size();j+=2,mm++)
     694             :         {
     695           0 :             CheckSubArgumentIsNan2(ss,vSubArguments,j,p1);
     696           0 :             CheckSubArgumentIsNan2(ss,vSubArguments,j+1,p1);
     697             : 
     698           0 :             ss <<"    if(isequal(";
     699           0 :             ss <<"tmp";
     700           0 :             ss <<j;
     701           0 :             ss <<" , ";
     702           0 :             ss << "tmp";
     703           0 :             ss << j+1;
     704           0 :             ss << ")){\n";
     705             :         }
     706           0 :         CheckSubArgumentIsNan2(ss,vSubArguments,0,p1);
     707           0 :         ss << "    tmp += tmp0;\n";
     708           0 :         for(unsigned j=1;j<vSubArguments.size();j+=2,mm--)
     709             :         {
     710           0 :             for(int n = 0;n<mm+1;n++)
     711             :             {
     712           0 :                 ss << "    ";
     713             :             }
     714           0 :             ss<< "}\n\n";
     715             :         }
     716             : 
     717           0 :         ss << "    }\n";
     718           0 :         ss << "    shm_buf[lidx] = tmp;\n";
     719           0 :         ss << "    barrier(CLK_LOCAL_MEM_FENCE);\n";
     720           0 :         ss << "    for (int i = 128; i >0; i/=2) {\n";
     721           0 :         ss << "        if (lidx < i)\n";
     722           0 :         ss << "            shm_buf[lidx] += shm_buf[lidx + i];\n";
     723           0 :         ss << "        barrier(CLK_LOCAL_MEM_FENCE);\n";
     724           0 :         ss << "    }\n";
     725           0 :         ss << "    if (lidx == 0)\n";
     726           0 :         ss << "        current_result += shm_buf[0];\n";
     727           0 :         ss << "    barrier(CLK_LOCAL_MEM_FENCE);\n";
     728           0 :         ss << "    }\n";
     729             : 
     730           0 :         ss << "    if (lidx == 0)\n";
     731           0 :         ss << "        result[writePos] = current_result;\n";
     732           0 :         ss << "}\n";
     733             :     }// finish generate reduction code
     734             :     // generate functions as usual
     735           0 :     ss << "\ndouble " << sSymName;
     736           0 :     ss << "_"<< BinFuncName() <<"(";
     737           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
     738             :     {
     739           0 :         if (i)
     740           0 :             ss << ",";
     741           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     742             :     }
     743           0 :     ss << ")\n    {\n";
     744           0 :     ss <<"    int gid0=get_global_id(0);\n";
     745           0 :     ss << "    double tmp =0;\n";
     746           0 :     if (!mNeedReductionKernel)
     747             :     {
     748           0 :         ss << "    int i ;\n";
     749           0 :         GenTmpVariables(ss,vSubArguments);
     750           0 :         ss << "    for (i = ";
     751           0 :         if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) {
     752           0 :             ss << "gid0; i < "<< nCurWindowSize <<"; i++)\n";
     753           0 :         } else if (pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) {
     754           0 :             ss << "0; i < gid0+"<< nCurWindowSize <<"; i++)\n";
     755             :         } else {
     756           0 :             ss << "0; i < "<< nCurWindowSize <<"; i++)\n";
     757             :         }
     758           0 :         ss << "    {\n";
     759           0 :         if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
     760             :         {
     761           0 :             ss<< "    int doubleIndex =i+gid0;\n";
     762             :         }else
     763             :         {
     764           0 :             ss<< "    int doubleIndex =i;\n";
     765             :         }
     766           0 :         ss<< "    int singleIndex =gid0;\n";
     767           0 :         int m=0;
     768           0 :         for(unsigned j=1;j<vSubArguments.size();j+=2,m++)
     769             :         {
     770           0 :             CheckSubArgumentIsNan(ss,vSubArguments,j);
     771           0 :             CheckSubArgumentIsNan(ss,vSubArguments,j+1);
     772           0 :             ss <<"    if(isequal(";
     773           0 :             ss <<"tmp";
     774           0 :             ss <<j;
     775           0 :             ss <<" , ";
     776           0 :             ss << "tmp";
     777           0 :             ss << j+1;
     778           0 :             ss << ")){\n";
     779             :         }
     780           0 :         CheckSubArgumentIsNan(ss,vSubArguments,0);
     781           0 :         ss << "    tmp += tmp0;\n";
     782           0 :         for(unsigned j=1;j<=vSubArguments.size();j+=2,m--)
     783             :         {
     784           0 :             for(int n = 0;n<m+1;n++)
     785             :             {
     786           0 :                 ss << "    ";
     787             :             }
     788           0 :             ss<< "}\n";
     789             :         }
     790             :     }
     791           0 :     if (mNeedReductionKernel)
     792             :     {
     793           0 :         ss << "tmp =";
     794           0 :         vSubArguments[0]->GenDeclRef(ss);
     795           0 :         ss << "[gid0];\n";
     796             :     }
     797           0 :     ss << "return tmp;\n";
     798           0 :     ss << "}";
     799           0 : }
     800           0 : void OpCscH::GenSlidingWindowFunction(
     801             :     std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
     802             : {
     803           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     804             :     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
     805           0 :           formula::SingleVectorRefToken *>(tmpCur);
     806           0 :     ss << "\ndouble " << sSymName;
     807           0 :     ss << "_"<< BinFuncName() <<"(";
     808           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
     809             :     {
     810           0 :         if (i)
     811           0 :             ss << ",";
     812           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     813             :     }
     814           0 :     ss << ")\n{\n\t";
     815           0 :     ss <<"int gid0=get_global_id(0);\n\t";
     816           0 :     ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     817           0 :     ss << ";\n\t";
     818             : #ifdef ISNAN
     819           0 :     ss<< "if(isNan(arg0)||(gid0>=";
     820           0 :     ss<<tmpCurDVR->GetArrayLength();
     821           0 :     ss<<"))\n\t\t";
     822           0 :     ss<<"arg0 = 0;\n\t";
     823             : #endif
     824           0 :     ss << "double tmp=1/sinh(arg0);\n\t";
     825           0 :     ss << "return tmp;\n";
     826           0 :     ss << "}";
     827           0 : }
     828           0 : void OpExp::GenSlidingWindowFunction(std::stringstream &ss,
     829             :             const std::string &sSymName, SubArguments &vSubArguments)
     830             : {
     831           0 :     ss << "\ndouble " << sSymName;
     832           0 :     ss << "_"<< BinFuncName() <<"(";
     833           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
     834             :     {
     835           0 :         if (i) ss << ",";
     836           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     837             :     }
     838           0 :     ss << ")\n";
     839           0 :     ss << "{\n";
     840           0 :     ss << "    int gid0=get_global_id(0);\n";
     841           0 :     ss << "    double arg0 = 0.0f;\n";
     842           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     843             :     assert(tmpCur);
     844           0 :     if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
     845             :     {
     846           0 :         if(tmpCur->GetType() == formula::svSingleVectorRef)
     847             :         {
     848             :             const formula::SingleVectorRefToken*tmpCurDVR=
     849             :                 static_cast
     850           0 :                 <const formula::SingleVectorRefToken *>(tmpCur);
     851           0 :             ss << "    arg0 = ";
     852           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     853           0 :             ss << ";\n";
     854             : #ifdef ISNAN
     855           0 :             ss << "    if(isNan(";
     856           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     857           0 :             ss << ")||(gid0>=";
     858           0 :             ss << tmpCurDVR->GetArrayLength();
     859           0 :             ss << "))\n";
     860           0 :             ss << "    { arg0 = 0.0f; }\n";
     861             : #endif
     862             :         }
     863           0 :         else if(tmpCur->GetType() == formula::svDouble)
     864             :         {
     865           0 :             ss << "    arg0=" << tmpCur->GetDouble() << ";\n";
     866             :         }
     867             :     }
     868             :     else
     869             :     {
     870           0 :         ss << "        arg0 = ";
     871           0 :         ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     872           0 :         ss << ";\n";
     873             :     }
     874           0 :     ss << "    return pow(M_E, arg0);\n";
     875           0 :     ss << "}";
     876           0 : }
     877             : 
     878           0 : void OpAverageIfs::GenSlidingWindowFunction(std::stringstream &ss,
     879             :             const std::string &sSymName, SubArguments &vSubArguments)
     880             : {
     881           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     882             :     const formula::DoubleVectorRefToken*pCurDVR= static_cast<const
     883           0 :          formula::DoubleVectorRefToken *>(tmpCur);
     884           0 :     size_t nCurWindowSize = pCurDVR->GetArrayLength() <
     885           0 :     pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength():
     886           0 :     pCurDVR->GetRefRowSize() ;
     887           0 :     ss << "\ndouble " << sSymName;
     888           0 :     ss << "_"<< BinFuncName() <<"(";
     889           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
     890             :     {
     891           0 :         if (i)
     892           0 :             ss << ",";
     893           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     894             :     }
     895           0 :     ss << ")\n    {\n";
     896           0 :     ss <<"     int gid0=get_global_id(0);\n";
     897           0 :     ss << "    double tmp =0;\n";
     898           0 :     ss << "    int count=0;\n";
     899           0 :     ss << "    int loop;";
     900           0 :     GenTmpVariables(ss,vSubArguments);
     901           0 :      ss<< "    int singleIndex =gid0;\n";
     902           0 :      int m=0;
     903           0 :      std::stringstream tmpss;
     904           0 :      for(unsigned j=1;j<vSubArguments.size();j+=2,m++)
     905             :      {
     906           0 :         CheckSubArgumentIsNan(tmpss,vSubArguments,j);
     907           0 :         CheckSubArgumentIsNan(ss,vSubArguments,j+1);
     908           0 :         tmpss <<"    if(isequal(";
     909           0 :         tmpss <<"tmp";
     910           0 :         tmpss <<j;
     911           0 :         tmpss <<" , ";
     912           0 :         tmpss << "tmp";
     913           0 :         tmpss << j+1;
     914           0 :         tmpss << ")){\n";
     915             :      }
     916           0 :      CheckSubArgumentIsNan(tmpss,vSubArguments,0);
     917           0 :     tmpss << "    tmp += tmp0;\n";
     918           0 :     tmpss << "    count++;\n";
     919           0 :     for(unsigned j=1;j<vSubArguments.size();j+=2,m--)
     920             :      {
     921           0 :          for(int n = 0;n<m+1;n++)
     922             :         {
     923           0 :             tmpss << "    ";
     924             :         }
     925           0 :         tmpss<< "}\n";
     926             :      }
     927             : 
     928           0 :     UnrollDoubleVector(ss,tmpss,pCurDVR,nCurWindowSize);
     929             : 
     930           0 :      ss << "    if(count!=0)\n";
     931           0 :      ss << "        tmp=tmp/count;\n";
     932           0 :      ss << "    else\n";
     933           0 :      ss << "        tmp= 0 ;\n";
     934           0 :     ss << "return tmp;\n";
     935           0 :     ss << "}";
     936           0 : }
     937             : 
     938           0 : void OpLog10::GenSlidingWindowFunction(std::stringstream &ss,
     939             :                const std::string &sSymName, SubArguments &vSubArguments)
     940             : {
     941           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     942             :     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
     943           0 :           formula::SingleVectorRefToken *>(tmpCur);
     944           0 :     ss << "\ndouble " << sSymName;
     945           0 :     ss << "_"<< BinFuncName() <<"(";
     946           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
     947             :     {
     948           0 :         if (i)
     949           0 :             ss << ",";
     950           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     951             :     }
     952           0 :     ss << ")\n{\n\t";
     953           0 :     ss <<"int gid0=get_global_id(0);\n\t";
     954           0 :     ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     955           0 :     ss << ";\n\t";
     956             : #ifdef ISNAN
     957           0 :     ss<< "if(isNan(arg0)||(gid0>=";
     958           0 :     ss<<tmpCurDVR->GetArrayLength();
     959           0 :     ss<<"))\n\t\t";
     960           0 :     ss<<"arg0 = 0;\n\t";
     961             : #endif
     962           0 :     ss << "double tmp=log10(arg0);\n\t";
     963           0 :     ss << "return tmp;\n";
     964           0 :     ss << "}";
     965           0 : }
     966             : 
     967           0 : void OpSinh::GenSlidingWindowFunction(std::stringstream &ss,
     968             :             const std::string &sSymName, SubArguments &vSubArguments)
     969             : {
     970           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     971             :     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
     972           0 :               formula::SingleVectorRefToken *>(tmpCur);
     973           0 :     ss << "\ndouble " << sSymName;
     974           0 :     ss << "_"<< BinFuncName() <<"(";
     975           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
     976             :     {
     977           0 :         if (i)
     978           0 :             ss << ",";
     979           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
     980             :     }
     981           0 :     ss <<") {\n";
     982           0 :     ss <<"    int gid0=get_global_id(0);\n";
     983           0 :     ss <<"    double arg0 = " <<
     984           0 :         vSubArguments[0]->GenSlidingWindowDeclRef();
     985           0 :     ss <<";\n";
     986             : #ifdef ISNAN
     987           0 :     ss<< "    if(isNan(arg0)||(gid0>=";
     988           0 :     ss<<tmpCurDVR->GetArrayLength();
     989           0 :     ss<<"))\n";
     990           0 :     ss<<"        arg0 = 0;\n";
     991             : #endif
     992           0 :     ss << "    double tmp=( exp(arg0)-exp(-arg0) )/2;\n";
     993           0 :     ss << "    return tmp;\n";
     994           0 :     ss << "}";
     995           0 : }
     996           0 : void OpSin::GenSlidingWindowFunction(std::stringstream &ss,
     997             :             const std::string &sSymName, SubArguments &vSubArguments)
     998             : {
     999           0 :     ss << "\ndouble " << sSymName;
    1000           0 :     ss << "_"<< BinFuncName() <<"(";
    1001           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1002             :     {
    1003           0 :         if (i) ss << ",";
    1004           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1005             :     }
    1006           0 :     ss << ")\n";
    1007           0 :     ss << "{\n";
    1008           0 :     ss << "    int gid0=get_global_id(0);\n";
    1009           0 :     ss << "    double arg0 = 0.0f;\n";
    1010           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
    1011             :     assert(tmpCur);
    1012           0 :     if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
    1013             :     {
    1014           0 :         if(tmpCur->GetType() == formula::svSingleVectorRef)
    1015             :         {
    1016             :             const formula::SingleVectorRefToken*tmpCurDVR=
    1017             :                 static_cast
    1018           0 :                 <const formula::SingleVectorRefToken *>(tmpCur);
    1019           0 :             ss << "    arg0 = ";
    1020           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    1021           0 :             ss << ";\n";
    1022             : #ifdef ISNAN
    1023           0 :             ss << "    if(isNan(";
    1024           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    1025           0 :             ss << ")||(gid0>=";
    1026           0 :             ss << tmpCurDVR->GetArrayLength();
    1027           0 :             ss << "))\n";
    1028           0 :             ss << "    { arg0 = 0.0f; }\n";
    1029             : #endif
    1030             :         }
    1031           0 :         else if(tmpCur->GetType() == formula::svDouble)
    1032             :         {
    1033           0 :             ss << "    arg0=" << tmpCur->GetDouble() << ";\n";
    1034             :         }
    1035             :     }
    1036             :     else
    1037             :     {
    1038           0 :         ss << "        arg0 = ";
    1039           0 :         ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    1040           0 :         ss << ";\n";
    1041             :     }
    1042           0 :     ss << "    arg0 = arg0 * M_1_PI;\n";
    1043           0 :     ss << "    return sinpi(arg0);\n";
    1044           0 :     ss << "}";
    1045           0 : }
    1046             : 
    1047           0 : void OpAbs::GenSlidingWindowFunction(std::stringstream &ss,
    1048             :     const std::string &sSymName, SubArguments &vSubArguments)
    1049             : {
    1050           0 :     ss << "\ndouble " << sSymName;
    1051           0 :     ss << "_"<< BinFuncName() <<"(";
    1052           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1053             :     {
    1054           0 :         if (i)
    1055           0 :             ss << ",";
    1056           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1057             :     }
    1058           0 :     ss << ") {\n";
    1059           0 :     ss << "    int gid0   = get_global_id(0);\n";
    1060           0 :     ss << "    double tmp = " << GetBottom() << ";\n";
    1061             : #ifdef ISNAN
    1062           0 :     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
    1063             :     const formula::SingleVectorRefToken*tmpCurDVR0=
    1064           0 :         static_cast<const formula::SingleVectorRefToken *>(tmpCur0);
    1065           0 :     ss << "    int buffer_len = ";
    1066           0 :     ss << tmpCurDVR0->GetArrayLength();
    1067           0 :     ss << ";\n";
    1068           0 :     ss << "    if((gid0)>=buffer_len || isNan(";
    1069           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    1070           0 :     ss << "))\n";
    1071           0 :     ss << "        tmp = " << GetBottom() << ";\n    else \n";
    1072             : #endif
    1073           0 :     ss << "        tmp = ";
    1074           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    1075           0 :     ss << ";\n";
    1076           0 :     ss << "    return fabs(tmp);\n";
    1077           0 :     ss << "}";
    1078           0 : }
    1079           0 : void OpArcCos::BinInlineFun(std::set<std::string>& decls,
    1080             :     std::set<std::string>& funs)
    1081             : {
    1082           0 :     decls.insert(atan2Decl);
    1083           0 :     funs.insert(atan2Content);
    1084           0 : }
    1085           0 : void OpArcCos::GenSlidingWindowFunction(std::stringstream &ss,
    1086             :     const std::string &sSymName, SubArguments &vSubArguments)
    1087             : {
    1088           0 :     ss << "\ndouble " << sSymName;
    1089           0 :     ss << "_"<< BinFuncName() <<"(";
    1090           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1091             :     {
    1092           0 :         if (i) ss << ",";
    1093           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1094             :     }
    1095           0 :     ss << ") {\n";
    1096           0 :     ss << "    int gid0 = get_global_id(0);\n";
    1097           0 :     ss << "    double tmp = " << GetBottom() << ";\n";
    1098             : #ifdef ISNAN
    1099           0 :     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
    1100             :     const formula::SingleVectorRefToken*tmpCurDVR0=
    1101           0 :         static_cast<const formula::SingleVectorRefToken *>(tmpCur0);
    1102           0 :     ss << "    int buffer_len = "<< tmpCurDVR0->GetArrayLength()<< ";\n";
    1103           0 :     ss << "    if((gid0)>=buffer_len || isNan(";
    1104           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef()<< "))\n";
    1105           0 :     ss << "        tmp = " << GetBottom() << ";\n";
    1106           0 :     ss << "    else \n    ";
    1107             : #endif
    1108           0 :     ss << "    tmp = ";
    1109           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef()<< ";\n";
    1110           0 :     ss << "    return arctan2(sqrt(1.0 - pow(tmp, 2)), tmp);\n";
    1111           0 :     ss << "}";
    1112           0 : }
    1113           0 : void OpArcCosHyp::GenSlidingWindowFunction(std::stringstream &ss,
    1114             :     const std::string &sSymName, SubArguments &vSubArguments)
    1115             : {
    1116           0 :     ss << "\ndouble " << sSymName;
    1117           0 :     ss << "_"<< BinFuncName() <<"(";
    1118           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1119             :     {
    1120           0 :         if (i) ss << ",";
    1121           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1122             :     }
    1123           0 :     ss << ") {\n";
    1124           0 :     ss << "    int gid0   = get_global_id(0);\n";
    1125           0 :     ss << "    double tmp = " << GetBottom() << ";\n";
    1126           0 :     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
    1127             :     assert(tmpCur0);
    1128           0 :     if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
    1129             :     {
    1130           0 :         if(tmpCur0->GetType() == formula::svSingleVectorRef)
    1131             :         {
    1132             :             const formula::SingleVectorRefToken*tmpCurDVR0=
    1133           0 :                 static_cast<const formula::SingleVectorRefToken *>(tmpCur0);
    1134             : #ifdef ISNAN
    1135           0 :             ss << "    int buffer_len = "<<tmpCurDVR0->GetArrayLength()<<";\n";
    1136           0 :             ss << "    if((gid0)>=buffer_len || isNan(";
    1137           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef() << "))\n";
    1138           0 :             ss << "        tmp = " << GetBottom() << ";\n";
    1139           0 :             ss << "    else \n    ";
    1140             : #endif
    1141           0 :             ss << "    tmp = " << vSubArguments[0]->GenSlidingWindowDeclRef();
    1142           0 :             ss << ";\n";
    1143             :         }
    1144           0 :         else if(tmpCur0->GetType() == formula::svDouble)
    1145             :         {
    1146           0 :             ss << "    tmp = " << tmpCur0->GetDouble() << ";\n";
    1147             :         }
    1148             :     }
    1149             :     else
    1150             :     {
    1151           0 :         ss << "    tmp = " << vSubArguments[0]->GenSlidingWindowDeclRef();
    1152           0 :         ss << ";\n";
    1153             :     }
    1154             : 
    1155           0 :     ss << "    return  log( tmp + pow( (pown(tmp, 2) - 1.0), 0.5));\n";
    1156           0 :     ss << "}";
    1157           0 : }
    1158           0 : void OpTan::GenSlidingWindowFunction(std::stringstream &ss,
    1159             :             const std::string &sSymName, SubArguments &vSubArguments)
    1160             : {
    1161           0 :     ss << "\ndouble " << sSymName;
    1162           0 :     ss << "_"<< BinFuncName() <<"(";
    1163           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1164             :     {
    1165           0 :         if (i) ss << ",";
    1166           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1167             :     }
    1168           0 :     ss << ")\n";
    1169           0 :     ss << "{\n";
    1170           0 :     ss << "    int gid0=get_global_id(0);\n";
    1171           0 :     ss << "    double arg0 = 0.0f;\n";
    1172           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
    1173             :     assert(tmpCur);
    1174           0 :     if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
    1175             :     {
    1176           0 :         if(tmpCur->GetType() == formula::svSingleVectorRef)
    1177             :         {
    1178             :             const formula::SingleVectorRefToken*tmpCurDVR=
    1179             :                 static_cast
    1180           0 :                 <const formula::SingleVectorRefToken *>(tmpCur);
    1181           0 :             ss << "    arg0 = ";
    1182           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    1183           0 :             ss << ";\n";
    1184             : #ifdef ISNAN
    1185           0 :             ss << "    if(isNan(";
    1186           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    1187           0 :             ss << ")||(gid0>=";
    1188           0 :             ss << tmpCurDVR->GetArrayLength();
    1189           0 :             ss << "))\n";
    1190           0 :             ss << "    { arg0 = 0.0f; }\n";
    1191             : #endif
    1192             :         }
    1193           0 :         else if(tmpCur->GetType() == formula::svDouble)
    1194             :         {
    1195           0 :             ss << "    arg0=" << tmpCur->GetDouble() << ";\n";
    1196             :         }
    1197             :     }
    1198             :     else
    1199             :     {
    1200           0 :         ss << "        arg0 = ";
    1201           0 :         ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    1202           0 :         ss << ";\n";
    1203             :     }
    1204           0 :     ss << "    arg0 = arg0 * M_1_PI;\n";
    1205           0 :     ss << "    return sinpi(arg0) * pow(cospi(arg0), -1);\n";
    1206           0 :     ss << "}";
    1207           0 : }
    1208           0 : void OpTanH::GenSlidingWindowFunction(std::stringstream &ss,
    1209             :             const std::string &sSymName, SubArguments &vSubArguments)
    1210             : {
    1211           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
    1212             :     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
    1213           0 :           formula::SingleVectorRefToken *>(tmpCur);
    1214           0 :     ss << "\ndouble " << sSymName;
    1215           0 :     ss << "_"<< BinFuncName() <<"(";
    1216           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1217             :     {
    1218           0 :         if (i)
    1219           0 :             ss << ",";
    1220           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1221             :     }
    1222           0 :     ss << ")\n";
    1223           0 :     ss << "{\n";
    1224           0 :     ss << "    int gid0=get_global_id(0);\n";
    1225           0 :     ss << "    double arg0 = "<< vSubArguments[0]->GenSlidingWindowDeclRef();
    1226           0 :     ss << ";\n";
    1227             : #ifdef ISNAN
    1228           0 :     ss << "    if(isNan(arg0)||(gid0>=";
    1229           0 :     ss << tmpCurDVR->GetArrayLength();
    1230           0 :     ss << "))\n";
    1231           0 :     ss << "        arg0 = 0;\n";
    1232             : #endif
    1233           0 :     ss << "    double tmp=tanh(arg0);\n";
    1234           0 :     ss << "    return tmp;\n";
    1235           0 :     ss << "}";
    1236           0 : }
    1237           0 : void OpPower::GenSlidingWindowFunction(std::stringstream &ss,
    1238             :             const std::string &sSymName, SubArguments &vSubArguments)
    1239             : {
    1240           0 :     ss << "\ndouble " << sSymName;
    1241           0 :     ss << "_"<< BinFuncName() <<"(";
    1242           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1243             :     {
    1244           0 :         if (i)
    1245           0 :             ss << ",";
    1246           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1247             :     }
    1248           0 :     ss << ")\n";
    1249           0 :     ss << "{\n";
    1250           0 :     ss << "    int gid0=get_global_id(0);\n";
    1251           0 :     ss << "    double arg[2];\n";
    1252           0 :     for( unsigned i=0; i < vSubArguments.size(); ++i)
    1253             :     {
    1254           0 :         FormulaToken *tmpCur = vSubArguments[i]->GetFormulaToken();
    1255             :         assert(tmpCur);
    1256           0 :         if(ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
    1257             :         {
    1258           0 :             if(tmpCur->GetType() == formula::svDoubleVectorRef)
    1259             :             {
    1260             :                 const formula::DoubleVectorRefToken* tmpCurDVR =
    1261             :                     static_cast<
    1262           0 :                     const formula::DoubleVectorRefToken *>(tmpCur);
    1263           0 :                 ss << "    int i = 0;\n";
    1264           0 :                 ss << "    arg["<<i<<"] = ";
    1265           0 :                 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
    1266           0 :                 ss << ";\n";
    1267             : #ifdef ISNAN
    1268           0 :                 ss << "    if(isNan(arg["<<i;
    1269           0 :                 ss << "])||(gid0>=";
    1270           0 :                 ss << tmpCurDVR->GetArrayLength();
    1271           0 :                 ss << "))\n";
    1272           0 :                 ss << "        arg["<<i;
    1273           0 :                 ss << "] = 0;\n";
    1274             : #endif
    1275             :             }
    1276           0 :             else if(tmpCur->GetType() == formula::svSingleVectorRef)
    1277             :             {
    1278             :                 const formula::SingleVectorRefToken* tmpCurDVR=
    1279             :                       static_cast<
    1280           0 :                       const formula::SingleVectorRefToken *>(tmpCur);
    1281           0 :                 ss << "    arg["<<i<<"] = ";
    1282           0 :                 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
    1283           0 :                 ss << ";\n";
    1284             : #ifdef ISNAN
    1285           0 :                 ss << "    if(isNan(arg["<<i;
    1286           0 :                 ss << "])||(gid0>=";
    1287           0 :                 ss << tmpCurDVR->GetArrayLength();
    1288           0 :                 ss << "))\n";
    1289           0 :                 ss << "        arg["<<i;
    1290           0 :                 ss << "] = 0;\n";
    1291             : #endif
    1292             :             }
    1293           0 :             else if(tmpCur->GetType() == formula::svDouble)
    1294             :             {
    1295           0 :                 ss << "        arg["<<i<<"] = ";
    1296           0 :                 ss << tmpCur->GetDouble() << ";\n";
    1297             :             }
    1298             :         }
    1299             :         else
    1300             :         {
    1301           0 :             ss << "        arg["<<i<<"] = ";
    1302           0 :             ss << vSubArguments[i]->GenSlidingWindowDeclRef();
    1303           0 :             ss << ";\n";
    1304             :         }
    1305             :     }
    1306           0 :     ss << "    return pow(arg[0],arg[1]);\n";
    1307           0 :     ss << "}";
    1308           0 : }
    1309           0 : void OpSqrt::GenSlidingWindowFunction(std::stringstream &ss,
    1310             :             const std::string &sSymName, SubArguments &vSubArguments)
    1311             : {
    1312           0 :     ss << "\ndouble " << sSymName;
    1313           0 :     ss << "_"<< BinFuncName() <<"(";
    1314           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1315             :     {
    1316           0 :         if (i)
    1317           0 :             ss << ",";
    1318           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1319             :     }
    1320           0 :     ss << ")\n";
    1321           0 :     ss << "{\n";
    1322           0 :     ss << "    int gid0=get_global_id(0);\n";
    1323           0 :     ss << "    double arg0 = 0.0f;\n";
    1324           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
    1325             :     assert(tmpCur);
    1326           0 :     if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
    1327             :     {
    1328           0 :         if(tmpCur->GetType() == formula::svSingleVectorRef)
    1329             :         {
    1330             :             const formula::SingleVectorRefToken*tmpCurDVR=
    1331             :                 static_cast
    1332           0 :                 <const formula::SingleVectorRefToken *>(tmpCur);
    1333           0 :             ss << "    arg0 = ";
    1334           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    1335           0 :             ss << ";\n";
    1336             : #ifdef ISNAN
    1337           0 :             ss << "    if(isNan(";
    1338           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    1339           0 :             ss << ")||(gid0>=";
    1340           0 :             ss << tmpCurDVR->GetArrayLength();
    1341           0 :             ss << "))\n";
    1342           0 :             ss << "    { arg0 = 0; }\n";
    1343             : #endif
    1344             :         }
    1345           0 :         else if(tmpCur->GetType() == formula::svDouble)
    1346             :         {
    1347           0 :             ss << "    arg0=";
    1348           0 :             ss << tmpCur->GetDouble() << ";\n";
    1349             :         }
    1350             :     }
    1351             :     else
    1352             :     {
    1353           0 :         ss << "        arg0 = ";
    1354           0 :         ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    1355           0 :         ss << ";\n";
    1356             :     }
    1357           0 :     ss << "    return sqrt(arg0);\n";
    1358           0 :     ss << "}";
    1359           0 : }
    1360           0 : void OpArcCot::GenSlidingWindowFunction(std::stringstream &ss,
    1361             :     const std::string &sSymName, SubArguments &vSubArguments)
    1362             : {
    1363           0 :     ss << "\ndouble " << sSymName;
    1364           0 :     ss << "_"<< BinFuncName() <<"(";
    1365           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1366             :     {
    1367           0 :         if (i) ss << ",";
    1368           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1369             :     }
    1370           0 :     ss << ") {\n";
    1371           0 :     ss << "    int gid0   = get_global_id(0);\n";
    1372           0 :     ss << "    double tmp = " << GetBottom() << ";\n";
    1373             : #ifdef ISNAN
    1374           0 :     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
    1375             :     const formula::SingleVectorRefToken*tmpCurDVR0=
    1376           0 :         static_cast<const formula::SingleVectorRefToken *>(tmpCur0);
    1377           0 :     ss << "    int buffer_len = " << tmpCurDVR0->GetArrayLength()<< ";\n";
    1378           0 :     ss << "    if((gid0)>=buffer_len || isNan(";
    1379           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef() << "))\n";
    1380           0 :     ss << "        tmp = " << GetBottom() << ";\n";
    1381           0 :     ss << "    else \n    ";
    1382             : #endif
    1383           0 :     ss << "    tmp = " << vSubArguments[0]->GenSlidingWindowDeclRef() <<";\n";
    1384           0 :     ss << "    return M_PI_2 - atan(tmp);\n";
    1385           0 :     ss << "}";
    1386           0 : }
    1387           0 : void OpArcCotHyp::GenSlidingWindowFunction(std::stringstream &ss,
    1388             :     const std::string &sSymName, SubArguments &vSubArguments)
    1389             : {
    1390           0 :     ss << "\ndouble " << sSymName;
    1391           0 :     ss << "_"<< BinFuncName() <<"(";
    1392           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1393             :     {
    1394           0 :         if (i) ss << ",";
    1395           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1396             :     }
    1397           0 :     ss << ")\n";
    1398           0 :     ss << "{\n";
    1399           0 :     ss << "    int gid0=get_global_id(0);\n";
    1400           0 :     ss << "    double arg0 = 0.0f;\n";
    1401           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
    1402             :     assert(tmpCur);
    1403           0 :     if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
    1404             :     {
    1405           0 :         if(tmpCur->GetType() == formula::svSingleVectorRef)
    1406             :         {
    1407             :             const formula::SingleVectorRefToken*tmpCurDVR=
    1408             :                 static_cast
    1409           0 :                 <const formula::SingleVectorRefToken *>(tmpCur);
    1410           0 :             ss << "    arg0 = ";
    1411           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    1412           0 :             ss << ";\n";
    1413             : #ifdef ISNAN
    1414           0 :             ss << "    if(isNan(";
    1415           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    1416           0 :             ss << ")||(gid0>=";
    1417           0 :             ss << tmpCurDVR->GetArrayLength();
    1418           0 :             ss << "))\n";
    1419           0 :             ss << "    { arg0 = 0.0f; }\n";
    1420             : #endif
    1421             :         }
    1422           0 :         else if(tmpCur->GetType() == formula::svDouble)
    1423             :         {
    1424           0 :             ss << "    arg0=";
    1425           0 :             ss << tmpCur->GetDouble() << ";\n";
    1426             :         }
    1427             :     }
    1428             :     else
    1429             :     {
    1430           0 :         ss << "        arg0 = ";
    1431           0 :         ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    1432           0 :         ss << ";\n";
    1433             :     }
    1434           0 :      ss << "    return 0.5 * log(1 + 2 * pown(arg0 - 1.0, -1));\n";
    1435           0 :      ss << "}";
    1436           0 : }
    1437           0 : void OpArcSin::BinInlineFun(std::set<std::string>& decls,
    1438             :     std::set<std::string>& funs)
    1439             : {
    1440           0 :     decls.insert(atan2Decl);
    1441           0 :     funs.insert(atan2Content);
    1442           0 : }
    1443           0 : void OpArcSin::GenSlidingWindowFunction(std::stringstream &ss,
    1444             :     const std::string &sSymName, SubArguments &vSubArguments)
    1445             : {
    1446           0 :     ss << "\ndouble " << sSymName;
    1447           0 :     ss << "_"<< BinFuncName() <<"(";
    1448           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1449             :     {
    1450           0 :         if (i) ss << ",";
    1451           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1452             :     }
    1453           0 :     ss << ") {\n";
    1454           0 :     ss << "    int gid0   = get_global_id(0);\n";
    1455           0 :     ss << "    double tmp = " << GetBottom() << ";\n";
    1456             : #ifdef ISNAN
    1457           0 :     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
    1458             :     const formula::SingleVectorRefToken*tmpCurDVR0=
    1459           0 :         static_cast<const formula::SingleVectorRefToken *>(tmpCur0);
    1460           0 :     ss << "    int buffer_len = " << tmpCurDVR0->GetArrayLength() << ";\n";
    1461           0 :     ss << "    if((gid0)>=buffer_len || isNan(";
    1462           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef() << "))\n";
    1463           0 :     ss << "        tmp = " << GetBottom() << ";\n";
    1464           0 :     ss << "    else \n    ";
    1465             : #endif
    1466           0 :     ss << "    tmp = " << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
    1467           0 :     ss << "    return arctan2(tmp, sqrt(1.0 - pow(tmp, 2)));\n";
    1468           0 :     ss << "}";
    1469           0 : }
    1470           0 : void OpArcSinHyp::GenSlidingWindowFunction(std::stringstream &ss,
    1471             :     const std::string &sSymName, SubArguments &vSubArguments)
    1472             : {
    1473           0 :     ss << "\ndouble " << sSymName;
    1474           0 :     ss << "_"<< BinFuncName() <<"(";
    1475           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1476             :     {
    1477           0 :         if (i) ss << ",";
    1478           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1479             :     }
    1480           0 :     ss << ") {\n";
    1481           0 :     ss << "    int gid0   = get_global_id(0);\n";
    1482           0 :     ss << "    double tmp = " << GetBottom() << ";\n";
    1483           0 :     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
    1484             :     assert(tmpCur0);
    1485           0 :     if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
    1486             :     {
    1487           0 :         if(tmpCur0->GetType() == formula::svSingleVectorRef)
    1488             :         {
    1489             :             const formula::SingleVectorRefToken*tmpCurDVR0=
    1490           0 :                 static_cast<const formula::SingleVectorRefToken *>(tmpCur0);
    1491             : #ifdef ISNAN
    1492           0 :             ss << "    int buffer_len = "<<tmpCurDVR0->GetArrayLength()<<";\n";
    1493           0 :             ss << "    if((gid0)>=buffer_len || isNan(";
    1494           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef() << "))\n";
    1495           0 :             ss << "        tmp = " << GetBottom() << ";\n";
    1496           0 :             ss << "    else \n    ";
    1497             : #endif
    1498           0 :             ss << "    tmp = " << vSubArguments[0]->GenSlidingWindowDeclRef();
    1499           0 :             ss << ";\n";
    1500             :         }
    1501           0 :         else if(tmpCur0->GetType() == formula::svDouble)
    1502             :         {
    1503           0 :             ss << "    tmp = " << tmpCur0->GetDouble() << ";\n";
    1504             :         }
    1505             :     }
    1506             :     else
    1507             :     {
    1508           0 :         ss << "    tmp = " << vSubArguments[0]->GenSlidingWindowDeclRef();
    1509           0 :         ss << ";\n";
    1510             :     }
    1511           0 :     ss << "    return  log( tmp + pow((pown(tmp, 2) + 1.0), 0.5));\n";
    1512           0 :     ss << "}";
    1513           0 : }
    1514           0 : void OpArcTan2::BinInlineFun(std::set<std::string>& decls,
    1515             :     std::set<std::string>& funs)
    1516             : {
    1517           0 :     decls.insert(atan2Decl);
    1518           0 :     funs.insert(atan2Content);
    1519           0 : }
    1520           0 : void OpArcTan2::GenSlidingWindowFunction(std::stringstream &ss,
    1521             :     const std::string &sSymName, SubArguments &vSubArguments)
    1522             : {
    1523           0 :     ss << "\ndouble " << sSymName;
    1524           0 :     ss << "_"<< BinFuncName() <<"(";
    1525           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1526             :     {
    1527           0 :         if (i) ss << ",";
    1528           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1529             :     }
    1530           0 :     ss << ") {\n";
    1531           0 :     ss << "    int gid0 = get_global_id(0);\n";
    1532           0 :     ss << "    double x_num = " << GetBottom() << ";\n";
    1533           0 :     ss << "    double y_num = " << GetBottom() << ";\n";
    1534             : #ifdef ISNAN
    1535           0 :     FormulaToken *iXNum = vSubArguments[0]->GetFormulaToken();
    1536             :     const formula::SingleVectorRefToken*tmpCurDVRX=
    1537           0 :         static_cast<const formula::SingleVectorRefToken *>(iXNum);
    1538           0 :     FormulaToken *iYNum = vSubArguments[1]->GetFormulaToken();
    1539             :     const formula::SingleVectorRefToken*tmpCurDVRY=
    1540           0 :         static_cast<const formula::SingleVectorRefToken *>(iYNum);
    1541           0 :     ss << "    int buffer_x_len = " << tmpCurDVRX->GetArrayLength() << ";\n";
    1542           0 :     ss << "    int buffer_y_len = " << tmpCurDVRY->GetArrayLength() << ";\n";
    1543           0 :     ss << "    if((gid0)>=buffer_x_len || isNan(";
    1544           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef() << "))\n";
    1545           0 :     ss << "        x_num = " << GetBottom() << ";\n";
    1546           0 :     ss << "    else \n    ";
    1547             : #endif
    1548           0 :     ss << "    x_num = "<< vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
    1549             : #ifdef ISNAN
    1550           0 :     ss << "    if((gid0)>=buffer_y_len || isNan(";
    1551           0 :     ss << vSubArguments[1]->GenSlidingWindowDeclRef() << "))\n";
    1552           0 :     ss << "        y_num = " << GetBottom() << ";\n";
    1553           0 :     ss << "    else \n    ";
    1554             : #endif
    1555           0 :     ss << "    y_num = "<< vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
    1556           0 :     ss << "    return arctan2(y_num, x_num);\n";
    1557           0 :     ss << "}";
    1558           0 : }
    1559           0 : void OpArcTan::GenSlidingWindowFunction(std::stringstream &ss,
    1560             :     const std::string &sSymName, SubArguments &vSubArguments)
    1561             : {
    1562           0 :     ss << "\ndouble " << sSymName;
    1563           0 :     ss << "_"<< BinFuncName() <<"(";
    1564           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1565             :     {
    1566           0 :         if (i) ss << ",";
    1567           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1568             :     }
    1569           0 :     ss << ") {\n";
    1570           0 :     ss << "    int gid0 = get_global_id(0);\n";
    1571           0 :     ss << "    double tmp = " << GetBottom() << ";\n";
    1572             : #ifdef ISNAN
    1573           0 :     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
    1574             :     const formula::SingleVectorRefToken*tmpCurDVR0=
    1575           0 :         static_cast<const formula::SingleVectorRefToken *>(tmpCur0);
    1576           0 :     ss << "    int buffer_len = " << tmpCurDVR0->GetArrayLength() << ";\n";
    1577           0 :     ss << "    if((gid0)>=buffer_len || isNan(";
    1578           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef() << "))\n";
    1579           0 :     ss << "        tmp = " << GetBottom() << ";\n";
    1580           0 :     ss << "    else\n    ";
    1581             : #endif
    1582           0 :     ss << "    tmp = " << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
    1583           0 :     ss << "    return atan(tmp);\n";
    1584           0 :     ss << "}";
    1585           0 : }
    1586           0 : void OpArcTanH::GenSlidingWindowFunction(std::stringstream &ss,
    1587             :     const std::string &sSymName, SubArguments &vSubArguments)
    1588             : {
    1589           0 :     ss << "\ndouble " << sSymName;
    1590           0 :     ss << "_"<< BinFuncName() <<"(";
    1591           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1592             :     {
    1593           0 :         if (i) ss << ",";
    1594           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1595             :     }
    1596           0 :     ss << ") {\n";
    1597           0 :     ss << "    int gid0 = get_global_id(0);\n";
    1598           0 :     ss << "    double tmp = " << GetBottom() << ";\n";
    1599             : #ifdef ISNAN
    1600           0 :     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
    1601             :     const formula::SingleVectorRefToken*tmpCurDVR0=
    1602           0 :         static_cast<const formula::SingleVectorRefToken *>(tmpCur0);
    1603           0 :     ss << "    int buffer_len = " << tmpCurDVR0->GetArrayLength() << ";\n";
    1604           0 :     ss << "    if((gid0)>=buffer_len || isNan(";
    1605           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef() << "))\n";
    1606           0 :     ss << "        tmp = " << GetBottom() << ";\n";
    1607           0 :     ss << "    else \n    ";
    1608             : #endif
    1609           0 :     ss << "    tmp = " << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
    1610           0 :     ss << "    double a = 1.0 + tmp;\n";
    1611           0 :     ss << "    double b = 1.0 - tmp;\n";
    1612           0 :     ss << "    return log(pow(a/b, 0.5));\n";
    1613           0 :     ss << "}";
    1614           0 : }
    1615           0 : void OpBitAnd::GenSlidingWindowFunction(std::stringstream &ss,
    1616             :     const std::string &sSymName, SubArguments &vSubArguments)
    1617             : {
    1618           0 :     ss << "\ndouble " << sSymName;
    1619           0 :     ss << "_"<< BinFuncName() <<"(";
    1620           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1621             :     {
    1622           0 :         if (i) ss << ",";
    1623           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1624             :     }
    1625           0 :     ss << ") {\n";
    1626           0 :     ss << "    int gid0 = get_global_id(0);\n";
    1627           0 :     ss << "    double num1 = " << GetBottom() << ";\n";
    1628           0 :     ss << "    double num2 = " << GetBottom() << ";\n";
    1629             : #ifdef ISNAN
    1630           0 :     FormulaToken *iNum1 = vSubArguments[0]->GetFormulaToken();
    1631             :     const formula::SingleVectorRefToken* tmpCurDVRNum1=
    1632           0 :         static_cast<const formula::SingleVectorRefToken *>(iNum1);
    1633           0 :     FormulaToken *iNum2 = vSubArguments[1]->GetFormulaToken();
    1634             :     const formula::SingleVectorRefToken* tmpCurDVRNum2=
    1635           0 :         static_cast<const formula::SingleVectorRefToken *>(iNum2);
    1636           0 :     ss << "    int buffer_num1_len = "<<tmpCurDVRNum1->GetArrayLength()<<";\n";
    1637           0 :     ss << "    int buffer_num2_len = "<<tmpCurDVRNum2->GetArrayLength()<<";\n";
    1638           0 :     ss << "    if((gid0)>=buffer_num1_len || isNan(";
    1639           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef() << "))\n";
    1640           0 :     ss << "        num1 = " << GetBottom() << ";\n";
    1641           0 :     ss << "    else \n    ";
    1642             : #endif
    1643           0 :     ss << "    num1 = " << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
    1644             : #ifdef ISNAN
    1645           0 :     ss << "    if((gid0)>=buffer_num2_len || isNan(";
    1646           0 :     ss << vSubArguments[1]->GenSlidingWindowDeclRef() << "))\n";
    1647           0 :     ss << "        num2 = " << GetBottom() << ";\n";
    1648           0 :     ss << "    else \n    ";
    1649             : #endif
    1650           0 :     ss << "    num2 = " << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
    1651           0 :     ss << "    return (long)num1 & (long)num2;\n";
    1652           0 :     ss << "}";
    1653           0 : }
    1654           0 : void OpLn::GenSlidingWindowFunction(
    1655             :     std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
    1656             : {
    1657           0 :     ss << "\ndouble " << sSymName;
    1658           0 :     ss << "_"<< BinFuncName() <<"(";
    1659           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1660             :     {
    1661           0 :         if (i)
    1662           0 :             ss << ",";
    1663           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1664             :     }
    1665           0 :     ss << ")\n{\n";
    1666           0 :     ss << "    int gid0=get_global_id(0);\n";
    1667           0 :     ss << "    int singleIndex =  gid0;\n";
    1668             : 
    1669           0 :     GenTmpVariables(ss,vSubArguments);
    1670           0 :     CheckAllSubArgumentIsNan(ss,vSubArguments);
    1671             : 
    1672           0 :     ss << "    double tmp=log1p(tmp0-1);\n";
    1673           0 :     ss << "    return tmp;\n";
    1674           0 :     ss << "}";
    1675           0 : }
    1676             : 
    1677           0 : void OpRound::GenSlidingWindowFunction(std::stringstream &ss,
    1678             :              const std::string &sSymName, SubArguments &vSubArguments)
    1679             : {
    1680           0 :     ss << "\ndouble " << sSymName;
    1681           0 :     ss << "_"<< BinFuncName() <<"(";
    1682           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1683             :     {
    1684           0 :         if (i)
    1685           0 :             ss << ",";
    1686           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1687             :     }
    1688           0 :     ss << ")\n{\n";
    1689           0 :     ss << "    int gid0=get_global_id(0);\n";
    1690           0 :     ss << "    int singleIndex =  gid0;\n";
    1691           0 :     GenTmpVariables(ss,vSubArguments);
    1692           0 :     CheckAllSubArgumentIsNan(ss,vSubArguments);
    1693           0 :     ss << "    for(int i=0;i<tmp1;i++)\n";
    1694           0 :     ss << "        tmp0 = tmp0 * 10;\n";
    1695           0 :     ss << "    double tmp=round(tmp0);\n";
    1696           0 :     ss << "    for(int i=0;i<tmp1;i++)\n";
    1697           0 :     ss << "        tmp = tmp / 10;\n";
    1698           0 :     ss << "    return tmp;\n";
    1699           0 :     ss << "}";
    1700           0 : }
    1701           0 : void OpRoundUp::GenSlidingWindowFunction(std::stringstream &ss,
    1702             :              const std::string &sSymName, SubArguments &vSubArguments)
    1703             : {
    1704           0 :     ss << "\ndouble " << sSymName;
    1705           0 :     ss << "_"<< BinFuncName() <<"(";
    1706           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1707             :     {
    1708           0 :         if (i)
    1709           0 :             ss << ",";
    1710           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1711             :     }
    1712           0 :     ss << ")\n{\n";
    1713           0 :     ss << "    int gid0=get_global_id(0);\n";
    1714           0 :     ss << "    int singleIndex =  gid0;\n";
    1715           0 :     ss << "    int intTmp;\n";
    1716           0 :     ss << "    double doubleTmp;\n";
    1717           0 :     ss << "    double tmp;\n";
    1718           0 :     GenTmpVariables(ss,vSubArguments);
    1719           0 :     CheckAllSubArgumentIsNan(ss,vSubArguments);
    1720           0 :     ss << "    if(tmp1 >20 || tmp1 < -20)";
    1721           0 :     ss << "    {\n";
    1722           0 :     ss << "        tmp = NAN;\n";
    1723           0 :     ss << "    }else\n";
    1724           0 :     ss << "    {\n";
    1725           0 :     ss << "        for(int i=0;i<tmp1;i++)\n";
    1726           0 :     ss << "            tmp0 = tmp0 * 10;\n";
    1727           0 :     ss << "        intTmp = (int)tmp0;\n";
    1728           0 :     ss << "        doubleTmp = intTmp;\n";
    1729           0 :     ss << "        if(isequal(doubleTmp,tmp0))\n";
    1730           0 :     ss << "            tmp = doubleTmp;\n";
    1731           0 :     ss << "        else\n";
    1732           0 :     ss << "            tmp = doubleTmp + 1;\n";
    1733           0 :     ss << "        for(int i=0;i<tmp1;i++)\n";
    1734           0 :     ss << "            tmp = tmp / 10;\n";
    1735           0 :     ss << "    }\n";
    1736           0 :     ss << "    return tmp;\n";
    1737           0 :     ss << "}";
    1738           0 : }
    1739           0 : void OpRoundDown::GenSlidingWindowFunction(std::stringstream &ss,
    1740             :              const std::string &sSymName, SubArguments &vSubArguments)
    1741             : {
    1742           0 :     ss << "\ndouble " << sSymName;
    1743           0 :     ss << "_"<< BinFuncName() <<"(";
    1744           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1745             :     {
    1746           0 :         if (i)
    1747           0 :             ss << ",";
    1748           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1749             :     }
    1750           0 :     ss << ")\n{\n";
    1751           0 :     ss << "    int gid0=get_global_id(0);\n";
    1752           0 :     ss << "    int singleIndex =  gid0;\n";
    1753           0 :     ss << "    int intTmp;\n";
    1754           0 :     ss << "    double tmp;\n";
    1755           0 :     GenTmpVariables(ss,vSubArguments);
    1756           0 :     CheckAllSubArgumentIsNan(ss,vSubArguments);
    1757           0 :     ss << "    if(tmp1 >20 || tmp1 < -20)";
    1758           0 :     ss << "    {\n";
    1759           0 :     ss << "        tmp = NAN;\n";
    1760           0 :     ss << "    }else\n";
    1761           0 :     ss << "    {\n";
    1762           0 :     ss << "        for(int i=0;i<tmp1;i++)\n";
    1763           0 :     ss << "            tmp0 = tmp0 * 10;\n";
    1764           0 :     ss << "        intTmp = (int)tmp0;\n";
    1765           0 :     ss << "        tmp = intTmp;\n";
    1766           0 :     ss << "        for(int i=0;i<tmp1;i++)\n";
    1767           0 :     ss << "            tmp = tmp / 10;\n";
    1768           0 :     ss << "    }\n";
    1769           0 :     ss << "    return tmp;\n";
    1770           0 :     ss << "}";
    1771           0 : }
    1772           0 : void OpInt::GenSlidingWindowFunction(std::stringstream &ss,
    1773             :              const std::string &sSymName, SubArguments &vSubArguments)
    1774             : {
    1775           0 :     ss << "\ndouble " << sSymName;
    1776           0 :     ss << "_"<< BinFuncName() <<"(";
    1777           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1778             :     {
    1779           0 :         if (i)
    1780           0 :             ss << ",";
    1781           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1782             :     }
    1783           0 :     ss << ")\n{\n";
    1784           0 :     ss << "    int gid0=get_global_id(0);\n";
    1785           0 :     ss << "    int singleIndex =  gid0;\n";
    1786           0 :     ss << "    int intTmp;\n";
    1787           0 :     ss << "    double tmp;\n";
    1788           0 :     GenTmpVariables(ss,vSubArguments);
    1789           0 :     CheckAllSubArgumentIsNan(ss,vSubArguments);
    1790           0 :     ss << "    intTmp = (int)tmp0;\n";
    1791           0 :     ss << "    tmp = intTmp;\n";
    1792           0 :     ss << "    return tmp;\n";
    1793           0 :     ss << "}";
    1794           0 : }
    1795           0 : void OpNegSub::GenSlidingWindowFunction(std::stringstream &ss,
    1796             :              const std::string &sSymName, SubArguments &vSubArguments)
    1797             : {
    1798           0 :     ss << "\ndouble " << sSymName;
    1799           0 :     ss << "_"<< BinFuncName() <<"(";
    1800           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1801             :     {
    1802           0 :         if (i)
    1803           0 :             ss << ",";
    1804           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1805             :     }
    1806           0 :     ss << ")\n{\n";
    1807           0 :     ss << "    int gid0=get_global_id(0);\n";
    1808           0 :     ss << "    int singleIndex =  gid0;\n";
    1809           0 :     GenTmpVariables(ss,vSubArguments);
    1810           0 :     CheckAllSubArgumentIsNan(ss,vSubArguments);
    1811           0 :     ss << "    return -tmp0;\n";
    1812           0 :     ss << "}";
    1813           0 : }
    1814             : 
    1815           0 : void OpRadians::GenSlidingWindowFunction(std::stringstream &ss,
    1816             :              const std::string &sSymName, SubArguments &vSubArguments)
    1817             : {
    1818           0 :     ss << "\ndouble " << sSymName;
    1819           0 :     ss << "_"<< BinFuncName() <<"(";
    1820           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1821             :     {
    1822           0 :         if (i)
    1823           0 :             ss << ",";
    1824           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1825             :     }
    1826           0 :     ss << ")\n{\n";
    1827           0 :     ss << "    int gid0=get_global_id(0);\n";
    1828           0 :     ss << "    int singleIndex =  gid0;\n";
    1829           0 :     ss << "    double tmp;\n";
    1830           0 :     GenTmpVariables(ss,vSubArguments);
    1831           0 :     CheckAllSubArgumentIsNan(ss,vSubArguments);
    1832           0 :     ss << "    tmp = tmp0 * 3.141592657 * pow(180.0,-1);\n";
    1833           0 :     ss << "    return tmp;\n";
    1834           0 :     ss << "}";
    1835           0 : }
    1836           0 : void OpIsEven::GenSlidingWindowFunction(std::stringstream &ss,
    1837             :              const std::string &sSymName, SubArguments &vSubArguments)
    1838             : {
    1839           0 :     ss << "\ndouble " << sSymName;
    1840           0 :     ss << "_"<< BinFuncName() <<"(";
    1841           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1842             :     {
    1843           0 :         if (i)
    1844           0 :             ss << ",";
    1845           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1846             :     }
    1847           0 :     ss << ")\n{\n";
    1848           0 :     ss << "    int gid0=get_global_id(0);\n";
    1849           0 :     ss << "    int singleIndex =  gid0;\n";
    1850           0 :     ss << "    double tmp;\n";
    1851           0 :     GenTmpVariables(ss,vSubArguments);
    1852           0 :     CheckAllSubArgumentIsNan(ss,vSubArguments);
    1853           0 :     ss << "    tmp = (fmod(floor(fabs(tmp0)), 2.0)<0.5);\n";
    1854           0 :     ss << "    return tmp;\n";
    1855           0 :     ss << "}";
    1856           0 : }
    1857           0 : void OpIsOdd::GenSlidingWindowFunction(std::stringstream &ss,
    1858             :              const std::string &sSymName, SubArguments &vSubArguments)
    1859             : {
    1860           0 :     ss << "\ndouble " << sSymName;
    1861           0 :     ss << "_"<< BinFuncName() <<"(";
    1862           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1863             :     {
    1864           0 :         if (i)
    1865           0 :             ss << ",";
    1866           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1867             :     }
    1868           0 :     ss << ")\n{\n";
    1869           0 :     ss << "    int gid0=get_global_id(0);\n";
    1870           0 :     ss << "    int singleIndex =  gid0;\n";
    1871           0 :     ss << "    double tmp;\n";
    1872           0 :     GenTmpVariables(ss,vSubArguments);
    1873           0 :     CheckAllSubArgumentIsNan(ss,vSubArguments);
    1874           0 :     ss << "    tmp = !(fmod(floor(fabs(tmp0)), 2.0)<0.5);\n";
    1875           0 :     ss << "    return tmp;\n";
    1876           0 :     ss << "}";
    1877           0 : }
    1878           0 : void OpOdd::GenSlidingWindowFunction(
    1879             :     std::stringstream &ss, const std::string &sSymName,
    1880             :     SubArguments &vSubArguments)
    1881             : {
    1882           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
    1883             :     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
    1884           0 :         formula::SingleVectorRefToken *>(tmpCur);
    1885           0 :     ss << Math_Intg_Str;
    1886           0 :     ss << "\ndouble " << sSymName;
    1887           0 :     ss << "_"<< BinFuncName() <<"(";
    1888           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    1889             :     {
    1890           0 :         if (i)
    1891           0 :             ss << ",";
    1892           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1893             :     }
    1894           0 :     ss << ")\n{\n";
    1895           0 :     ss <<"    int gid0=get_global_id(0);\n";
    1896           0 :     ss << "    double tmp=0;\n";
    1897           0 :     ss << "    double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
    1898           0 :     ss << ";\n";
    1899             : #ifdef ISNAN
    1900           0 :     ss<< "    if(isNan(arg0)||(gid0>=";
    1901           0 :     ss<<tmpCurDVR->GetArrayLength();
    1902           0 :     ss<<"))\n";
    1903           0 :     ss<<"        arg0 = 0;\n";
    1904             : #endif
    1905           0 :     ss << "    if (arg0 > 0.0 ){\n";
    1906           0 :     ss << "        tmp=Intg(arg0);\n";
    1907           0 :     ss << "        if(tmp-trunc(tmp/2)*2 == 0)\n";
    1908           0 :     ss << "            tmp=tmp+1;\n";
    1909           0 :     ss << "    }else if (arg0 < 0.0 ){\n";
    1910           0 :     ss << "        tmp=Intg(arg0);\n";
    1911           0 :     ss << "        if(tmp-trunc(tmp/2)*2 == 0)\n";
    1912           0 :     ss << "            tmp=tmp-1.0;\n";
    1913           0 :     ss << "    }else if (arg0 == 0.0 )\n";
    1914           0 :     ss << "            tmp=1.0;\n";
    1915           0 :     ss << "    return tmp;\n";
    1916           0 :     ss << "}";
    1917           0 : }
    1918           0 : void OpCountIf::GenSlidingWindowFunction(std::stringstream &ss,
    1919             :     const std::string &sSymName, SubArguments &vSubArguments)
    1920             : {
    1921           0 :     ss << "\ndouble " << sSymName;
    1922           0 :     ss << "_"<< BinFuncName() <<"(";
    1923           0 :     for (unsigned i = 0; i < 2; i++)
    1924             :     {
    1925           0 :         if (i)
    1926           0 :             ss << ",";
    1927           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    1928             :     }
    1929           0 :     ss << ")\n";
    1930           0 :     ss << "{\n";
    1931           0 :     ss << "    int gid0=get_global_id(0);\n";
    1932           0 :     ss << "    double vara, varb;\n";
    1933           0 :     ss << "    int varc = 0;\n";
    1934           0 :     FormulaToken *tmpCur = vSubArguments[1]->GetFormulaToken();
    1935             :     assert(tmpCur);
    1936           0 :     if(ocPush == vSubArguments[1]->GetFormulaToken()->GetOpCode())
    1937             :     {
    1938           0 :         if(tmpCur->GetType() == formula::svSingleVectorRef)
    1939             :         {
    1940             :             const formula::SingleVectorRefToken* tmpCurDVR=
    1941             :                 static_cast<
    1942           0 :                 const formula::SingleVectorRefToken *>(tmpCur);
    1943           0 :             ss << "    varb = ";
    1944           0 :             ss << vSubArguments[1]->GenSlidingWindowDeclRef();
    1945           0 :             ss << ";\n";
    1946             : #ifdef ISNAN
    1947           0 :             ss << "    if(isNan(varb)||(gid0>=";
    1948           0 :             ss << tmpCurDVR->GetArrayLength();
    1949           0 :             ss << "))\n";
    1950           0 :             ss << "        varb = 0;\n";
    1951             : #endif
    1952             :         }
    1953           0 :         else if(tmpCur->GetType() == formula::svDouble)
    1954             :         {
    1955           0 :             ss << "    varb = ";
    1956           0 :             ss << tmpCur->GetDouble() << ";\n";
    1957             :         }
    1958             :     }
    1959             :     else
    1960             :     {
    1961           0 :         ss << "    varb = ";
    1962           0 :         ss << vSubArguments[1]->GenSlidingWindowDeclRef();
    1963           0 :         ss << ";\n";
    1964             :     }
    1965           0 :     tmpCur = vSubArguments[0]->GetFormulaToken();
    1966             :     assert(tmpCur);
    1967           0 :     if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
    1968             :     {
    1969             :         //TODO       DoubleVector
    1970           0 :         if (tmpCur->GetType() == formula::svDoubleVectorRef)
    1971             :         {
    1972             :             const formula::DoubleVectorRefToken* pDVR =
    1973           0 :                 static_cast<const formula::DoubleVectorRefToken *>(tmpCur);
    1974           0 :             size_t nCurWindowSize = pDVR->GetRefRowSize();
    1975           0 :             ss << "    for (int i = ";
    1976           0 :             if (!pDVR->IsStartFixed() && pDVR->IsEndFixed())
    1977             :             {
    1978             : #ifdef  ISNAN
    1979           0 :                 ss << "gid0; i < " << pDVR->GetArrayLength();
    1980           0 :                 ss << " && i < " << nCurWindowSize  << "; ++i)\n";
    1981           0 :                 ss << "    {\n";
    1982             : #else
    1983             :                 ss << "gid0; i < "<< nCurWindowSize << "; ++i)\n";
    1984             :                 ss << "    {\n";
    1985             : #endif
    1986             :             }
    1987           0 :             else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed())
    1988             :             {
    1989             : #ifdef  ISNAN
    1990           0 :                 ss << "0; i < " << pDVR->GetArrayLength();
    1991           0 :                 ss << " && i < gid0+"<< nCurWindowSize << "; ++i)\n";
    1992           0 :                 ss << "    {\n";
    1993             : #else
    1994             :                 ss << "0; i < gid0+"<< nCurWindowSize << "; ++i)\n";
    1995             :                 ss << "    {\n";
    1996             : #endif
    1997             :             }
    1998           0 :             else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed())
    1999             :             {
    2000             : #ifdef  ISNAN
    2001           0 :                 ss << "0; i + gid0 < " << pDVR->GetArrayLength();
    2002           0 :                 ss << " &&  i < "<< nCurWindowSize << "; ++i)\n";
    2003           0 :                 ss << "    {\n";
    2004             : #else
    2005             :                 ss << "0; i < "<< nCurWindowSize << "; ++i)\n";
    2006             :                 ss << "    {\n";
    2007             : #endif
    2008             :             }
    2009             :             else
    2010             :             {
    2011             : #ifdef  ISNAN
    2012           0 :                 ss << "0; i < "<< nCurWindowSize << "; ++i)\n";
    2013           0 :                 ss << "    {\n";
    2014             : #else
    2015             :                 ss << "0; i < "<< nCurWindowSize << "; ++i)\n";
    2016             :                 ss << "    {\n";
    2017             : #endif
    2018             :             }
    2019           0 :             ss << "        vara = ";
    2020           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    2021           0 :             ss << ";\n";
    2022             : #ifdef  ISNAN
    2023           0 :             ss << "        if (isNan(vara))\n";
    2024           0 :             ss << "            continue;\n";
    2025             : #endif
    2026           0 :             ss << "        (vara == varb) && varc++;\n";
    2027           0 :             ss << "    }\n";
    2028             :         }
    2029           0 :         else if(tmpCur->GetType() == formula::svSingleVectorRef)
    2030             :         {
    2031             :             const formula::SingleVectorRefToken* tmpCurDVR=
    2032             :                 static_cast<
    2033           0 :                 const formula::SingleVectorRefToken *>(tmpCur);
    2034           0 :             ss << "    vara = ";
    2035           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    2036           0 :             ss << ";\n";
    2037             : #ifdef ISNAN
    2038           0 :             ss << "    if(isNan(vara)||(gid0>=";
    2039           0 :             ss << tmpCurDVR->GetArrayLength();
    2040           0 :             ss << "))\n";
    2041           0 :             ss << "        return 0;\n";
    2042           0 :             ss << "    (vara == varb) && varc++;\n";
    2043             : #endif
    2044             :         }
    2045             :     }
    2046           0 :     ss << "    return varc;\n";
    2047           0 :     ss << "}";
    2048           0 : }
    2049           0 : void OpSumIf::GenSlidingWindowFunction(std::stringstream &ss,
    2050             :     const std::string &sSymName, SubArguments &vSubArguments)
    2051             : {
    2052           0 :     ss << "\ndouble " << sSymName;
    2053           0 :     ss << "_"<< BinFuncName() <<"(";
    2054           0 :     int flag = 3 == vSubArguments.size() ? 2 : 0;
    2055           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    2056             :     {
    2057           0 :         if (i)
    2058           0 :             ss << ",";
    2059           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    2060             :     }
    2061           0 :     ss << ")\n";
    2062           0 :     ss << "{\n";
    2063           0 :     ss << "    int gid0=get_global_id(0);\n";
    2064           0 :     ss << "    double vara, varb, varc, sum = 0.0f;\n";
    2065           0 :     FormulaToken *tmpCur = vSubArguments[1]->GetFormulaToken();
    2066             :     assert(tmpCur);
    2067           0 :     if(ocPush == vSubArguments[1]->GetFormulaToken()->GetOpCode())
    2068             :     {
    2069           0 :         if(tmpCur->GetType() == formula::svSingleVectorRef)
    2070             :         {
    2071             :             const formula::SingleVectorRefToken* tmpCurDVR=
    2072             :                 static_cast<
    2073           0 :                 const formula::SingleVectorRefToken *>(tmpCur);
    2074           0 :             ss << "    varb = ";
    2075           0 :             ss << vSubArguments[1]->GenSlidingWindowDeclRef();
    2076           0 :             ss << ";\n";
    2077             : #ifdef ISNAN
    2078           0 :             ss << "    if(isNan(varb)||(gid0>=";
    2079           0 :             ss << tmpCurDVR->GetArrayLength();
    2080           0 :             ss << "))\n";
    2081           0 :             ss << "        varb = 0;\n";
    2082             : #endif
    2083             :         }
    2084           0 :         else if(tmpCur->GetType() == formula::svDouble)
    2085             :         {
    2086           0 :             ss << "    varb = ";
    2087           0 :             ss << tmpCur->GetDouble() << ";\n";
    2088             :         }
    2089             :     }
    2090             :     else
    2091             :     {
    2092           0 :         ss << "    varb = ";
    2093           0 :         ss << vSubArguments[1]->GenSlidingWindowDeclRef();
    2094           0 :         ss << ";\n";
    2095             :     }
    2096           0 :     tmpCur = vSubArguments[0]->GetFormulaToken();
    2097             :     assert(tmpCur);
    2098           0 :     if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
    2099             :     {
    2100             :         //TODO       DoubleVector
    2101           0 :         if (tmpCur->GetType() == formula::svDoubleVectorRef)
    2102             :         {
    2103             :             const formula::DoubleVectorRefToken* pDVR =
    2104           0 :                 static_cast<const formula::DoubleVectorRefToken *>(tmpCur);
    2105           0 :             size_t nCurWindowSize = pDVR->GetRefRowSize();
    2106           0 :             ss << "    for (int i = ";
    2107           0 :             if (!pDVR->IsStartFixed() && pDVR->IsEndFixed())
    2108             :             {
    2109             : #ifdef  ISNAN
    2110           0 :                 ss << "gid0; i < " << pDVR->GetArrayLength();
    2111           0 :                 ss << " && i < " << nCurWindowSize  << "; ++i)\n";
    2112           0 :                 ss << "    {\n";
    2113             : #else
    2114             :                 ss << "gid0; i < "<< nCurWindowSize << "; ++i)\n";
    2115             :                 ss << "    {\n";
    2116             : #endif
    2117             :             }
    2118           0 :             else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed())
    2119             :             {
    2120             : #ifdef  ISNAN
    2121           0 :                 ss << "0; i < " << pDVR->GetArrayLength();
    2122           0 :                 ss << " && i < gid0+"<< nCurWindowSize << "; ++i)\n";
    2123           0 :                 ss << "    {\n";
    2124             : #else
    2125             :                 ss << "0; i < gid0+"<< nCurWindowSize << "; ++i)\n";
    2126             :                 ss << "    {\n";
    2127             : #endif
    2128             :             }
    2129           0 :             else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed())
    2130             :             {
    2131             : #ifdef  ISNAN
    2132           0 :                 ss << "0; i + gid0 < " << pDVR->GetArrayLength();
    2133           0 :                 ss << " &&  i < "<< nCurWindowSize << "; ++i)\n";
    2134           0 :                 ss << "    {\n";
    2135             : #else
    2136             :                 ss << "0; i < "<< nCurWindowSize << "; ++i)\n";
    2137             :                 ss << "    {\n";
    2138             : #endif
    2139             :             }
    2140             :             else
    2141             :             {
    2142             : #ifdef  ISNAN
    2143           0 :                 ss << "0; i < "<< nCurWindowSize << "; ++i)\n";
    2144           0 :                 ss << "    {\n";
    2145             : #else
    2146             :                 ss << "0; i < "<< nCurWindowSize << "; ++i)\n";
    2147             :                 ss << "    {\n";
    2148             : #endif
    2149             :             }
    2150           0 :             ss << "        vara = ";
    2151           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    2152           0 :             ss << ";\n";
    2153             : #ifdef  ISNAN
    2154           0 :             ss << "        if (isNan(vara))\n";
    2155           0 :             ss << "            continue;\n";
    2156             : #endif
    2157           0 :             ss << "        varc = ";
    2158           0 :             ss << vSubArguments[flag]->GenSlidingWindowDeclRef();
    2159           0 :             ss << ";\n";
    2160             : #ifdef  ISNAN
    2161           0 :             ss << "        if (isNan(varc))\n";
    2162           0 :             ss << "            varc = 0.0f;\n";
    2163             : #endif
    2164           0 :             ss << "        (vara == varb)&&(sum = sum + varc);\n";
    2165           0 :             ss << "    }\n";
    2166             :         }
    2167           0 :         else if(tmpCur->GetType() == formula::svSingleVectorRef)
    2168             :         {
    2169             :             const formula::SingleVectorRefToken* tmpCurDVR=
    2170             :                 static_cast<
    2171           0 :                 const formula::SingleVectorRefToken *>(tmpCur);
    2172           0 :             ss << "    vara = ";
    2173           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    2174           0 :             ss << ";\n";
    2175             : #ifdef ISNAN
    2176           0 :             ss << "    if(isNan(vara)||(gid0>=";
    2177           0 :             ss << tmpCurDVR->GetArrayLength();
    2178           0 :             ss << "))\n";
    2179           0 :             ss << "        return 0;\n";
    2180             : #endif
    2181           0 :             ss << "    int i = 0;\n";
    2182           0 :             ss << "    varc = ";
    2183           0 :             ss << vSubArguments[flag]->GenSlidingWindowDeclRef();
    2184           0 :             ss << ";\n";
    2185             : #ifdef ISNAN
    2186           0 :             ss << "    if(isNan(varc)||(gid0>=";
    2187           0 :             ss << tmpCurDVR->GetArrayLength();
    2188           0 :             ss << "))\n";
    2189           0 :             ss << "        varc = 0.0f;\n";
    2190             : #endif
    2191             : 
    2192           0 :             ss << "        (vara == varb)&&(sum = sum + varc);\n";
    2193             : 
    2194             :         }
    2195             :     }
    2196           0 :     ss << "    return sum;\n";
    2197           0 :     ss << "}";
    2198           0 : }
    2199           0 : void OpTrunc::GenSlidingWindowFunction(std::stringstream &ss,
    2200             :             const std::string &sSymName, SubArguments &vSubArguments)
    2201             : {
    2202           0 :     ss << "\ndouble " << sSymName;
    2203           0 :     ss << "_"<< BinFuncName() <<"(";
    2204           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    2205             :     {
    2206           0 :         if (i)
    2207           0 :             ss << ",";
    2208           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    2209             :     }
    2210           0 :     ss << ")\n";
    2211           0 :     ss << "{\n";
    2212           0 :     ss << "    int gid0=get_global_id(0);\n";
    2213           0 :     ss << "    double arg[2];\n";
    2214           0 :     for( unsigned i=0; i < vSubArguments.size(); ++i)
    2215             :     {
    2216           0 :         FormulaToken *tmpCur = vSubArguments[i]->GetFormulaToken();
    2217             :         assert(tmpCur);
    2218           0 :         if(ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
    2219             :         {
    2220           0 :             if(tmpCur->GetType() == formula::svDoubleVectorRef)
    2221             :             {
    2222             :                 const formula::DoubleVectorRefToken* tmpCurDVR =
    2223             :                     static_cast<
    2224           0 :                     const formula::DoubleVectorRefToken *>(tmpCur);
    2225           0 :                 ss << "    int i = 0;\n";
    2226           0 :                 ss << "    arg["<<i<<"] = ";
    2227           0 :                 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
    2228           0 :                 ss << ";\n";
    2229             : #ifdef ISNAN
    2230           0 :                 ss << "    if(isNan(arg["<<i;
    2231           0 :                 ss << "])||(gid0>=";
    2232           0 :                 ss << tmpCurDVR->GetArrayLength();
    2233           0 :                 ss << "))\n";
    2234           0 :                 ss << "        arg["<<i;
    2235           0 :                 ss << "] = 0;\n";
    2236             : #endif
    2237             :             }
    2238           0 :             else if(tmpCur->GetType() == formula::svSingleVectorRef)
    2239             :             {
    2240             :                 const formula::SingleVectorRefToken* tmpCurDVR=
    2241             :                       static_cast<
    2242           0 :                       const formula::SingleVectorRefToken *>(tmpCur);
    2243           0 :                 ss << "    arg["<<i<<"] = ";
    2244           0 :                 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
    2245           0 :                 ss << ";\n";
    2246             : #ifdef ISNAN
    2247           0 :                 ss << "    if(isNan(arg["<<i;
    2248           0 :                 ss << "])||(gid0>=";
    2249           0 :                 ss << tmpCurDVR->GetArrayLength();
    2250           0 :                 ss << "))\n";
    2251           0 :                 ss << "        arg["<<i;
    2252           0 :                 ss << "] = 0;\n";
    2253             : #endif
    2254             :             }
    2255           0 :             else if(tmpCur->GetType() == formula::svDouble)
    2256             :             {
    2257           0 :                 ss << "        arg["<<i<<"] = ";
    2258           0 :                 ss << tmpCur->GetDouble() << ";\n";
    2259             :             }
    2260             :         }
    2261             :         else
    2262             :         {
    2263           0 :             ss << "        arg["<<i<<"] = ";
    2264           0 :             ss << vSubArguments[i]->GenSlidingWindowDeclRef();
    2265           0 :             ss << ";\n";
    2266             :         }
    2267             :     }
    2268           0 :     ss << "    double argm = arg[0];\n";
    2269           0 :     ss << "    int n = (int)arg[1];\n";
    2270           0 :     ss << "    double nn = 1.0f;\n";
    2271           0 :     ss << "    for(int i = 0; i < n; ++i)\n";
    2272           0 :     ss << "    {\n";
    2273           0 :     ss << "        argm = argm * 10;\n";
    2274           0 :     ss << "        nn = nn * 10;\n";
    2275           0 :     ss << "    }\n";
    2276           0 :     ss << "    modf(argm, &argm);\n";
    2277           0 :     ss << "    return argm / nn;\n";
    2278           0 :     ss << "}";
    2279           0 : }
    2280           0 : void OpFloor::GenSlidingWindowFunction(
    2281             :     std::stringstream &ss, const std::string &sSymName,
    2282             :     SubArguments &vSubArguments)
    2283             : {
    2284           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
    2285             :     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
    2286           0 :         formula::SingleVectorRefToken *>(tmpCur);
    2287           0 :     ss << "\ndouble " << sSymName;
    2288           0 :     ss << "_"<< BinFuncName() <<"(";
    2289           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    2290             :     {
    2291           0 :         if (i)
    2292           0 :             ss << ",";
    2293           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    2294             :     }
    2295           0 :     ss << ")\n{\n";
    2296           0 :     ss <<"    int gid0=get_global_id(0);\n";
    2297           0 :     ss << "    double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
    2298           0 :     ss << ";\n";
    2299           0 :     ss << "    double arg1 = " << vSubArguments[1]->GenSlidingWindowDeclRef();
    2300           0 :     ss << ";\n";
    2301           0 :     ss << "    double arg2 = " << vSubArguments[2]->GenSlidingWindowDeclRef();
    2302           0 :     ss << ";\n";
    2303             : #ifdef ISNAN
    2304           0 :     ss<< "    if(isNan(arg0)||(gid0>=";
    2305           0 :     ss<<tmpCurDVR->GetArrayLength();
    2306           0 :     ss<<"))\n";
    2307           0 :     ss<<"        arg0 = 0;\n";
    2308           0 :     ss<< "    if(isNan(arg1)||(gid0>=";
    2309           0 :     ss<<tmpCurDVR->GetArrayLength();
    2310           0 :     ss<<"))\n";
    2311           0 :     ss<<"        arg1 = 0;\n";
    2312           0 :     ss<< "    if(isNan(arg2)||(gid0>=";
    2313           0 :     ss<<tmpCurDVR->GetArrayLength();
    2314           0 :     ss<<"))\n";
    2315           0 :     ss<<"        arg2 = 0;\n";
    2316             : #endif
    2317           0 :     ss <<"    if(arg1==0.0)\n";
    2318           0 :     ss <<"        return 0.0;\n";
    2319           0 :     ss <<"    else if(arg0*arg1<0.0)\n";
    2320           0 :     ss <<"        return 0.0000000001;\n";
    2321           0 :     ss <<"    else if(arg2==0.0&&arg0<0.0)\n";
    2322           0 :     ss <<"        return (trunc(arg0/arg1)+1)*arg1;\n";
    2323           0 :     ss <<"    else\n";
    2324           0 :     ss <<"        return trunc(arg0/arg1)*arg1;\n";
    2325           0 :     ss << "}\n";
    2326           0 : }
    2327           0 : void OpBitOr::GenSlidingWindowFunction(std::stringstream &ss,
    2328             :     const std::string &sSymName, SubArguments &vSubArguments)
    2329             : {
    2330           0 :     ss << "\ndouble " << sSymName;
    2331           0 :     ss << "_"<< BinFuncName() <<"(";
    2332           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    2333             :     {
    2334           0 :         if (i) ss << ",";
    2335           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    2336             :     }
    2337           0 :     ss << ") {\n";
    2338           0 :     ss << "    int gid0   = get_global_id(0);\n";
    2339           0 :     ss << "    double num1 = " << GetBottom() << ";\n";
    2340           0 :     ss << "    double num2 = " << GetBottom() << ";\n";
    2341             : #ifdef ISNAN
    2342           0 :     FormulaToken *iNum1 = vSubArguments[0]->GetFormulaToken();
    2343             :     const formula::SingleVectorRefToken* tmpCurDVRNum1=
    2344           0 :         static_cast<const formula::SingleVectorRefToken *>(iNum1);
    2345           0 :     FormulaToken *iNum2 = vSubArguments[1]->GetFormulaToken();
    2346             :     const formula::SingleVectorRefToken* tmpCurDVRNum2=
    2347           0 :         static_cast<const formula::SingleVectorRefToken *>(iNum2);
    2348           0 :     ss << "    int buffer_num1_len = "<<tmpCurDVRNum1->GetArrayLength()<<";\n";
    2349           0 :     ss << "    int buffer_num2_len = "<<tmpCurDVRNum2->GetArrayLength()<<";\n";
    2350           0 :     ss << "    if((gid0)>=buffer_num1_len || isNan(";
    2351           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef() << "))\n";
    2352           0 :     ss << "        num1 = " << GetBottom() << ";\n";
    2353           0 :     ss << "    else \n    ";
    2354             : #endif
    2355           0 :     ss << "    num1 = floor(" << vSubArguments[0]->GenSlidingWindowDeclRef();
    2356           0 :     ss << ");\n";
    2357             : #ifdef ISNAN
    2358           0 :     ss << "    if((gid0)>=buffer_num2_len || isNan(";
    2359           0 :     ss << vSubArguments[1]->GenSlidingWindowDeclRef() << "))\n";
    2360           0 :     ss << "        num2 = " << GetBottom() << ";\n";
    2361           0 :     ss << "    else\n    ";
    2362             : #endif
    2363           0 :     ss << "    num2 = floor(" << vSubArguments[1]->GenSlidingWindowDeclRef();
    2364           0 :     ss << ");\n";
    2365           0 :     ss << "    return (long)num1 | (long)num2;\n";
    2366           0 :     ss << "}";
    2367           0 : }
    2368           0 : void OpBitXor::GenSlidingWindowFunction(std::stringstream &ss,
    2369             :     const std::string &sSymName, SubArguments &vSubArguments)
    2370             : {
    2371           0 :     ss << "\ndouble " << sSymName;
    2372           0 :     ss << "_"<< BinFuncName() <<"(";
    2373           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    2374             :     {
    2375           0 :         if (i) ss << ",";
    2376           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    2377             :     }
    2378           0 :     ss << ") {\n";
    2379           0 :     ss << "    int gid0 = get_global_id(0);\n";
    2380           0 :     ss << "    double num1 = " << GetBottom() << ";\n";
    2381           0 :     ss << "    double num2 = " << GetBottom() << ";\n";
    2382             : #ifdef ISNAN
    2383           0 :     FormulaToken *iNum1 = vSubArguments[0]->GetFormulaToken();
    2384             :     const formula::SingleVectorRefToken* tmpCurDVRNum1=
    2385           0 :         static_cast<const formula::SingleVectorRefToken *>(iNum1);
    2386           0 :     FormulaToken *iNum2 = vSubArguments[1]->GetFormulaToken();
    2387             :     const formula::SingleVectorRefToken* tmpCurDVRNum2=
    2388           0 :         static_cast<const formula::SingleVectorRefToken *>(iNum2);
    2389           0 :     ss << "    int buffer_num1_len = " << tmpCurDVRNum1->GetArrayLength() << ";\n";
    2390           0 :     ss << "    int buffer_num2_len = " << tmpCurDVRNum2->GetArrayLength() << ";\n";
    2391             : 
    2392           0 :     ss << "    if((gid0)>=buffer_num1_len || isNan(";
    2393           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef() << "))\n";
    2394           0 :     ss << "        num1 = " << GetBottom() << ";\n";
    2395           0 :     ss << "    else\n    ";
    2396             : #endif
    2397           0 :     ss << "    num1 = floor(" << vSubArguments[0]->GenSlidingWindowDeclRef();
    2398           0 :     ss << ");\n";
    2399             : #ifdef ISNAN
    2400           0 :     ss << "    if((gid0)>=buffer_num2_len || isNan(";
    2401           0 :     ss << vSubArguments[1]->GenSlidingWindowDeclRef() << "))\n";
    2402           0 :     ss << "        num2 = " << GetBottom() << ";\n";
    2403           0 :     ss << "    else\n    ";
    2404             : #endif
    2405           0 :     ss << "    num2 = floor(" << vSubArguments[1]->GenSlidingWindowDeclRef();
    2406           0 :     ss << ");\n";
    2407           0 :     ss << "    return (long)num1 ^ (long)num2;\n";
    2408           0 :     ss << "}";
    2409           0 : }
    2410           0 : void OpBitLshift::GenSlidingWindowFunction(std::stringstream &ss,
    2411             :     const std::string &sSymName, SubArguments &vSubArguments)
    2412             : {
    2413           0 :     ss << "\ndouble " << sSymName;
    2414           0 :     ss << "_"<< BinFuncName() <<"(";
    2415           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    2416             :     {
    2417           0 :         if (i) ss << ",";
    2418           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    2419             :     }
    2420           0 :     ss << ") {\n";
    2421           0 :     ss << "    int gid0 = get_global_id(0);\n";
    2422           0 :     ss << "    double num = " << GetBottom() << ";\n";
    2423           0 :     ss << "    double shift_amount = " << GetBottom() << ";\n";
    2424             : #ifdef ISNAN
    2425           0 :     FormulaToken *iNum = vSubArguments[0]->GetFormulaToken();
    2426             :     const formula::SingleVectorRefToken* tmpCurDVRNum=
    2427           0 :         static_cast<const formula::SingleVectorRefToken*>(iNum);
    2428           0 :     FormulaToken *iShiftAmount = vSubArguments[1]->GetFormulaToken();
    2429             :     const formula::SingleVectorRefToken* tmpCurDVRShiftAmount=
    2430           0 :         static_cast<const formula::SingleVectorRefToken*>(iShiftAmount);
    2431           0 :     ss << "    int buffer_num_len = "<< tmpCurDVRNum->GetArrayLength()<<";\n";
    2432           0 :     ss << "    int buffer_shift_amount_len = ";
    2433           0 :     ss << tmpCurDVRShiftAmount->GetArrayLength() << ";\n";
    2434           0 :     ss << "    if((gid0)>=buffer_num_len || isNan(";
    2435           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef() << "))\n";
    2436           0 :     ss << "        num = " << GetBottom() << ";\n";
    2437           0 :     ss << "    else\n    ";
    2438             : #endif
    2439           0 :     ss << "    num = floor(";
    2440           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ");\n";
    2441             : #ifdef ISNAN
    2442           0 :     ss << "    if((gid0)>=buffer_shift_amount_len || isNan(";
    2443           0 :     ss << vSubArguments[1]->GenSlidingWindowDeclRef() << "))\n";
    2444           0 :     ss << "        shift_amount = " << GetBottom() << ";\n";
    2445           0 :     ss << "    else\n    ";
    2446             : #endif
    2447           0 :     ss << "    shift_amount = floor(";
    2448           0 :     ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ");\n";
    2449           0 :     ss << "    return floor(" << "shift_amount >= 0 ? ";
    2450           0 :     ss << "num * pow(2.0, shift_amount) : ";
    2451           0 :     ss << "num / pow(2.0, fabs(shift_amount)));\n";
    2452           0 :     ss << "}";
    2453           0 : }
    2454           0 : void OpBitRshift::GenSlidingWindowFunction(std::stringstream &ss,
    2455             :     const std::string &sSymName, SubArguments &vSubArguments)
    2456             : {
    2457           0 :     ss << "\ndouble " << sSymName;
    2458           0 :     ss << "_"<< BinFuncName() <<"(";
    2459           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    2460             :     {
    2461           0 :         if (i) ss << ",";
    2462           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    2463             :     }
    2464           0 :     ss << ") {\n";
    2465           0 :     ss << "    int gid0 = get_global_id(0);\n";
    2466           0 :     ss << "    double num = " << GetBottom() << ";\n";
    2467           0 :     ss << "    double shift_amount = " << GetBottom() << ";\n";
    2468             : #ifdef ISNAN
    2469           0 :     FormulaToken *iNum = vSubArguments[0]->GetFormulaToken();
    2470             :     const formula::SingleVectorRefToken* tmpCurDVRNum=
    2471           0 :         static_cast<const formula::SingleVectorRefToken*>(iNum);
    2472           0 :     FormulaToken *iShiftAmount = vSubArguments[1]->GetFormulaToken();
    2473             :     const formula::SingleVectorRefToken* tmpCurDVRShiftAmount=
    2474           0 :         static_cast<const formula::SingleVectorRefToken*>(iShiftAmount);
    2475           0 :     ss << "    int buffer_num_len = ";
    2476           0 :     ss << tmpCurDVRNum->GetArrayLength() << ";\n";
    2477           0 :     ss << "    int buffer_shift_amount_len = ";
    2478           0 :     ss << tmpCurDVRShiftAmount->GetArrayLength() << ";\n";
    2479             : 
    2480           0 :     ss << "    if((gid0)>=buffer_num_len || isNan(";
    2481           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef() << "))\n";
    2482           0 :     ss << "        num = " << GetBottom() << ";\n";
    2483           0 :     ss << "    else\n    ";
    2484             : #endif
    2485           0 :     ss << "    num = floor(";
    2486           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ");\n";
    2487             : #ifdef ISNAN
    2488           0 :     ss << "    if((gid0)>=buffer_shift_amount_len || isNan(";
    2489           0 :     ss << vSubArguments[1]->GenSlidingWindowDeclRef() << "))\n";
    2490           0 :     ss << "        shift_amount = " <<GetBottom()<< ";\n";
    2491           0 :     ss << "    else\n    ";
    2492             : #endif
    2493           0 :     ss << "    shift_amount = floor(";
    2494           0 :     ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ");\n";
    2495           0 :     ss << "    return floor(";
    2496           0 :     ss << "shift_amount >= 0 ? num / pow(2.0, shift_amount) : ";
    2497           0 :     ss << "num * pow(2.0, fabs(shift_amount)));\n";
    2498           0 :     ss << "}";
    2499           0 : }
    2500           0 : void OpSumSQ::GenSlidingWindowFunction(std::stringstream &ss,
    2501             :             const std::string &sSymName, SubArguments &vSubArguments)
    2502             : {
    2503           0 :     ss << "\ndouble " << sSymName;
    2504           0 :     ss << "_"<< BinFuncName() <<"(";
    2505           0 :     for (unsigned i = 0; i < vSubArguments.size(); ++i)
    2506             :     {
    2507           0 :         if (i)
    2508           0 :             ss << ",";
    2509           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    2510             :     }
    2511           0 :     ss << ")\n";
    2512           0 :     ss << "{\n";
    2513           0 :     ss << "    int gid0=get_global_id(0);\n";
    2514           0 :     ss << "    double sum = 0.0f, arg;\n";
    2515           0 :     for( unsigned i=0; i < vSubArguments.size(); ++i)
    2516             :     {
    2517           0 :         FormulaToken *tmpCur = vSubArguments[i]->GetFormulaToken();
    2518             :         assert(tmpCur);
    2519           0 :         if(ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
    2520             :         {
    2521           0 :             if (tmpCur->GetType() == formula::svDoubleVectorRef)
    2522             :             {
    2523             :                 const formula::DoubleVectorRefToken* pDVR =
    2524           0 :                     static_cast<const formula::DoubleVectorRefToken *>(tmpCur);
    2525           0 :                 size_t nCurWindowSize = pDVR->GetRefRowSize();
    2526           0 :                 ss << "    for (int i = ";
    2527           0 :                 if (!pDVR->IsStartFixed() && pDVR->IsEndFixed())
    2528             :                 {
    2529             : #ifdef  ISNAN
    2530           0 :                     ss << "gid0; i < " << pDVR->GetArrayLength();
    2531           0 :                     ss << " && i < " << nCurWindowSize  << "; ++i)\n";
    2532           0 :                     ss << "    {\n";
    2533             : #else
    2534             :                     ss << "gid0; i < "<< nCurWindowSize << "; ++i)\n";
    2535             :                     ss << "    {\n";
    2536             : #endif
    2537             :                 }
    2538           0 :                 else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed())
    2539             :                 {
    2540             : #ifdef  ISNAN
    2541           0 :                     ss << "0; i < " << pDVR->GetArrayLength();
    2542           0 :                     ss << " && i < gid0+"<< nCurWindowSize << "; ++i)\n";
    2543           0 :                     ss << "    {\n";
    2544             : #else
    2545             :                     ss << "0; i < gid0+"<< nCurWindowSize << "; ++i)\n";
    2546             :                     ss << "    {\n";
    2547             : #endif
    2548             :                 }
    2549           0 :                 else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed())
    2550             :                 {
    2551             : #ifdef  ISNAN
    2552           0 :                     ss << "0; i + gid0 < " << pDVR->GetArrayLength();
    2553           0 :                     ss << " &&  i < "<< nCurWindowSize << "; ++i)\n";
    2554           0 :                     ss << "    {\n";
    2555             : #else
    2556             :                     ss << "0; i < "<< nCurWindowSize << "; ++i)\n";
    2557             :                     ss << "    {\n";
    2558             : #endif
    2559             :                 }
    2560             :                 else
    2561             :                 {
    2562             : #ifdef  ISNAN
    2563           0 :                     ss << "0; i < "<< nCurWindowSize << "; ++i)\n";
    2564           0 :                     ss << "    {\n";
    2565             : #else
    2566             :                     ss << "0; i < "<< nCurWindowSize << "; ++i)\n";
    2567             :                     ss << "    {\n";
    2568             : #endif
    2569             :                 }
    2570           0 :                 ss << "        arg = ";
    2571           0 :                 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
    2572           0 :                 ss << ";\n";
    2573             : #ifdef  ISNAN
    2574           0 :                 ss << "        if (isNan(arg))\n";
    2575           0 :                 ss << "            continue;\n";
    2576             : #endif
    2577           0 :                 ss << "        sum += pown(arg, 2);\n";
    2578           0 :                 ss << "    }\n";
    2579             :             }
    2580           0 :             else if(tmpCur->GetType() == formula::svSingleVectorRef)
    2581             :             {
    2582             :                 const formula::SingleVectorRefToken* tmpCurDVR=
    2583             :                       static_cast<
    2584           0 :                       const formula::SingleVectorRefToken *>(tmpCur);
    2585           0 :                 ss << "    arg = ";
    2586           0 :                 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
    2587           0 :                 ss << ";\n";
    2588             : #ifdef ISNAN
    2589           0 :                 ss << "    if(isNan(arg)||(gid0>=";
    2590           0 :                 ss << tmpCurDVR->GetArrayLength();
    2591           0 :                 ss << "))\n";
    2592           0 :                 ss << "        arg = 0.0f;\n";
    2593           0 :                 ss << "    sum += pown(arg, 2);\n";
    2594             : #endif
    2595             :             }
    2596           0 :             else if(tmpCur->GetType() == formula::svDouble)
    2597             :             {
    2598           0 :                 ss << "        arg = ";
    2599           0 :                 ss << tmpCur->GetDouble() << ";\n";
    2600           0 :                 ss << "        sum += pown(arg, 2);\n";
    2601             :             }
    2602             :         }
    2603             :         else
    2604             :         {
    2605           0 :             ss << "        arg = ";
    2606           0 :             ss << vSubArguments[i]->GenSlidingWindowDeclRef();
    2607           0 :             ss << ";\n";
    2608           0 :             ss << "        sum += pown(arg, 2);\n";
    2609             :         }
    2610             :     }
    2611           0 :     ss << "    return sum;\n";
    2612           0 :     ss << "}";
    2613           0 : }
    2614           0 : void OpSqrtPi::GenSlidingWindowFunction(std::stringstream &ss,
    2615             :             const std::string &sSymName, SubArguments &vSubArguments)
    2616             : {
    2617           0 :     ss << "\ndouble " << sSymName;
    2618           0 :     ss << "_"<< BinFuncName() <<"(";
    2619           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    2620             :     {
    2621           0 :         if (i)
    2622           0 :             ss << ",";
    2623           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    2624             :     }
    2625           0 :     ss << ")\n";
    2626           0 :     ss << "{\n";
    2627           0 :     ss << "    int gid0=get_global_id(0);\n";
    2628           0 :     ss << "    double arg0 = 0.0f;\n";
    2629           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
    2630             :     assert(tmpCur);
    2631           0 :     if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
    2632             :     {
    2633           0 :         if(tmpCur->GetType() == formula::svSingleVectorRef)
    2634             :         {
    2635             :             const formula::SingleVectorRefToken*tmpCurDVR=
    2636             :                 static_cast
    2637           0 :                 <const formula::SingleVectorRefToken *>(tmpCur);
    2638           0 :             ss << "    arg0 = ";
    2639           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    2640           0 :             ss << ";\n";
    2641             : #ifdef ISNAN
    2642           0 :             ss << "    if(isNan(";
    2643           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    2644           0 :             ss << ")||(gid0>=";
    2645           0 :             ss << tmpCurDVR->GetArrayLength();
    2646           0 :             ss << "))\n";
    2647           0 :             ss << "    { arg0 = 0.0f; }\n";
    2648             : #endif
    2649             :         }
    2650           0 :         else if(tmpCur->GetType() == formula::svDouble)
    2651             :         {
    2652           0 :             ss << "    arg0=";
    2653           0 :             ss << tmpCur->GetDouble() << ";\n";
    2654             :         }
    2655             :     }
    2656             :     else
    2657             :     {
    2658           0 :         ss << "        arg0 = ";
    2659           0 :         ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    2660           0 :         ss << ";\n";
    2661             :     }
    2662           0 :     ss << "    return (double)sqrt(arg0 *";
    2663           0 :     ss << " 3.1415926535897932384626433832795f);\n";
    2664           0 :     ss << "}";
    2665           0 : }
    2666           0 : void OpCeil::GenSlidingWindowFunction(std::stringstream &ss,
    2667             :     const std::string &sSymName, SubArguments &vSubArguments)
    2668             : {
    2669           0 :     ss << "\ndouble " << sSymName;
    2670           0 :     ss << "_"<< BinFuncName() <<"(";
    2671           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    2672             :     {
    2673           0 :         if (i) ss << ",";
    2674           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    2675             :     }
    2676           0 :     ss << ") {\n";
    2677           0 :     ss << "    int gid0   = get_global_id(0);\n";
    2678           0 :     ss << "    double num = " << GetBottom() << ";\n";
    2679           0 :     ss << "    double significance = " << GetBottom() << ";\n";
    2680           0 :     ss << "    double bAbs = 0;\n";
    2681             : #ifdef ISNAN
    2682           0 :     ss << "    if(isNan(";
    2683           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef() << "))\n";
    2684           0 :     ss << "        num = " << GetBottom() << ";\n";
    2685           0 :     ss << "    else\n    ";
    2686             : #endif
    2687           0 :     ss << "    num = " << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
    2688             : #ifdef ISNAN
    2689           0 :     ss << "    if(isNan(";
    2690           0 :     ss << vSubArguments[1]->GenSlidingWindowDeclRef() << "))\n";
    2691           0 :     ss << "        return 0.0;\n";
    2692           0 :     ss << "    else\n    ";
    2693             : #endif
    2694           0 :     ss << "    significance = ";
    2695           0 :     ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
    2696           0 :     if (vSubArguments.size() > 2)
    2697             :     {
    2698             : #ifdef ISNAN
    2699           0 :         FormulaToken *bAbs = vSubArguments[2]->GetFormulaToken();
    2700           0 :         if(bAbs->GetType() == formula::svSingleVectorRef)
    2701             :         {
    2702             :             const formula::SingleVectorRefToken* tmpCurSVRIsAbs=
    2703           0 :                 static_cast<const formula::SingleVectorRefToken*>(bAbs);
    2704           0 :             ss<< "    if((gid0)>=" << tmpCurSVRIsAbs->GetArrayLength() << " ||";
    2705             :         }
    2706           0 :         if(bAbs->GetType() == formula::svDoubleVectorRef)
    2707             :         {
    2708             :             const formula::DoubleVectorRefToken* tmpCurDVRIsAbs=
    2709           0 :                 static_cast<const formula::DoubleVectorRefToken*>(bAbs);
    2710           0 :             ss<< "    if((gid0)>=" << tmpCurDVRIsAbs->GetArrayLength() << " ||";
    2711             :         }
    2712           0 :         if(bAbs->GetType() == formula::svDouble)
    2713             :         {
    2714           0 :             ss<< "    if(";
    2715             :         }
    2716           0 :         ss << "isNan(";
    2717           0 :         ss << vSubArguments[2]->GenSlidingWindowDeclRef() << "))\n";
    2718           0 :         ss << "        bAbs = 0;\n";
    2719           0 :         ss << "    else\n    ";
    2720             : #endif
    2721           0 :         ss << "    bAbs = "<<vSubArguments[2]->GenSlidingWindowDeclRef()<<";\n";
    2722             :     }
    2723           0 :     ss << "    if(significance == 0.0)\n";
    2724           0 :     ss << "        return 0.0;\n";
    2725           0 :     ss << "    return ";
    2726           0 :     ss << "( !(int)bAbs && num < 0.0 ? floor( num / significance ) : ";
    2727           0 :     ss << "ceil( num / significance ) )";
    2728           0 :     ss << "*significance;\n";
    2729           0 :     ss << "}";
    2730           0 : }
    2731           0 : void OpKombin::GenSlidingWindowFunction(std::stringstream &ss,
    2732             :     const std::string &sSymName, SubArguments &vSubArguments)
    2733             : {
    2734           0 :     ss << "\ndouble " << sSymName;
    2735           0 :     ss << "_"<< BinFuncName() <<"(";
    2736           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    2737             :     {
    2738           0 :         if (i) ss << ",";
    2739           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    2740             :     }
    2741           0 :     ss << ") {\n";
    2742           0 :     ss << "    int gid0 = get_global_id(0);\n";
    2743           0 :     ss << "    double num = " << GetBottom() << ";\n";
    2744           0 :     ss << "    double num_chosen = " << GetBottom() << ";\n";
    2745           0 :     ss << "    double result = -1.0;\n";
    2746           0 :     FormulaToken *iNum = vSubArguments[0]->GetFormulaToken();
    2747           0 :     FormulaToken *iNumChosen = vSubArguments[1]->GetFormulaToken();
    2748             : 
    2749             :     assert(iNum);
    2750           0 :     if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
    2751             :     {
    2752           0 :         if(iNum->GetType() == formula::svSingleVectorRef &&
    2753           0 :             iNumChosen->GetType() == formula::svSingleVectorRef)
    2754             :         {
    2755             : #ifdef ISNAN
    2756           0 :             ss << "    if(isNan(";
    2757           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef() << "))\n";
    2758           0 :             ss << "        num = " << GetBottom() << ";\n";
    2759           0 :             ss << "    else\n    ";
    2760             : #endif
    2761           0 :             ss << "    num = floor(";
    2762           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ");\n";
    2763             : #ifdef ISNAN
    2764           0 :             ss << "    if(isNan(";
    2765           0 :             ss << vSubArguments[1]->GenSlidingWindowDeclRef() << "))\n";
    2766           0 :             ss << "        num_chosen = " << GetBottom() << ";\n";
    2767           0 :             ss << "    else\n    ";
    2768             : #endif
    2769           0 :             ss << "    num_chosen = floor(";
    2770           0 :             ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ");\n";
    2771             :         }
    2772           0 :         else if(iNum->GetType() == formula::svDouble &&
    2773           0 :             iNumChosen->GetType() == formula::svDouble)
    2774             :         {
    2775           0 :             ss << "    num = floor(" << iNum->GetDouble() << ");\n";
    2776           0 :             ss << "    num_chosen = floor("<< iNumChosen->GetDouble()<< ");\n";
    2777             :         }
    2778             :     }
    2779             :     else
    2780             :     {
    2781           0 :         ss << "    num = floor(";
    2782           0 :         ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ");\n";
    2783           0 :         ss << "    num_chosen = floor(";
    2784           0 :         ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ");\n";
    2785             :     }
    2786           0 :     ss << "    result = select(result, 0.0, (ulong)(num < num_chosen));\n";
    2787           0 :     ss << "    result = select(result, 1.0, (ulong)(num_chosen == 0.0));\n";
    2788           0 :     ss << "    if(result == 0 || result ==1)\n";
    2789           0 :     ss << "        return result;\n";
    2790           0 :     ss << "    double4 db4num;\n";
    2791           0 :     ss << "    double4 db4num_chosen;\n";
    2792           0 :     ss << "    double4 db4result;\n";
    2793           0 :     ss << "    double2 db2result;\n";
    2794           0 :     ss << "    result = 1.0;\n";
    2795           0 :     ss << "    int loop = num_chosen/4;\n";
    2796           0 :     ss << "    for(int i=0; i<loop; i++)\n";
    2797           0 :     ss << "    {\n";
    2798           0 :     ss << "        db4num = (double4){num,\n";
    2799           0 :     ss << "            num-1.0,\n";
    2800           0 :     ss << "            num-2.0,\n";
    2801           0 :     ss << "            num-3.0};\n";
    2802           0 :     ss << "        db4num_chosen = (double4){num_chosen,\n";
    2803           0 :     ss << "            num_chosen-1.0,\n";
    2804           0 :     ss << "            num_chosen-2.0,\n";
    2805           0 :     ss << "            num_chosen-3.0};\n";
    2806           0 :     ss << "        db4result = db4num * pown(db4num_chosen, -1);\n";
    2807           0 :     ss << "        db2result = db4result.xy * db4result.zw;\n";
    2808           0 :     ss << "        result *=  db2result.x * db2result.y;\n";
    2809           0 :     ss << "        num = num - 4.0;\n";
    2810           0 :     ss << "        num_chosen = num_chosen - 4.0;\n";
    2811           0 :     ss << "    }\n";
    2812           0 :     ss << "    while ( num_chosen > 0){\n";
    2813           0 :     ss << "        result *= num / num_chosen;\n";
    2814           0 :     ss << "        num = num - 1.0;\n";
    2815           0 :     ss << "        num_chosen = num_chosen - 1.0;\n";
    2816           0 :     ss << "    }\n";
    2817           0 :     ss << "    return result;\n";
    2818           0 :     ss << "}\n";
    2819           0 : }
    2820           0 : void OpConvert::GenSlidingWindowFunction(
    2821             :     std::stringstream &ss, const std::string &sSymName,
    2822             :     SubArguments &vSubArguments)
    2823             : {
    2824           0 :     int arg1=vSubArguments[1]->GetFormulaToken()->GetString().\
    2825           0 :         getString().toAsciiUpperCase().hashCode();
    2826           0 :     int arg2=vSubArguments[2]->GetFormulaToken()->GetString().\
    2827           0 :         getString().toAsciiUpperCase().hashCode();
    2828           0 :     if( !((arg1==5584&&arg2==108)||
    2829           0 :         (arg1==108&&arg2==5584)||
    2830           0 :         (arg1==5665&&arg2==268206)||
    2831           0 :         (arg1==268206&&arg2==5665)) )
    2832           0 :         throw Unhandled();
    2833             : 
    2834           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
    2835             :     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
    2836           0 :         formula::SingleVectorRefToken *>(tmpCur);
    2837           0 :     ss << "\ndouble " << sSymName;
    2838           0 :     ss << "_"<< BinFuncName() <<"(";
    2839           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    2840             :     {
    2841           0 :         if (i)
    2842           0 :             ss << ",";
    2843           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    2844             :     }
    2845           0 :     ss << ")\n{\n";
    2846           0 :     ss <<"    int gid0=get_global_id(0);\n";
    2847           0 :     ss << "    double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
    2848           0 :     ss << ";\n";
    2849           0 :     ss << "    double arg1 = " << vSubArguments[1]->GenSlidingWindowDeclRef();
    2850           0 :     ss << ";\n";
    2851           0 :     ss << "    double arg2 = " << vSubArguments[2]->GenSlidingWindowDeclRef();
    2852           0 :     ss << ";\n";
    2853             : #ifdef ISNAN
    2854           0 :     ss<< "    if(isNan(arg0)||(gid0>=";
    2855           0 :     ss<<tmpCurDVR->GetArrayLength();
    2856           0 :     ss<<"))\n";
    2857           0 :     ss<<"        arg0 = 0;\n";
    2858           0 :     ss<< "    if(isNan(arg1)||(gid0>=";
    2859           0 :     ss<<tmpCurDVR->GetArrayLength();
    2860           0 :     ss<<"))\n";
    2861           0 :     ss<<"        arg1 = 0;\n";
    2862           0 :     ss<< "    if(isNan(arg2)||(gid0>=";
    2863           0 :     ss<<tmpCurDVR->GetArrayLength();
    2864           0 :     ss<<"))\n";
    2865           0 :     ss<<"        arg2 = 0;\n";
    2866             : #endif
    2867           0 :     ss<<"    if(arg1==5584U&&arg2==108U)\n";
    2868           0 :     ss<<"        return arg0*1000.0;\n";
    2869           0 :     ss<<"    else if(arg1==108U&&arg2==3385U)\n";
    2870           0 :     ss<<"        return arg0/1000.0;\n";
    2871           0 :     ss<<"    else if(arg1==5665U&&arg2==268206U)\n";
    2872           0 :     ss<<"        return arg0*60.0;\n";
    2873           0 :     ss<<"    else if(arg1==268206U&&arg2==5665U)\n";
    2874           0 :     ss<<"        return arg0/60.0;\n";
    2875           0 :     ss<<"    else\n";
    2876           0 :     ss<<"        return -9999999999;\n";
    2877           0 :     ss << "}\n";
    2878             : 
    2879           0 : }
    2880             : 
    2881           0 : void OpProduct::GenSlidingWindowFunction(std::stringstream &ss,
    2882             :             const std::string &sSymName, SubArguments &vSubArguments)
    2883             : {
    2884           0 :     ss << "\ndouble " << sSymName;
    2885           0 :     ss << "_"<< BinFuncName() <<"( ";
    2886           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    2887             :     {
    2888           0 :         if (i)
    2889           0 :             ss << ",";
    2890           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    2891             :     }
    2892           0 :     ss << ") {\n";
    2893           0 :     ss << "    int gid0 = get_global_id(0);\n";
    2894           0 :     ss << "    int i = 0;\n";
    2895           0 :     ss << "    double product=0.0;\n\n";
    2896           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    2897             :     {
    2898           0 :         std::stringstream ssArgNoI;
    2899           0 :         ssArgNoI << i;
    2900           0 :         std::string sArgNoI = ssArgNoI.str();
    2901           0 :         ss << std::string("    double arg")+sArgNoI+";\n";
    2902           0 :         FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
    2903             :         assert(pCur);
    2904           0 :         if (pCur->GetType() == formula::svDoubleVectorRef)
    2905             :         {
    2906             :             const formula::DoubleVectorRefToken* pDVR =
    2907           0 :             static_cast<const formula::DoubleVectorRefToken *>(pCur);
    2908           0 :             size_t nCurWindowSize = pDVR->GetRefRowSize();
    2909           0 :             ss << std::string("    arg")+sArgNoI+" = ";
    2910           0 :             ss << vSubArguments[i]->GenSlidingWindowDeclRef();
    2911           0 :             ss <<";\n";
    2912             : #ifdef ISNAN
    2913           0 :             ss << std::string("    if(isNan(arg")+sArgNoI+")||((gid0+i)>=";
    2914           0 :             ss << pDVR->GetArrayLength();
    2915           0 :             ss << "))\n";
    2916           0 :             ss << "    {\n";
    2917           0 :             ss << std::string("        arg")+sArgNoI+" = 0;\n";
    2918           0 :             ss << "    }\n";
    2919             : #endif
    2920           0 :             ss << std::string("    product = arg")+sArgNoI+";\n";
    2921           0 :             ss << "    for (i = ";
    2922           0 :             ss << "1; i < "<< nCurWindowSize << "; i++)\n";
    2923           0 :             ss << "    {\n";
    2924           0 :             ss << std::string("        arg")+sArgNoI+" = ";
    2925           0 :             ss << vSubArguments[i]->GenSlidingWindowDeclRef();
    2926           0 :             ss << ";\n";
    2927             : #ifdef ISNAN
    2928           0 :             ss <<std::string("        if(isNan(arg")+sArgNoI+")||((gid0+i)>=";
    2929           0 :             ss << pDVR->GetArrayLength();
    2930           0 :             ss << "))\n";
    2931           0 :             ss << "        {\n";
    2932           0 :             ss << std::string("            arg")+sArgNoI+" = 0;\n";
    2933           0 :             ss << "        }\n";
    2934             : #endif
    2935           0 :             ss << std::string("        product*=arg")+sArgNoI+";\n";
    2936           0 :             ss << "    }\n";
    2937             :             }
    2938           0 :             else if (pCur->GetType() == formula::svSingleVectorRef)
    2939             :             {
    2940             : #ifdef  ISNAN
    2941           0 :                 ss << std::string("    arg")+sArgNoI+" = ";
    2942           0 :                 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
    2943           0 :                 ss << ";\n";
    2944           0 :                 ss << std::string("    product*=arg")+sArgNoI+";\n";
    2945             : #endif
    2946             :             }
    2947           0 :             else if (pCur->GetType() == formula::svDouble)
    2948             :             {
    2949             : #ifdef  ISNAN
    2950           0 :                 ss << std::string("    arg")+sArgNoI+" = ";
    2951           0 :                 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
    2952           0 :                 ss << ";\n";
    2953           0 :                 ss << std::string("    product*=arg")+sArgNoI+";\n";
    2954             : #endif
    2955             :             }
    2956           0 :         }
    2957           0 :         ss << "    return product;\n";
    2958           0 :         ss << "}";
    2959           0 : }
    2960           0 : void OpAverageIf::GenSlidingWindowFunction(std::stringstream &ss,
    2961             :     const std::string &sSymName, SubArguments &vSubArguments)
    2962             : {
    2963             : 
    2964           0 :     ss << "\ndouble " << sSymName;
    2965           0 :     ss << "_"<< BinFuncName() <<"(";
    2966           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    2967             :     {
    2968           0 :         if (i) ss << ",";
    2969           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    2970             :     }
    2971           0 :     ss << ")\n{\n";
    2972           0 :     ss << "    int gid0=get_global_id(0);\n";
    2973           0 :     ss << "    double tmp =0;\n";
    2974           0 :     ss << "    double count=0;\n";
    2975           0 :     ss << "    int singleIndex =gid0;\n";
    2976           0 :     ss << "    int doubleIndex;\n";
    2977           0 :     ss << "    int i ;\n";
    2978           0 :     ss << "    int j ;\n";
    2979           0 :     GenTmpVariables(ss,vSubArguments);
    2980             : 
    2981           0 :     unsigned paraOneIsDoubleVector = 0;
    2982           0 :     unsigned paraOneWidth = 1;
    2983           0 :     unsigned paraTwoWidth = 1;
    2984           0 :     unsigned loopTimes = 0;
    2985             : 
    2986           0 :     if(vSubArguments[0]->GetFormulaToken()->GetType() == formula::svDoubleVectorRef)
    2987             :     {
    2988           0 :         paraOneIsDoubleVector = 1;
    2989           0 :         FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
    2990             :         const formula::DoubleVectorRefToken*pCurDVR0= static_cast<const
    2991           0 :             formula::DoubleVectorRefToken *>(tmpCur0);
    2992           0 :         paraOneWidth = pCurDVR0->GetArrays().size();
    2993           0 :         loopTimes = paraOneWidth;
    2994           0 :         if(paraOneWidth > 1)
    2995             :         {
    2996           0 :             throw Unhandled();
    2997             :         }
    2998             :     }
    2999             : 
    3000           0 :     if(vSubArguments[paraOneWidth]->GetFormulaToken()->GetType() ==
    3001             :      formula::svDoubleVectorRef)
    3002             : 
    3003             :     {
    3004           0 :         FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
    3005             :         const formula::DoubleVectorRefToken*pCurDVR1= static_cast<const
    3006           0 :             formula::DoubleVectorRefToken *>(tmpCur1);
    3007           0 :         paraTwoWidth = pCurDVR1->GetArrays().size();
    3008           0 :         if(paraTwoWidth > 1)
    3009             :         {
    3010           0 :             throw Unhandled();
    3011             :         }
    3012           0 :         ss << "    i = ";
    3013           0 :         if (!pCurDVR1->IsStartFixed() && pCurDVR1->IsEndFixed()) {
    3014           0 :             ss << "gid0;\n";
    3015             :         } else {
    3016           0 :             ss << "0;\n";
    3017             :         }
    3018           0 :         if(!pCurDVR1->IsStartFixed() && !pCurDVR1->IsEndFixed())
    3019             :         {
    3020           0 :             ss << "        doubleIndex =i+gid0;\n";
    3021             :         }else
    3022             :         {
    3023           0 :             ss << "        doubleIndex =i;\n";
    3024             :         }
    3025             :     }
    3026             : 
    3027           0 :     CheckSubArgumentIsNan(ss,vSubArguments,paraOneWidth);
    3028             : 
    3029           0 :     unsigned paraThreeIndex = paraOneWidth + paraTwoWidth;
    3030           0 :     if(vSubArguments.size() > paraThreeIndex)
    3031             :     {
    3032           0 :         if(vSubArguments[paraThreeIndex]->GetFormulaToken()->GetType() ==
    3033             :         formula::svDoubleVectorRef)
    3034             :         {
    3035           0 :             unsigned paraThreeWidth = 1;
    3036             :             FormulaToken *tmpCur2 =
    3037           0 :             vSubArguments[paraThreeIndex]->GetFormulaToken();
    3038             :             const formula::DoubleVectorRefToken*pCurDVR2= static_cast<const
    3039           0 :                 formula::DoubleVectorRefToken *>(tmpCur2);
    3040           0 :             paraThreeWidth = pCurDVR2->GetArrays().size();
    3041           0 :              if(paraThreeWidth > 1)
    3042             :             {
    3043           0 :                 throw Unhandled();
    3044             :             }
    3045             :         }
    3046             :     }
    3047             : 
    3048           0 :     if(paraOneIsDoubleVector)
    3049             :     {
    3050           0 :         unsigned loopIndex = 0;
    3051           0 :         FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
    3052             :         const formula::DoubleVectorRefToken*pCurDVR0= static_cast<const
    3053           0 :             formula::DoubleVectorRefToken *>(tmpCur0);
    3054           0 :         size_t nCurWindowSize = pCurDVR0->GetArrayLength() <
    3055           0 :             pCurDVR0->GetRefRowSize() ? pCurDVR0->GetArrayLength():
    3056           0 :             pCurDVR0->GetRefRowSize() ;
    3057             : 
    3058           0 :         for(loopIndex =0; loopIndex < loopTimes; loopIndex++)
    3059             :         {
    3060           0 :             ss << "    for (i = ";
    3061           0 :             if (!pCurDVR0->IsStartFixed() && pCurDVR0->IsEndFixed()) {
    3062           0 :                 ss << "gid0; i < "<< nCurWindowSize <<"; i++)\n";
    3063           0 :             } else if (pCurDVR0->IsStartFixed() && !pCurDVR0->IsEndFixed()) {
    3064           0 :                 ss << "0; i < gid0+"<< nCurWindowSize <<"; i++)\n";
    3065             :             } else {
    3066           0 :                 ss << "0; i < "<< nCurWindowSize <<"; i++)\n";
    3067             :             }
    3068           0 :             ss << "    {\n";
    3069           0 :             if(!pCurDVR0->IsStartFixed() && !pCurDVR0->IsEndFixed())
    3070             :             {
    3071           0 :                 ss << "        doubleIndex =i+gid0;\n";
    3072             :             }else
    3073             :             {
    3074           0 :                 ss << "        doubleIndex =i;\n";
    3075             :             }
    3076             : 
    3077           0 :             CheckSubArgumentIsNan(ss,vSubArguments, loopIndex);
    3078             : 
    3079           0 :             ss << "        if ( isequal( tmp";
    3080           0 :             ss << loopIndex<<" , tmp"<<paraOneWidth<<") ) \n";
    3081           0 :             ss << "        {\n";
    3082           0 :             if(vSubArguments.size() == paraThreeIndex)
    3083           0 :                 ss << "            tmp += tmp"<<loopIndex<<";\n";
    3084             :             else
    3085             :             {
    3086             :                 CheckSubArgumentIsNan(ss,vSubArguments,
    3087           0 :                 paraThreeIndex+loopIndex);
    3088           0 :                 ss << "            tmp += tmp";
    3089           0 :                 ss << paraThreeIndex+loopIndex<<";\n";
    3090             :             }
    3091           0 :             ss << "            count+=1.0;\n";
    3092           0 :             ss << "        }\n";
    3093           0 :             ss << "    }\n";
    3094             :         }
    3095             :     }
    3096             :       else
    3097             :     {
    3098           0 :         CheckSubArgumentIsNan(ss,vSubArguments, 0);
    3099           0 :         ss << "        if ( isequal( tmp0 , tmp1 ) ) \n";
    3100           0 :         ss << "        {\n";
    3101           0 :         if(vSubArguments.size() == 2)
    3102           0 :             ss << "            tmp += tmp0;\n";
    3103             :         else
    3104             :         {
    3105           0 :             CheckSubArgumentIsNan(ss,vSubArguments,2);
    3106           0 :             ss << "            tmp += tmp2;\n";
    3107             :         }
    3108           0 :         ss << "            count+=1.0;\n";
    3109           0 :         ss << "        }\n";
    3110             :     }
    3111             : 
    3112           0 :     ss << "    if(count!=0)\n";
    3113           0 :     ss << "        tmp=tmp/count;\n";
    3114           0 :     ss << "    else\n";
    3115           0 :     ss << "        tmp= 0 ;\n";
    3116           0 :     ss << "    return tmp;\n";
    3117           0 :     ss << "}";
    3118           0 : }
    3119           0 : void OpDeg::GenSlidingWindowFunction(std::stringstream &ss,
    3120             :             const std::string &sSymName, SubArguments &vSubArguments)
    3121             : {
    3122           0 :     ss << "\ndouble " << sSymName;
    3123           0 :     ss << "_"<< BinFuncName() <<"(";
    3124           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    3125             :     {
    3126           0 :         if (i)
    3127           0 :             ss << ",";
    3128           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    3129             :     }
    3130           0 :     ss << ")\n";
    3131           0 :     ss << "{\n";
    3132           0 :     ss << "    int gid0=get_global_id(0);\n";
    3133           0 :     ss << "    double arg0 = 0.0f;\n";
    3134           0 :     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
    3135             :     assert(tmpCur);
    3136           0 :     if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
    3137             :     {
    3138           0 :         if(tmpCur->GetType() == formula::svSingleVectorRef)
    3139             :         {
    3140             :             const formula::SingleVectorRefToken*tmpCurDVR=
    3141             :                 static_cast
    3142           0 :                 <const formula::SingleVectorRefToken *>(tmpCur);
    3143           0 :             ss << "    arg0 = ";
    3144           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    3145           0 :             ss << ";\n";
    3146             : #ifdef ISNAN
    3147           0 :             ss << "    if(isNan(";
    3148           0 :             ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    3149           0 :             ss << ")||(gid0>=";
    3150           0 :             ss << tmpCurDVR->GetArrayLength();
    3151           0 :             ss << "))\n";
    3152           0 :             ss << "    { arg0 = 0.0f; }\n";
    3153             : #endif
    3154             :         }
    3155           0 :         else if(tmpCur->GetType() == formula::svDouble)
    3156             :         {
    3157           0 :             ss << "    arg0=";
    3158           0 :             ss << tmpCur->GetDouble() << ";\n";
    3159             :         }
    3160             :     }
    3161             :     else
    3162             :     {
    3163           0 :         ss << "        arg0 = ";
    3164           0 :         ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    3165           0 :         ss << ";\n";
    3166             :     }
    3167           0 :     ss << "    return arg0 * pown(M_PI, -1) * 180;;\n";
    3168           0 :     ss << "}";
    3169           0 : }
    3170             : 
    3171           0 : void OpFact::GenSlidingWindowFunction(std::stringstream& ss,
    3172             :     const std::string &sSymName, SubArguments& vSubArguments)
    3173             : {
    3174           0 :     ss << "\ndouble " << sSymName;
    3175           0 :     ss << "_" << BinFuncName() << "(";
    3176           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    3177             :     {
    3178           0 :         if (i)
    3179           0 :             ss << ",";
    3180           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    3181             :     }
    3182           0 :     ss << ") {\n";
    3183           0 :     ss << "    double tmp = " << GetBottom() << ";\n";
    3184           0 :     ss << "    int gid0 = get_global_id(0);\n";
    3185           0 :     ss << "    double arg0 = " << GetBottom() << ";\n";
    3186           0 :     FormulaToken* pCur = vSubArguments[0]->GetFormulaToken();
    3187             :     assert(pCur);
    3188           0 :     if (pCur->GetType() == formula::svSingleVectorRef)
    3189             :     {
    3190             : #ifdef  ISNAN
    3191             :         const formula::SingleVectorRefToken* pSVR =
    3192           0 :             static_cast< const formula::SingleVectorRefToken* >(pCur);
    3193           0 :         ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
    3194             : #endif
    3195             :     }
    3196           0 :     else if (pCur->GetType() == formula::svDouble)
    3197             :     {
    3198             : #ifdef  ISNAN
    3199           0 :         ss << "    {\n";
    3200             : #endif
    3201             :     }
    3202             : #ifdef  ISNAN
    3203           0 :     if(ocPush==vSubArguments[0]->GetFormulaToken()->GetOpCode())
    3204             :     {
    3205           0 :         ss << "        if (isNan(";
    3206           0 :         ss << vSubArguments[0]->GenSlidingWindowDeclRef();
    3207           0 :         ss << "))\n";
    3208           0 :         ss << "            arg0 = 0;\n";
    3209           0 :         ss << "        else\n";
    3210           0 :         ss << "            arg0 = ";
    3211           0 :         ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
    3212           0 :         ss << "    arg0 = floor(arg0);\n";
    3213           0 :         ss << "    if (arg0 < 0.0)\n";
    3214           0 :         ss << "        return 0.0;\n";
    3215           0 :         ss << "    else if (arg0 == 0.0)\n";
    3216           0 :         ss << "        return 1.0;\n";
    3217           0 :         ss << "    else if (arg0 <= 170.0)\n";
    3218           0 :         ss << "    {\n";
    3219           0 :         ss << "        double fTemp = arg0;\n";
    3220           0 :         ss << "        while (fTemp > 2.0)\n";
    3221           0 :         ss << "        {\n";
    3222           0 :         ss << "            fTemp = fTemp - 1;\n";
    3223           0 :         ss << "            arg0 = arg0 * fTemp;\n";
    3224           0 :         ss << "        }\n";
    3225           0 :         ss << "    }\n";
    3226           0 :         ss << "    else\n";
    3227           0 :         ss << "        return -DBL_MAX;\n";
    3228           0 :         ss << "    }\n";
    3229             :     }
    3230             :     else
    3231             :     {
    3232           0 :         ss << "    arg0 = ";
    3233           0 :         ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
    3234             :     }
    3235             : #else
    3236             :     ss << "    arg0 = ";
    3237             :     ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
    3238             : #endif
    3239           0 :     ss << "    return arg0;\n";
    3240           0 :     ss << "}";
    3241           0 : }
    3242           0 : void OpQuotient::GenSlidingWindowFunction(std::stringstream &ss,
    3243             :     const std::string &sSymName, SubArguments &vSubArguments)
    3244             : {
    3245           0 :     ss << "\ndouble " << sSymName;
    3246           0 :     ss << "_"<< BinFuncName() <<"(";
    3247           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    3248             :     {
    3249           0 :         if (i) ss << ",";
    3250           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    3251             :     }
    3252           0 :     ss << ") {\n";
    3253           0 :     ss << "    int gid0 = get_global_id(0);\n";
    3254           0 :     ss << "    double num1 = 1.0;\n";
    3255           0 :     ss << "    double num2 = 1.0;\n";
    3256             : #ifdef ISNAN
    3257           0 :     ss << "    if(isNan(";
    3258           0 :     ss << vSubArguments[0]->GenSlidingWindowDeclRef() << "))\n";
    3259           0 :     ss << "        num1 = 1.0;\n";
    3260           0 :     ss << "    else \n    ";
    3261             : #endif
    3262           0 :     ss << "    num1 = " << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
    3263             : #ifdef ISNAN
    3264           0 :     ss << "    if(isNan(";
    3265           0 :     ss << vSubArguments[1]->GenSlidingWindowDeclRef() << "))\n";
    3266           0 :     ss << "        num2 = 1.0;\n";
    3267           0 :     ss << "    else \n    ";
    3268             : #endif
    3269           0 :     ss << "    num2 = " << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
    3270           0 :     ss << "    return trunc(num1/num2);\n";
    3271           0 :     ss << "}";
    3272           0 : }
    3273           0 : void OpSeriesSum::GenSlidingWindowFunction(std::stringstream &ss,
    3274             :     const std::string &sSymName, SubArguments &vSubArguments)
    3275             : {
    3276           0 :     if( vSubArguments.size() != 4){return;}
    3277           0 :     ss << "\ndouble " << sSymName;
    3278           0 :     ss << "_"<< BinFuncName() <<"(";
    3279           0 :     for (unsigned i = 0; i < vSubArguments.size(); i++)
    3280             :     {
    3281           0 :         if (i)
    3282           0 :             ss << ",";
    3283           0 :         vSubArguments[i]->GenSlidingWindowDecl(ss);
    3284             :     }
    3285           0 :     ss << ")\n";
    3286           0 :     ss << "{\n";
    3287           0 :     ss << "    int gid0=get_global_id(0);\n";
    3288           0 :     ss << "    double var[3], coeff, res = 0.0f;\n";
    3289             :     FormulaToken *tmpCur;
    3290           0 :     for(int i = 0; i < 3; ++i)
    3291             :     {
    3292           0 :         tmpCur = vSubArguments[i]->GetFormulaToken();
    3293             :         assert(tmpCur);
    3294           0 :         if(ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
    3295             :         {
    3296           0 :             if(tmpCur->GetType() == formula::svSingleVectorRef)
    3297             :             {
    3298             :                 const formula::SingleVectorRefToken* tmpCurDVR=
    3299             :                     static_cast<
    3300           0 :                     const formula::SingleVectorRefToken *>(tmpCur);
    3301           0 :                 ss << "    var["<<i<<"] = ";
    3302           0 :                 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
    3303           0 :                 ss << ";\n";
    3304             : #ifdef ISNAN
    3305           0 :                 ss << "    if(isNan(var["<<i<<"])||(gid0>=";
    3306           0 :                 ss << tmpCurDVR->GetArrayLength();
    3307           0 :                 ss << "))\n";
    3308           0 :                 ss << "        var["<<i<<"] = 0;\n";
    3309             : #endif
    3310             :             }
    3311           0 :             else if(tmpCur->GetType() == formula::svDouble)
    3312             :             {
    3313           0 :                 ss << "    var["<<i<<"] = ";
    3314           0 :                 ss << tmpCur->GetDouble() << ";\n";
    3315             :             }
    3316             :         }
    3317             :         else
    3318             :         {
    3319           0 :             ss << "    var["<<i<<"] = ";
    3320           0 :             ss << vSubArguments[i]->GenSlidingWindowDeclRef();
    3321           0 :             ss << ";\n";
    3322             :         }
    3323             :     }
    3324           0 :     tmpCur = vSubArguments[3]->GetFormulaToken();
    3325             :     assert(tmpCur);
    3326           0 :     if(ocPush == vSubArguments[3]->GetFormulaToken()->GetOpCode())
    3327             :     {
    3328             :         //TODO       DoubleVector
    3329           0 :         if (tmpCur->GetType() == formula::svDoubleVectorRef)
    3330             :         {
    3331             :             const formula::DoubleVectorRefToken* pDVR =
    3332           0 :                 static_cast<const formula::DoubleVectorRefToken *>(tmpCur);
    3333           0 :             size_t nCurWindowSize = pDVR->GetRefRowSize();
    3334           0 :             ss << "    int j = 0;\n";
    3335           0 :             ss << "    for (int i = ";
    3336           0 :             if (!pDVR->IsStartFixed() && pDVR->IsEndFixed())
    3337             :             {
    3338             : #ifdef  ISNAN
    3339           0 :                 ss << "gid0; i < " << pDVR->GetArrayLength();
    3340           0 :                 ss << " && i < " << nCurWindowSize  << "; ++i)\n";
    3341           0 :                 ss << "    {\n";
    3342             : #else
    3343             :                 ss << "gid0; i < "<< nCurWindowSize << "; ++i)\n";
    3344             :                 ss << "    {\n";
    3345             : #endif
    3346             :             }
    3347           0 :             else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed())
    3348             :             {
    3349             : #ifdef  ISNAN
    3350           0 :                 ss << "0; i < " << pDVR->GetArrayLength();
    3351           0 :                 ss << " && i < gid0+"<< nCurWindowSize << "; ++i)\n";
    3352           0 :                 ss << "    {\n";
    3353             : #else
    3354             :                 ss << "0; i < gid0+"<< nCurWindowSize << "; ++i)\n";
    3355             :                 ss << "    {\n";
    3356             : #endif
    3357             :             }
    3358           0 :             else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed())
    3359             :             {
    3360             : #ifdef  ISNAN
    3361           0 :                 ss << "0; i + gid0 < " << pDVR->GetArrayLength();
    3362           0 :                 ss << " &&  i < "<< nCurWindowSize << "; ++i)\n";
    3363           0 :                 ss << "    {\n";
    3364             : #else
    3365             :                 ss << "0; i < "<< nCurWindowSize << "; ++i)\n";
    3366             :                 ss << "    {\n";
    3367             : #endif
    3368             :             }
    3369             :             else
    3370             :             {
    3371             : #ifdef  ISNAN
    3372           0 :                 ss << "0; i < "<< nCurWindowSize << "; ++i)\n";
    3373           0 :                 ss << "    {\n";
    3374             : #else
    3375             :                 ss << "0; i < "<< nCurWindowSize << "; ++i)\n";
    3376             :                 ss << "    {\n";
    3377             : #endif
    3378             :             }
    3379           0 :             ss << "        coeff = ";
    3380           0 :             ss << vSubArguments[3]->GenSlidingWindowDeclRef();
    3381           0 :             ss << ";\n";
    3382             : #ifdef  ISNAN
    3383           0 :             ss << "        if (isNan(coeff))\n";
    3384           0 :             ss << "            continue;\n";
    3385             : #endif
    3386           0 :             ss << "        res = res + coeff * pow(var[0],";
    3387           0 :             ss << " var[1] + j * var[2]);\n";
    3388           0 :             ss << "        ++j;\n";
    3389           0 :             ss << "    }\n";
    3390             :         }
    3391           0 :         else if(tmpCur->GetType() == formula::svSingleVectorRef)
    3392             :         {
    3393             :             const formula::SingleVectorRefToken* tmpCurDVR=
    3394             :                 static_cast<
    3395           0 :                 const formula::SingleVectorRefToken *>(tmpCur);
    3396           0 :             ss << "    coeff = ";
    3397           0 :             ss << vSubArguments[3]->GenSlidingWindowDeclRef();
    3398           0 :             ss << ";\n";
    3399             : #ifdef ISNAN
    3400           0 :             ss << "    if(isNan(coeff)||(gid0>=";
    3401           0 :             ss << tmpCurDVR->GetArrayLength();
    3402           0 :             ss << "))\n";
    3403           0 :             ss << "        return 0;\n";
    3404             : #endif
    3405             :         }
    3406             :     }
    3407           0 :     ss << "    return res;\n";
    3408           0 :     ss << "}";
    3409             : }
    3410           3 : }}
    3411             : 
    3412             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10