sc/source/core/opencl/op_financial.cxx | 3070 +++++----------------------------
 1 file changed, 514 insertions(+), 2556 deletions(-)

New commits:
commit c443a02ec9db419527566b6f80f413c45dea3be5
Author:     Luboš Luňák <l.lu...@collabora.com>
AuthorDate: Mon Sep 19 17:43:07 2022 +0200
Commit:     Luboš Luňák <l.lu...@collabora.com>
CommitDate: Tue Sep 20 08:43:37 2022 +0200

    reduce opencl copy&paste and fix in op_financial.cxx
    
    Change-Id: Ia1cd64f68b75f445c15ec5f8088e9202fa39768e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140185
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <l.lu...@collabora.com>

diff --git a/sc/source/core/opencl/op_financial.cxx 
b/sc/source/core/opencl/op_financial.cxx
index 863fa2552cab..4d80efb53751 100644
--- a/sc/source/core/opencl/op_financial.cxx
+++ b/sc/source/core/opencl/op_financial.cxx
@@ -26,103 +26,26 @@ void RRI::GenSlidingWindowFunction(
     ss << "{\n";
     ss << "    double tmp = " << GetBottom() <<";\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    double fv;\n";
-    ss << "    double pv;\n";
-    ss << "    double nper;\n";
-    FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur0);
-
-    FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur1);
-
-    FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur2);
-
-    ss<< "    int buffer_nper_len = ";
-    ss<< tmpCurDVR0->GetArrayLength();
-    ss << ";\n";
-
-    ss<< "    int buffer_pv_len = ";
-    ss<< tmpCurDVR1->GetArrayLength();
-    ss << ";\n";
-
-    ss<< "    int buffer_fv_len = ";
-    ss<< tmpCurDVR2->GetArrayLength();
-    ss << ";\n";
-
-    ss<<"    if(gid0>=buffer_nper_len || isnan(";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss<<"))\n";
-    ss<<"        nper = 0;\n\telse \n";
-    ss<<"        nper = ";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss<<";\n";
-
-    ss<<"    if(gid0>=buffer_pv_len || isnan(";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss<<"))\n";
-    ss<<"        pv = 0;\n\telse \n";
-    ss<<"        pv = ";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss<<";\n";
-
-    ss<<"    if(gid0>=buffer_pv_len || isnan(";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss<<"))\n";
-    ss<<"        fv = 0;\n\telse \n";
-    ss<<"        fv = ";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss<<";\n";
+    GenerateArg( "nper", 0, vSubArguments, ss );
+    GenerateArg( "pv", 1, vSubArguments, ss );
+    GenerateArg( "fv", 2, vSubArguments, ss );
+    ss << "    if ( nper <= 0.0 || pv == 0 )\n";
+    ss << "         return CreateDoubleError(IllegalArgument);\n";
     ss << "    tmp = pow(fv/pv,1.0/nper)-1;\n";
     ss << "    return tmp;\n";
     ss << "}";
 }
 
 void OpNominal::GenSlidingWindowFunction(
-    outputstream &ss, const std::string &sSymName, SubArguments &
-vSubArguments)
+    outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 2, 2 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n\t";
-    ss << "double tmp = 0;\n\t";
-    ss << "double temp = 0;\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
-    ss << "double tmp0=0,tmp1=0;\n";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
-        assert(pCur);
-        if (pCur->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken* pSVR =
-                static_cast< const formula::SingleVectorRefToken* >(pCur);
-            ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-        }
-        else if (pCur->GetType() == formula::svDouble)
-        {
-            ss << "{\n";
-        }
-
-        if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
-        {
-            ss <<"    temp="<<vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss <<";\n";
-            ss <<"    if (isnan(temp))\n";
-            ss <<"        tmp"<<i<<"= 0;\n";
-            ss <<"    else\n";
-            ss <<"        tmp"<<i<<"=temp;\n";
-            ss <<"    }\n";
-        }
-        else
-        {
-            ss <<"    tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(
-);
-            ss <<";\n";
-        }
-    }
+    GenerateArg( "tmp0", 0, vSubArguments, ss );
+    GenerateArg( "tmp1", 1, vSubArguments, ss );
+    ss << "double tmp = 0;\n\t";
     ss<<"if(tmp1==0)\n\t";
     ss<<"\treturn 0;\n\t";
     ss<<"tmp= 1.0 / tmp1;\n\t";
@@ -141,34 +64,9 @@ void OpDollarde::GenSlidingWindowFunction(
     ss << "double tmp = " << GetBottom() <<";\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
     ss << "double fInt = " << GetBottom() <<";\n\t";
-    ss << "double dollar;\n\t";
-    ss << "double fFrac;\n\t";
-    FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur0);
-    FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur1);
-    ss<< "int buffer_dollar_len = ";
-    ss<< tmpCurDVR0->GetArrayLength();
-    ss << ";\n\t";
-    ss<< "int buffer_frac_len = ";
-    ss<< tmpCurDVR1->GetArrayLength();
-    ss << ";\n\t";
-    ss<<"if((gid0)>=buffer_dollar_len || isnan(";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"dollar = 0;\n\telse \n\t\t";
-    ss<<"dollar = ";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-    ss<<"if((gid0)>=buffer_frac_len || isnan(";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"fFrac = 0;\n\telse \n\t\t";
-    ss<<"fFrac = (int)(";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss<<");\n\t";
+    GenerateArg( "dollar", 0, vSubArguments, ss );
+    GenerateArg( "fFrac", 1, vSubArguments, ss );
+    ss <<"fFrac = (int)fFrac;\n\t";
     ss << "tmp = modf( dollar , &fInt );\n\t";
     ss << "tmp /= fFrac;\n\t";
     ss << "tmp *= pow( 10.0 , ceil( log10(fFrac ) ) );\n\t";
@@ -180,39 +78,15 @@ void OpDollarde::GenSlidingWindowFunction(
 void OpDollarfr::GenSlidingWindowFunction(outputstream &ss,
         const std::string &sSymName, SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 2, 2 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n\t";
     ss << "double tmp = " << GetBottom() <<";\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
     ss << "double fInt = " << GetBottom() <<";\n\t";
-    ss << "double dollar;\n\t";
-    ss << "double fFrac;\n\t";
-    FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur0);
-    FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur1);
-    ss<< "int buffer_dollar_len = ";
-    ss<< tmpCurDVR0->GetArrayLength();
-    ss << ";\n\t";
-    ss<< "int buffer_frac_len = ";
-    ss<< tmpCurDVR1->GetArrayLength();
-    ss << ";\n\t";
-    ss<<"if((gid0)>=buffer_dollar_len || isnan(";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"dollar = 0;\n\telse \n\t\t";
-    ss<<"dollar = ";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-    ss<<"if((gid0)>=buffer_frac_len || isnan(";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"fFrac = 0;\n\telse \n\t\t";
-    ss<<"fFrac = (int)(";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss<<");\n\t";
+    GenerateArg( "dollar", 0, vSubArguments, ss );
+    GenerateArg( "fFrac", 1, vSubArguments, ss );
+    ss <<"fFrac = (int)fFrac;\n\t";
     ss << "tmp = modf( dollar , &fInt );\n\t";
     ss << "tmp *= fFrac;\n\t";
     ss << "tmp *= pow( 10.0 , -ceil( log10(fFrac ) ) );\n\t";
@@ -233,46 +107,16 @@ void OpDISC::BinInlineFun(std::set<std::string>& decls,
 void OpDISC::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 5, 5 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n\t";
     ss << "    double tmp = " << GetBottom() << ";\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    double arg0 = " << GetBottom() << ";\n";
-    ss << "    double arg1 = " << GetBottom() << ";\n";
-    ss << "    double arg2 = " << GetBottom() << ";\n";
-    ss << "    double arg3 = " << GetBottom() << ";\n";
-    ss << "    double arg4 = " << GetBottom() << ";\n";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        FormulaToken* pCur = vSubArguments[i]->GetFormulaToken();
-        assert(pCur);
-        if (pCur->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken* pSVR =
-                static_cast< const formula::SingleVectorRefToken* >(pCur);
-            ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-        }
-        else if (pCur->GetType() == formula::svDouble)
-        {
-            ss << "    {\n";
-        }
-        if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
-        {
-            ss << "        if (isnan(";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss << "))\n";
-            ss << "            arg" << i << " = 0;\n";
-            ss << "        else\n";
-            ss << "            arg" << i << " = ";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-            ss << "    }\n";
-        }
-        else
-        {
-            ss << "    arg" << i << " = ";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-        }
-    }
+    GenerateArg( 0, vSubArguments, ss );
+    GenerateArg( 1, vSubArguments, ss );
+    GenerateArg( 2, vSubArguments, ss );
+    GenerateArg( 3, vSubArguments, ss );
+    GenerateArg( 4, vSubArguments, ss );
     ss << "    int nNullDate = 693594;\n";
     ss << "    tmp = 1.0 - arg2 / arg3;\n";
     ss << "    tmp /=";
@@ -297,46 +141,16 @@ void OpINTRATE::BinInlineFun(std::set<std::string>& decls,
 void OpINTRATE::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 5, 5 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    double arg0 = " << GetBottom() << ";\n";
-    ss << "    double arg1 = " << GetBottom() << ";\n";
-    ss << "    double arg2 = " << GetBottom() << ";\n";
-    ss << "    double arg3 = " << GetBottom() << ";\n";
-    ss << "    double arg4 = " << GetBottom() << ";\n";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        FormulaToken* pCur = vSubArguments[i]->GetFormulaToken();
-        assert(pCur);
-        if (pCur->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken* pSVR =
-                static_cast< const formula::SingleVectorRefToken* >(pCur);
-            ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-        }
-        else if (pCur->GetType() == formula::svDouble)
-        {
-            ss << "    {\n";
-        }
-        if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
-        {
-            ss << "        if (isnan(";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss << "))\n";
-            ss << "            arg" << i << " = 0;\n";
-            ss << "        else\n";
-            ss << "            arg" << i << " = ";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-            ss << "    }\n";
-        }
-        else
-        {
-            ss << "    arg" << i << " = ";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-        }
-    }
+    GenerateArg( 0, vSubArguments, ss );
+    GenerateArg( 1, vSubArguments, ss );
+    GenerateArg( 2, vSubArguments, ss );
+    GenerateArg( 3, vSubArguments, ss );
+    GenerateArg( 4, vSubArguments, ss );
     ss << "    int nNullDate = GetNullDate();\n";
     ss << "    tmp = ((arg3 / arg2) - 1) / GetYearDiff_new(nNullDate, 
(int)arg0,";
     ss << "             (int)arg1,(int)arg4);\n";
@@ -354,34 +168,16 @@ void OpFV::BinInlineFun(std::set<std::string>& decls,
 void OpFV::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 5, 5 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    double arg0 = " << GetBottom() << ";\n";
-    ss << "    double arg1 = " << GetBottom() << ";\n";
-    ss << "    double arg2 = " << GetBottom() << ";\n";
-    ss << "    double arg3 = " << GetBottom() << ";\n";
-    ss << "    double arg4 = " << GetBottom() << ";\n";
-    unsigned j = vSubArguments.size();
-    while (j--)
-    {
-        FormulaToken* pCur = vSubArguments[j]->GetFormulaToken();
-        assert(pCur);
-        if(pCur->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken* pSVR =
-            static_cast< const formula::SingleVectorRefToken* >(pCur);
-            ss << "    if(gid0 >= " << pSVR->GetArrayLength() << " || isnan(";
-            ss << vSubArguments[j]->GenSlidingWindowDeclRef();
-            ss << "))\n";
-            ss << "        arg" << j << " = " <<GetBottom() << ";\n";
-            ss << "    else\n";
-            ss << "        arg" << j << " = ";
-            ss << vSubArguments[j]->GenSlidingWindowDeclRef();
-            ss << ";\n";
-        }
-    }
+    GenerateArg( 0, vSubArguments, ss );
+    GenerateArg( 1, vSubArguments, ss );
+    GenerateArg( 2, vSubArguments, ss );
+    GenerateArg( 3, vSubArguments, ss );
+    GenerateArg( 4, vSubArguments, ss );
     ss << "    tmp = GetFV(arg0, arg1, arg2, arg3, arg4);\n";
     ss << "    return tmp;\n";
     ss << "}";
@@ -397,35 +193,17 @@ void OpIPMT::BinInlineFun(std::set<std::string>& decls,
 void OpIPMT::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 6, 6 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    double arg0 = " << GetBottom() << ";\n";
-    ss << "    double arg1 = " << GetBottom() << ";\n";
-    ss << "    double arg2 = " << GetBottom() << ";\n";
-    ss << "    double arg3 = " << GetBottom() << ";\n";
-    ss << "    double arg4 = " << GetBottom() << ";\n";
-    ss << "    double arg5 = " << GetBottom() << ";\n";
-    unsigned j = vSubArguments.size();
-    while (j--)
-    {
-        FormulaToken* pCur = vSubArguments[j]->GetFormulaToken();
-        assert(pCur);
-        if(pCur->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken* pSVR =
-            static_cast< const formula::SingleVectorRefToken* >(pCur);
-            ss << "    if(gid0 >= " << pSVR->GetArrayLength() << " || isnan(";
-            ss << vSubArguments[j]->GenSlidingWindowDeclRef();
-            ss << "))\n";
-            ss << "        arg" << j << " = " <<GetBottom() << ";\n";
-            ss << "    else\n";
-            ss << "        arg" << j << " = ";
-            ss << vSubArguments[j]->GenSlidingWindowDeclRef();
-            ss << ";\n";
-        }
-    }
+    GenerateArg( 0, vSubArguments, ss );
+    GenerateArg( 1, vSubArguments, ss );
+    GenerateArg( 2, vSubArguments, ss );
+    GenerateArg( 3, vSubArguments, ss );
+    GenerateArg( 4, vSubArguments, ss );
+    GenerateArg( 5, vSubArguments, ss );
     ss << "    double pmt ;\n";
     ss << "    if(arg0 == 0.0)\n";
     ss << "        return 0;\n";
@@ -463,41 +241,10 @@ void OpISPMT::GenSlidingWindowFunction(outputstream& ss,
     ss << "{\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    double arg0 = " << GetBottom() << ";\n";
-    ss << "    double arg1 = " << GetBottom() << ";\n";
-    ss << "    double arg2 = " << GetBottom() << ";\n";
-    ss << "    double arg3 = " << GetBottom() << ";\n";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        FormulaToken* pCur = vSubArguments[i]->GetFormulaToken();
-        assert(pCur);
-        if (pCur->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken* pSVR =
-                static_cast< const formula::SingleVectorRefToken* >(pCur);
-            ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-        }
-        else if (pCur->GetType() == formula::svDouble)
-        {
-            ss << "    {\n";
-        }
-        if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
-        {
-            ss << "        if (isnan(";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss << "))\n";
-            ss << "            arg" << i << " = 0;\n";
-            ss << "        else\n";
-            ss << "            arg" << i << " = ";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-            ss << "    }\n";
-        }
-        else
-        {
-            ss << "    arg" << i << " = ";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-        }
-    }
+    GenerateArg( 0, vSubArguments, ss );
+    GenerateArg( 1, vSubArguments, ss );
+    GenerateArg( 2, vSubArguments, ss );
+    GenerateArg( 3, vSubArguments, ss );
     ss << "    tmp = arg3 * arg0 * ( arg1 - arg2) / arg2;\n";
     ss << "    return tmp;\n";
     ss << "}";
@@ -506,45 +253,17 @@ void OpISPMT::GenSlidingWindowFunction(outputstream& ss,
 void OpPDuration::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 3, 3 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    double arg0 = " << GetBottom() << ";\n";
-    ss << "    double arg1 = " << GetBottom() << ";\n";
-    ss << "    double arg2 = " << GetBottom() << ";\n";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        FormulaToken* pCur = vSubArguments[i]->GetFormulaToken();
-        assert(pCur);
-        if (pCur->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken* pSVR =
-                static_cast< const formula::SingleVectorRefToken* >(pCur);
-            ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-        }
-        else if (pCur->GetType() == formula::svDouble)
-        {
-            ss << "    {\n";
-        }
-        if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
-        {
-            ss << "        if (isnan(";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss << "))\n";
-            ss << "            arg" << i << " = 0;\n";
-            ss << "        else\n";
-            ss << "            arg" << i << " = ";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-            ss << "    }\n";
-        }
-        else
-        {
-            ss << "    arg" << i << " = ";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-        }
-    }
-    ss << "    tmp = log(arg2 / arg1) / log(arg0 + 1.0);\n";
+    GenerateArg( 0, vSubArguments, ss );
+    GenerateArg( 1, vSubArguments, ss );
+    GenerateArg( 2, vSubArguments, ss );
+    ss << "    if ( arg0 <= 0.0 || arg1 <= 0.0 || arg2 <= 0.0 )\n";
+    ss << "         return CreateDoubleError(IllegalArgument);\n";
+    ss << "    tmp = log(arg2 / arg1) / log1p(arg0);\n";
     ss << "    return tmp;\n";
     ss << "}";
 }
@@ -565,35 +284,17 @@ void OpDuration_ADD::BinInlineFun(std::set<std::string>& 
decls,
 void OpDuration_ADD::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 6, 6 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    double arg0 = " << GetBottom() << ";\n";
-    ss << "    double arg1 = " << GetBottom() << ";\n";
-    ss << "    double arg2 = " << GetBottom() << ";\n";
-    ss << "    double arg3 = " << GetBottom() << ";\n";
-    ss << "    double arg4 = " << GetBottom() << ";\n";
-    ss << "    double arg5 = " << GetBottom() << ";\n";
-    unsigned j = vSubArguments.size();
-    while (j--)
-    {
-        FormulaToken* pCur = vSubArguments[j]->GetFormulaToken();
-        assert(pCur);
-        if(pCur->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken* pSVR =
-                static_cast< const formula::SingleVectorRefToken* >(pCur);
-            ss << "    if(gid0 >= " << pSVR->GetArrayLength() << " || isnan(";
-            ss << vSubArguments[j]->GenSlidingWindowDeclRef();
-            ss << "))\n";
-            ss << "        arg" << j << " = " <<GetBottom() << ";\n";
-            ss << "    else\n";
-            ss << "        arg" << j << " = ";
-            ss << vSubArguments[j]->GenSlidingWindowDeclRef();
-            ss << ";\n";
-        }
-    }
+    GenerateArg( 0, vSubArguments, ss );
+    GenerateArg( 1, vSubArguments, ss );
+    GenerateArg( 2, vSubArguments, ss );
+    GenerateArg( 3, vSubArguments, ss );
+    GenerateArg( 4, vSubArguments, ss );
+    GenerateArg( 5, vSubArguments, ss );
     ss << "    int nNullDate = GetNullDate();\n";
     ss << "    tmp = GetDuration( nNullDate, (int)arg0, (int)arg1, arg2,";
     ss << " arg3, (int)arg4, (int)arg5);\n";
@@ -618,47 +319,17 @@ void OpMDuration::BinInlineFun(std::set<std::string>& 
decls,
 void OpMDuration::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 6, 6 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    double arg0 = " << GetBottom() << ";\n";
-    ss << "    double arg1 = " << GetBottom() << ";\n";
-    ss << "    double arg2 = " << GetBottom() << ";\n";
-    ss << "    double arg3 = " << GetBottom() << ";\n";
-    ss << "    double arg4 = " << GetBottom() << ";\n";
-    ss << "    double arg5 = " << GetBottom() << ";\n";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        FormulaToken* pCur = vSubArguments[i]->GetFormulaToken();
-        assert(pCur);
-        if (pCur->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken* pSVR =
-                static_cast< const formula::SingleVectorRefToken* >(pCur);
-            ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-        }
-        else if (pCur->GetType() == formula::svDouble)
-        {
-            ss << "    {\n";
-        }
-        if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
-        {
-            ss << "        if (isnan(";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss << "))\n";
-            ss << "            arg" << i << " = 0;\n";
-            ss << "        else\n";
-            ss << "            arg" << i << " = ";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-            ss << "    }\n";
-        }
-        else
-        {
-            ss << "    arg" << i << " = ";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-        }
-    }
+    GenerateArg( 0, vSubArguments, ss );
+    GenerateArg( 1, vSubArguments, ss );
+    GenerateArg( 2, vSubArguments, ss );
+    GenerateArg( 3, vSubArguments, ss );
+    GenerateArg( 4, vSubArguments, ss );
+    GenerateArg( 5, vSubArguments, ss );
     ss << "    int nNullDate = 693594;\n";
     ss << "    tmp = GetDuration_new( nNullDate, (int)arg0, (int)arg1, arg2,";
     ss << " arg3, (int)arg4, (int)arg5);\n";
@@ -712,84 +383,16 @@ vSubArguments)
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    double fRate,fVal;\n";
-    ss << "    int nStartPer,nEndPer,nNumPeriods,nPayType;\n";
-    FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
-    FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
-    FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
-    if(tmpCur0->GetType() == formula::svSingleVectorRef)
-    {
-        const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur0);
-        ss <<"    if(gid0 >= "<<tmpCurDVR0->GetArrayLength()<<" || isnan(";
-        ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
-        ss <<"))\n";
-        ss <<"        fRate = 0;\n    else\n";
-    }
-    ss <<"        fRate = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur1->GetType() == formula::svSingleVectorRef)
-    {
-        const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur1);
-        ss <<"    if(gid0 >= "<<tmpCurDVR1->GetArrayLength()<<" || isnan(";
-        ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
-        ss <<"))\n";
-        ss <<"        nNumPeriods = 0;\n    else\n";
-    }
-    ss <<"        nNumPeriods = (int)";
-    ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur2->GetType() == formula::svSingleVectorRef)
-    {
-        const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur2);
-        ss <<"    if(gid0 >= "<<tmpCurDVR2->GetArrayLength()<<" || isnan(";
-        ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
-        ss <<"))\n";
-        ss <<"        fVal  = 0;\n    else\n";
-    }
-    ss <<"        fVal = "<<vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur3->GetType() == formula::svSingleVectorRef)
-    {
-        const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur3);
-        ss <<"    if(gid0 >= "<<tmpCurDVR3->GetArrayLength()<<" || isnan(";
-        ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
-        ss <<"))\n";
-        ss <<"        nStartPer = 0;\n    else\n";
-    }
-    ss <<"        nStartPer = (int)";
-    ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur4->GetType() == formula::svSingleVectorRef)
-    {
-        const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur4);
-        ss <<"    if(gid0 >= "<<tmpCurDVR4->GetArrayLength()<<" || isnan(";
-        ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
-        ss <<"))\n";
-        ss <<"        nEndPer = 0;\n    else\n";
-    }
-    ss <<"        nEndPer = (int)";
-    ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-
-    if(tmpCur5->GetType() == formula::svSingleVectorRef)
-    {
-        const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur5);
-        ss <<"    if(gid0 >= "<<tmpCurDVR5->GetArrayLength()<<" || isnan(";
-        ss <<vSubArguments[5]->GenSlidingWindowDeclRef();
-        ss <<"))\n";
-        ss <<"        nPayType = 0;\n    else\n";
-    }
-    ss <<"    nPayType = (int)"<<vSubArguments[5]->GenSlidingWindowDeclRef();
-    ss <<";\n";
+    GenerateArg( "fRate", 0, vSubArguments, ss );
+    GenerateArg( "fNumPeriouds", 1, vSubArguments, ss );
+    GenerateArg( "fVal", 2, vSubArguments, ss );
+    GenerateArg( "fStartPer", 3, vSubArguments, ss );
+    GenerateArg( "fEndPer", 4, vSubArguments, ss );
+    GenerateArg( "fPayType", 5, vSubArguments, ss );
+    ss << "    int nNumPeriods = (int)fNumPeriods;\n";
+    ss << "    int nStartPer = (int)fStartPer;\n";
+    ss << "    int nEndPer = (int)fEndPer;\n";
+    ss << "    int nPayType = (int)fPayType;\n";
     ss <<"    double fPmt;\n";
     ss <<"    fPmt = GetPMT_new( fRate, nNumPeriods, fVal, 0.0, nPayType );\n";
     ss <<"    double tmp = 0.0;\n";
@@ -970,6 +573,7 @@ void IRR::GenSlidingWindowFunction(outputstream &ss,
 void XNPV::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 3, 3 );
     FormulaToken *pCur = vSubArguments[1]->GetFormulaToken();
     assert(pCur);
     const formula::DoubleVectorRefToken* pCurDVR =
@@ -1059,7 +663,7 @@ void XNPV::GenSlidingWindowFunction(
     ss <<  "}";
 }
 
- void PriceMat::BinInlineFun(std::set<std::string>& decls,
+void PriceMat::BinInlineFun(std::set<std::string>& decls,
     std::set<std::string>& funs)
 {
     decls.insert(GetYearFracDecl);decls.insert(GetNullDateDecl);
@@ -1073,97 +677,23 @@ void XNPV::GenSlidingWindowFunction(
 void PriceMat::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
-    CHECK_PARAMETER_COUNT( 6, 6 );
+    CHECK_PARAMETER_COUNT( 5, 6 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
     ss << "double result=0;\n\t";
-    ss<< "int nNullDate = GetNullDate( );\n\t";
-    ss <<"int settle;\n\t";
-    ss <<"int mat;\n\t";
-    ss <<"int issue;\n\t";
-    ss <<"double rate;\n\t";
-    ss <<"double yield;\n\t";
-    ss <<"int  nBase;\n\t";
-    FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur0);
-    FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur1);
-    FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur2);
-    FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur3);
-    FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur4);
-    FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur5);
-
-    ss<< "int buffer_settle_len = ";
-    ss<< tmpCurDVR0->GetArrayLength();
-    ss << ";\n\t";
-    ss<< "int buffer_mat_len = ";
-    ss<< tmpCurDVR1->GetArrayLength();
-    ss << ";\n\t";
-    ss<< "int buffer_issue_len = ";
-    ss<< tmpCurDVR2->GetArrayLength();
-    ss << ";\n\t";
-    ss<< "int buffer_rate_len = ";
-    ss<< tmpCurDVR3->GetArrayLength();
-    ss << ";\n\t";
-    ss<< "int buffer_yield_len = ";
-    ss<< tmpCurDVR4->GetArrayLength();
-    ss << ";\n\t";
-    ss<< "int buffer_base_len = ";
-    ss<< tmpCurDVR5->GetArrayLength();
-    ss << ";\n\t";
-    ss<<"if(gid0>=buffer_settle_len || isnan(";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"settle = 0;\n\telse \n\t\t";
-    ss<<"settle = ";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-    ss<<"if(gid0>=buffer_mat_len || isnan(";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"mat = 0;\n\telse \n\t\t";
-    ss<<"mat = ";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-    ss<<"if(gid0>=buffer_issue_len || isnan(";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"issue = 0;\n\telse \n\t\t";
-    ss<<"issue = ";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-    ss<<"if(gid0>=buffer_rate_len || isnan(";
-    ss << vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"rate = 0;\n\telse \n\t\t";
-    ss<<"rate = ";
-    ss << vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-    ss<<"if(gid0>=buffer_yield_len || isnan(";
-    ss << vSubArguments[4]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"yield = 0;\n\telse \n\t\t";
-    ss<<"yield = ";
-    ss << vSubArguments[4]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-    ss<<"if(gid0>=buffer_base_len || isnan(";
-    ss << vSubArguments[5]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"nBase = 0;\n\telse \n\t\t";
-    ss<<"nBase = ";
-    ss << vSubArguments[5]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
+    ss<< "int nNullDate = GetNullDate( );\n";
+    GenerateArg( "fSettle", 0, vSubArguments, ss );
+    GenerateArg( "fMat", 1, vSubArguments, ss );
+    GenerateArg( "fIssue", 2, vSubArguments, ss );
+    GenerateArg( "rate", 3, vSubArguments, ss );
+    GenerateArg( "yield", 4, vSubArguments, ss );
+    GenerateArgWithDefault( "fBase", 5, 0, vSubArguments, ss );
+    ss << "\t";
+    ss <<"int settle = fSettle;\n\t";
+    ss <<"int mat = fMat;\n\t";
+    ss <<"int issue = fIssue;\n\t";
+    ss <<"int nBase = fBase;\n\t";
     ss<< "double fIssMat = GetYearFrac( nNullDate, issue, mat, nBase);\n";
     ss<<"double fIssSet = GetYearFrac( nNullDate, issue, settle,nBase);\n";
     ss<<"double fSetMat = GetYearFrac( nNullDate, settle, mat, nBase);\n";
@@ -1178,73 +708,15 @@ void PriceMat::GenSlidingWindowFunction(
 void OpSYD::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 4, 4 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
+    GenerateArg( "cost", 0, vSubArguments, ss );
+    GenerateArg( "salvage", 1, vSubArguments, ss );
+    GenerateArg( "life", 2, vSubArguments, ss );
+    GenerateArg( "period", 3, vSubArguments, ss );
     ss << "    double result=0;\n";
-    ss << "    double cost;\n";
-    ss << "    double salvage;\n";
-    ss << "    double life;\n";
-    ss << "    double period;\n";
-    FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur0);
-
-    FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur1);
-
-    FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur2);
-
-    FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur3);
-
-    ss << "    int buffer_cost_len = ";
-    ss << tmpCurDVR0->GetArrayLength();
-    ss << ";\n";
-
-    ss << "    int buffer_salvage_len = ";
-    ss << tmpCurDVR1->GetArrayLength();
-    ss << ";\n";
-
-    ss << "    int buffer_life_len = ";
-    ss << tmpCurDVR2->GetArrayLength();
-    ss << ";\n";
-    ss << "    int buffer_period_len = ";
-    ss << tmpCurDVR3->GetArrayLength();
-    ss << ";\n";
-
-    ss <<"    if(gid0>=buffer_cost_len || isnan(";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<"))\n";
-    ss <<"        cost = 0;\n\telse \n";
-    ss <<"        cost = ";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    ss <<"    if(gid0>=buffer_salvage_len || isnan(";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss <<"))\n";
-    ss <<"        salvage = 0;\n\telse \n";
-    ss <<"        salvage = ";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    ss <<"    if(gid0>=buffer_life_len || isnan(";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<"))\n";
-    ss <<"        life = 0;\n\telse \n";
-    ss <<"        life = ";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    ss <<"    if(gid0>=buffer_period_len || isnan(";
-    ss << vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss <<"))\n";
-    ss <<"        period = 0;\n\telse \n";
-    ss <<"        period = ";
-    ss << vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss <<";\n";
     ss <<"    double tmpvalue = ((life*(life+1))/2.0);\n";
     ss <<"    result = ((cost-salvage)*(life-period+1)/tmpvalue);\n";
     ss <<"    return result;\n";
@@ -1322,43 +794,13 @@ void MIRR::GenSlidingWindowFunction(
 void OpEffective::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 2, 2 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    double tmp = " << GetBottom() <<";\n";
     ss << "    int gid0 = get_global_id(0);\n\t";
-    ss << "    double arg0 = " << GetBottom() << ";\n";
-    ss << "    double arg1 = " << GetBottom() << ";\n";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        FormulaToken* pCur = vSubArguments[i]->GetFormulaToken();
-        assert(pCur);
-        if (pCur->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken* pSVR =
-                static_cast< const formula::SingleVectorRefToken* >(pCur);
-            ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-        }
-        else if (pCur->GetType() == formula::svDouble)
-        {
-            ss << "    {\n";
-        }
-        if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
-        {
-            ss << "        if (isnan(";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss << "))\n";
-            ss << "            arg" << i << " = 0;\n";
-            ss << "        else\n";
-            ss << "            arg" << i << " = ";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-            ss << "    }\n";
-        }
-        else
-        {
-            ss << "    arg" << i << " = ";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-        }
-    }
+    GenerateArg( 0, vSubArguments, ss );
+    GenerateArg( 1, vSubArguments, ss );
     ss << "    tmp = pow(1.0 + arg0 / arg1, arg1)-1.0;\n";
     ss << "    return tmp;\n";
     ss << "}";
@@ -1379,62 +821,14 @@ void OpEffective::GenSlidingWindowFunction(outputstream& 
ss,
 void OpTbilleq::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 3, 3 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n\t";
     ss << "   int gid0 = get_global_id(0);\n";
     ss << "double tmp = 0;\n\t";
-    ss << "double tmp000;\n\t";
-    ss << "double tmp001;\n\t";
-    ss << "double tmp002;\n\t";
-
-    FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur0);
-
-    FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur1);
-
-    FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur2);
-
-    ss<< "int buffer_tmp000_len = ";
-    ss<< tmpCurDVR0->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<< "int buffer_tmp001_len = ";
-    ss<< tmpCurDVR1->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<< "int buffer_tmp002_len = ";
-    ss<< tmpCurDVR2->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<<"if(gid0>=buffer_tmp000_len || isnan(";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"tmp000 = 0;\n\telse \n\t\t";
-    ss<<"tmp000 = ";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-
-    ss<<"if(gid0>=buffer_tmp001_len || isnan(";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"tmp001 = 0;\n\telse \n\t\t";
-    ss<<"tmp001 = ";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-
-    ss<<"if(gid0>=buffer_tmp002_len || isnan(";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"tmp002 = 0;\n\telse \n\t\t";
-    ss<<"tmp002 = ";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-
+    GenerateArg( "tmp000", 0, vSubArguments, ss );
+    GenerateArg( "tmp001", 1, vSubArguments, ss );
+    GenerateArg( "tmp002", 2, vSubArguments, ss );
     ss<<"tmp001+=1.0;\n";
     ss<<"int   nDiff =GetDiffDate360(GetNullDate(),tmp000,tmp001,true);\n";
     ss<<"tmp =( 365 * tmp002 ) / ( 360 - ( tmp002 * ( nDiff ) ) );\n";
@@ -1455,85 +849,16 @@ void OpCumprinc::GenSlidingWindowFunction(outputstream 
&ss,
     ss << "{\n";
     ss << "    double tmp = " << GetBottom() <<";\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    double fRate,fVal;\n";
-    ss << "    int nStartPer,nEndPer,nNumPeriods,nPayType;\n";
-    FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
-    FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
-    FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
-    if(tmpCur0->GetType() == formula::svSingleVectorRef)
-    {
-        const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur0);
-        ss <<"    if(gid0 >= "<<tmpCurDVR0->GetArrayLength()<<" || isnan(";
-        ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
-        ss <<"))\n";
-        ss <<"        fRate = 0;\n    else\n";
-    }
-    ss <<"        fRate = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur1->GetType() == formula::svSingleVectorRef)
-    {
-        const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur1);
-        ss <<"    if(gid0 >= "<<tmpCurDVR1->GetArrayLength()<<" || isnan(";
-        ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
-        ss <<"))\n";
-        ss <<"        nNumPeriods = 0;\n    else\n";
-    }
-    ss <<"        nNumPeriods = (int)";
-    ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur2->GetType() == formula::svSingleVectorRef)
-    {
-        const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur2);
-        ss <<"    if(gid0 >= "<<tmpCurDVR2->GetArrayLength()<<" || isnan(";
-        ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
-        ss <<"))\n";
-        ss <<"        fVal  = 0;\n    else\n";
-    }
-    ss <<"        fVal = "<<vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur3->GetType() == formula::svSingleVectorRef)
-    {
-        const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur3);
-        ss <<"    if(gid0 >= "<<tmpCurDVR3->GetArrayLength()<<" || isnan(";
-        ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
-        ss <<"))\n";
-        ss <<"        nStartPer = 0;\n    else\n";
-    }
-    ss <<"        nStartPer = (int)";
-    ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur4->GetType() == formula::svSingleVectorRef)
-    {
-        const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur4);
-        ss <<"    if(gid0 >= "<<tmpCurDVR4->GetArrayLength()<<" || isnan(";
-        ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
-        ss <<"))\n";
-        ss <<"        nEndPer = 0;\n    else\n";
-    }
-    ss <<"        nEndPer = (int)";
-    ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-
-    if(tmpCur5->GetType() == formula::svSingleVectorRef)
-    {
-        const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur5);
-        ss <<"    if(gid0 >= "<<tmpCurDVR5->GetArrayLength()<<" || isnan(";
-        ss <<vSubArguments[5]->GenSlidingWindowDeclRef();
-        ss <<"))\n";
-        ss <<"        nPayType = 0;\n    else\n";
-    }
-    ss <<"        nPayType = (int)";
-    ss <<vSubArguments[5]->GenSlidingWindowDeclRef();
-    ss <<";\n";
+    GenerateArg( "fRate", 0, vSubArguments, ss );
+    GenerateArg( "fNumPeriouds", 1, vSubArguments, ss );
+    GenerateArg( "fVal", 2, vSubArguments, ss );
+    GenerateArg( "fStartPer", 3, vSubArguments, ss );
+    GenerateArg( "fEndPer", 4, vSubArguments, ss );
+    GenerateArg( "fPayType", 5, vSubArguments, ss );
+    ss << "    int nNumPeriods = (int)fNumPeriods;\n";
+    ss << "    int nStartPer = (int)fStartPer;\n";
+    ss << "    int nEndPer = (int)fEndPer;\n";
+    ss << "    int nPayType = (int)fPayType;\n";
     ss <<"    double fPmt;\n";
     ss <<"    fPmt = GetPMT_new( fRate, nNumPeriods,fVal,0.0,nPayType );\n";
     ss <<"    if(nStartPer == 1)\n";
@@ -1575,87 +900,18 @@ void OpAccrint::GenSlidingWindowFunction(
     ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double tmp = 0;\n";
-    ss << "    int nStartDate,nEndDate,mode,freq;\n";
+    GenerateArg( "fStartDate", 0, vSubArguments, ss );
+    // 1 is ignored
+    GenerateArg( "fEndDate", 2, vSubArguments, ss );
+    GenerateArg( "fRate", 3, vSubArguments, ss );
+    GenerateArg( "fVal", 4, vSubArguments, ss );
+    GenerateArg( "fFreq", 5, vSubArguments, ss );
+    GenerateArg( "fMode", 6, vSubArguments, ss );
+    ss << "    int nStartDate = fStartDate;\n";
+    ss << "    int nEndDate = fEndDate;\n";
+    ss << "    int mode = fMode;\n";
+    ss << "    int freq = fFreq;\n";
     ss << "    int nDays1stYear=0;\n";
-    ss << "    double fVal,fRate;\n";
-    FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur0);
-    FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur2);
-    FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur3);
-    FormulaToken* tmpCur4 = vSubArguments[4]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur4);
-    FormulaToken* tmpCur5 = vSubArguments[5]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur5);
-    FormulaToken* tmpCur6 = vSubArguments[6]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR6= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur6);
-    ss<< "    int buffer_nIssue_len = ";
-    ss<< tmpCurDVR0->GetArrayLength();
-    ss<< ";\n";
-    ss<< "    int buffer_nSettle_len = ";
-    ss<< tmpCurDVR2->GetArrayLength();
-    ss<< ";\n";
-    ss<< "    int buffer_fRate_len = ";
-    ss<< tmpCurDVR3->GetArrayLength();
-    ss<< ";\n";
-    ss<< "    int buffer_fVal_len = ";
-    ss<< tmpCurDVR4->GetArrayLength();
-    ss<< ";\n";
-    ss<< "    int buffer_nFreq_len = ";
-    ss<< tmpCurDVR5->GetArrayLength();
-    ss<< ";\n";
-    ss<< "    int buffer_nMode_len = ";
-    ss<< tmpCurDVR6->GetArrayLength();
-    ss << ";\n";
-    ss<<"    if(gid0 >= buffer_nIssue_len || isnan(";
-    ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<"))\n";
-    ss <<"        nStartDate = 0;\n    else\n";
-    ss <<"        nStartDate=(int)";
-    ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    ss <<"    if(gid0 >= buffer_nSettle_len || isnan(";
-    ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<"))\n";
-    ss <<"        nEndDate = 0;\n    else\n";
-    ss <<"        nEndDate=(int)";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss << ";\n";
-    ss <<"    if(gid0 >= buffer_fRate_len || isnan(";
-    ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss <<"))\n";
-    ss <<"        fRate = 0;\n    else\n";
-    ss <<"        fRate=";
-    ss << vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    ss <<"    if(gid0 >= buffer_fVal_len || isnan(";
-    ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
-    ss <<"))\n";
-    ss <<"        fVal = 0;\n    else\n";
-    ss <<"        fVal=";
-    ss << vSubArguments[4]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    ss <<"    if(gid0 >= buffer_nFreq_len || isnan(";
-    ss <<vSubArguments[5]->GenSlidingWindowDeclRef();
-    ss <<"))\n";
-    ss <<"        freq = 0;\n    else\n";
-    ss <<"        freq= (int)";
-    ss << vSubArguments[5]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    ss <<"    if(gid0 >= buffer_nMode_len || isnan(";
-    ss <<vSubArguments[6]->GenSlidingWindowDeclRef();
-    ss <<"))\n";
-    ss <<"        mode = 0;\n    else\n";
-    ss <<"        mode = (int)";
-    ss << vSubArguments[6]->GenSlidingWindowDeclRef();
-    ss <<";\n";
     ss <<"    int nNullDate=GetNullDate();\n";
     ss <<"    int nTotalDays = GetDiffDate(nNullDate,nStartDate,";
     ss <<"nEndDate, mode,&nDays1stYear);\n";
@@ -1683,81 +939,15 @@ void OpAccrintm::GenSlidingWindowFunction(
     ss << "{\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
     ss << "double tmp = " << GetBottom() <<";\n\t";
-    ss << "int nStartDate,nEndDate,mode;\n\t";
-    ss << "double fRate,fVal;\n\t";
-    FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur0);
-    FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur1);
-
-    FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur2);
-
-    FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur3);
-
-    FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur4);
-    ss<< "int buffer_nIssue_len = ";
-    ss<< tmpCurDVR0->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<< "int buffer_nSettle_len = ";
-    ss<< tmpCurDVR1->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<< "int buffer_fRate_len = ";
-    ss<< tmpCurDVR2->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<< "int buffer_fVal_len = ";
-    ss<< tmpCurDVR3->GetArrayLength();
-    ss << ";\n\t";
 
-    ss<< "int buffer_nMode_len = ";
-    ss<< tmpCurDVR4->GetArrayLength();
-    ss << ";\n\t";
-    ss <<"if(gid0 >= buffer_nIssue_len || isnan(";
-    ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<"))\n\t\t";
-    ss <<"nStartDate = 0;\n\telse\n\t\t";
-    ss << "nStartDate=(int)";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<";\n\t";
-    ss <<"if(gid0 >= buffer_nSettle_len || isnan(";
-    ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss <<"))\n\t\t";
-    ss <<"nEndDate = 0;\n\telse\n\t\t";
-    ss << "nEndDate=(int)";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss << ";\n\t";
-
-    ss <<"if(gid0 >= buffer_fRate_len || isnan(";
-    ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<"))\n\t\t";
-    ss <<"fRate = 0;\n\telse\n\t\t";
-    ss << "fRate=";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<";\n\t";
-    ss <<"if(gid0 >= buffer_fVal_len || isnan(";
-    ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss <<"))\n\t\t";
-    ss <<"fVal = 0;\n\telse\n\t\t";
-    ss << "fVal=";
-    ss << vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss << ";\n\t";
-    ss <<"if(gid0 >= buffer_nMode_len || isnan(";
-    ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
-    ss <<"))\n\t\t";
-    ss <<"mode = 0;\n\telse\n\t\t";
-    ss << "mode = (int)";
-    ss << vSubArguments[4]->GenSlidingWindowDeclRef();
-    ss << ";\n\t";
+    GenerateArg( "fStartDate", 0, vSubArguments, ss );
+    GenerateArg( "fEndDate", 1, vSubArguments, ss );
+    GenerateArg( "fRate", 2, vSubArguments, ss );
+    GenerateArg( "fVal", 3, vSubArguments, ss );
+    GenerateArg( "fMode", 4, vSubArguments, ss );
+    ss << "    int nStartDate = fStartDate;\n";
+    ss << "    int nEndDate = fEndDate;\n";
+    ss << "    int mode = fMode;\n";
     ss <<"int nDays1stYear=0;\n\t";
     ss <<"int nNullDate=GetNullDate();\n\t";
     ss <<"int nTotalDays = GetDiffDate(nNullDate,nStartDate,";
@@ -1804,126 +994,13 @@ void OpYield::GenSlidingWindowFunction(
     ss << "{\n\t";
     ss << "double tmp = 0;\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
-    ss << "double tmp000;\n\t";
-    ss << "double tmp001;\n\t";
-    ss << "double tmp002;\n\t";
-    ss << "double tmp003;\n\t";
-    ss << "double tmp004;\n\t";
-    ss << "double tmp005;\n\t";
-    ss << "double tmp006;\n\t";
-
-    FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur0);
-
-    FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur1);
-
-    FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur2);
-
-    FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur3);
-
-    FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur4);
-
-    FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur5);
-
-    FormulaToken *tmpCur6 = vSubArguments[6]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR6= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur6);
-
-    ss<< "int buffer_tmp000_len = ";
-    ss<< tmpCurDVR0->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<< "int buffer_tmp001_len = ";
-    ss<< tmpCurDVR1->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<< "int buffer_tmp002_len = ";
-    ss<< tmpCurDVR2->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<< "int buffer_tmp003_len = ";
-    ss<< tmpCurDVR3->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<< "int buffer_tmp004_len = ";
-    ss<< tmpCurDVR4->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<< "int buffer_tmp005_len = ";
-    ss<< tmpCurDVR5->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<< "int buffer_tmp006_len = ";
-    ss<< tmpCurDVR6->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<<"if(gid0>=buffer_tmp000_len || isnan(";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"tmp000 = 0;\n\telse \n\t\t";
-    ss<<"tmp000 = ";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-
-    ss<<"if(gid0>=buffer_tmp001_len || isnan(";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"tmp001 = 0;\n\telse \n\t\t";
-    ss<<"tmp001 = ";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-
-    ss<<"if(gid0>=buffer_tmp002_len || isnan(";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"tmp002 = 0;\n\telse \n\t\t";
-    ss<<"tmp002 = ";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-
-    ss<<"if(gid0>=buffer_tmp003_len || isnan(";
-    ss << vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"tmp003 = 0;\n\telse \n\t\t";
-    ss<<"tmp003 = ";
-    ss << vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-
-    ss<<"if(gid0>=buffer_tmp004_len || isnan(";
-    ss << vSubArguments[4]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"tmp004 = 0;\n\telse \n\t\t";
-    ss<<"tmp004 = ";
-    ss << vSubArguments[4]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-
-    ss<<"if(gid0>=buffer_tmp005_len || isnan(";
-    ss << vSubArguments[5]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"tmp005 = 0;\n\telse \n\t\t";
-    ss<<"tmp005 = ";
-    ss << vSubArguments[5]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-
-    ss<<"if(gid0>=buffer_tmp006_len || isnan(";
-    ss << vSubArguments[6]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"tmp006 = 0;\n\telse \n\t\t";
-    ss<<"tmp006 = ";
-    ss << vSubArguments[6]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-
+    GenerateArg( "tmp000", 0, vSubArguments, ss );
+    GenerateArg( "tmp001", 1, vSubArguments, ss );
+    GenerateArg( "tmp002", 2, vSubArguments, ss );
+    GenerateArg( "tmp003", 3, vSubArguments, ss );
+    GenerateArg( "tmp004", 4, vSubArguments, ss );
+    GenerateArg( "tmp005", 5, vSubArguments, ss );
+    GenerateArg( "tmp006", 6, vSubArguments, ss );
     ss << "tmp = getYield_(";
     ss << 
"GetNullDate(),tmp000,tmp001,tmp002,tmp003,tmp004,tmp005,tmp006);\n\t ";
     ss << "return tmp;\n";
@@ -1933,53 +1010,14 @@ void OpYield::GenSlidingWindowFunction(
 void OpSLN::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 3, 3 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    double tmp = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    double cost;\n";
-    ss << "    double salvage;\n";
-    ss << "    double life;\n";
-
-    FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR0=
-        static_cast<const formula::SingleVectorRefToken *>(tmpCur0);
-    FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR1=
-        static_cast<const formula::SingleVectorRefToken *>(tmpCur1);
-    FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR2=
-        static_cast<const formula::SingleVectorRefToken *>(tmpCur2);
-    ss<< "    int buffer_cost_len = ";
-    ss<< tmpCurDVR0->GetArrayLength();
-    ss << ";\n";
-    ss<< "    int buffer_salvage_len = ";
-    ss<< tmpCurDVR1->GetArrayLength();
-    ss << ";\n";
-    ss<< "    int buffer_life_len = ";
-    ss<< tmpCurDVR2->GetArrayLength();
-    ss << ";\n";
-    ss<<"    if(gid0>=buffer_cost_len || isnan(";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss<<"))\n";
-    ss<<"        cost = 0;\n\telse \n";
-    ss<<"        cost = ";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss<<";\n";
-    ss<<"    if(gid0>=buffer_salvage_len || isnan(";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss<<"))\n";
-    ss<<"        salvage = 0;\n\telse \n";
-    ss<<"        salvage = ";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss<<";\n";
-    ss<<"    if(gid0>=buffer_life_len || isnan(";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss<<"))\n";
-    ss<<"        life = 0;\n\telse \n";
-    ss<<"        life = ";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss<<";\n";
+    GenerateArg( "cost", 0, vSubArguments, ss );
+    GenerateArg( "salvage", 1, vSubArguments, ss );
+    GenerateArg( "life", 2, vSubArguments, ss );
     ss << "    tmp = (cost-salvage)/life;\n";
     ss << "    return tmp;\n";
     ss << "}";
@@ -2007,109 +1045,12 @@ void OpYieldmat::GenSlidingWindowFunction(
     ss << "{\n\t";
     ss << "double tmp = 0;\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
-    ss << "double tmp000;\n\t";
-    ss << "double tmp001;\n\t";
-    ss << "double tmp002;\n\t";
-    ss << "double tmp003;\n\t";
-    ss << "double tmp004;\n\t";
-    ss << "double tmp005;\n\t";
-
-    FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur0);
-
-    FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur1);
-
-    FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur2);
-
-    FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur3);
-
-    FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur4);
-
-    FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
-    const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur5);
-
-    ss<< "int buffer_tmp000_len = ";
-    ss<< tmpCurDVR0->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<< "int buffer_tmp001_len = ";
-    ss<< tmpCurDVR1->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<< "int buffer_tmp002_len = ";
-    ss<< tmpCurDVR2->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<< "int buffer_tmp003_len = ";
-    ss<< tmpCurDVR3->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<< "int buffer_tmp004_len = ";
-    ss<< tmpCurDVR4->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<< "int buffer_tmp005_len = ";
-    ss<< tmpCurDVR5->GetArrayLength();
-    ss << ";\n\t";
-
-    ss<<"if(gid0>=buffer_tmp000_len || isnan(";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"tmp000 = 0;\n\telse \n\t\t";
-    ss<<"tmp000 = ";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-
-    ss<<"if(gid0>=buffer_tmp001_len || isnan(";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"tmp001 = 0;\n\telse \n\t\t";
-    ss<<"tmp001 = ";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-
-    ss<<"if(gid0>=buffer_tmp002_len || isnan(";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"tmp002 = 0;\n\telse \n\t\t";
-    ss<<"tmp002 = ";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-
-    ss<<"if(gid0>=buffer_tmp003_len || isnan(";
-    ss << vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"tmp003 = 0;\n\telse \n\t\t";
-    ss<<"tmp003 = ";
-    ss << vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-
-    ss<<"if(gid0>=buffer_tmp004_len || isnan(";
-    ss << vSubArguments[4]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"tmp004 = 0;\n\telse \n\t\t";
-    ss<<"tmp004 = ";
-    ss << vSubArguments[4]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-
-    ss<<"if(gid0>=buffer_tmp005_len || isnan(";
-    ss << vSubArguments[5]->GenSlidingWindowDeclRef();
-    ss<<"))\n\t\t";
-    ss<<"tmp005 = 0;\n\telse \n\t\t";
-    ss<<"tmp005 = ";
-    ss << vSubArguments[5]->GenSlidingWindowDeclRef();
-    ss<<";\n\t";
-
+    GenerateArg( "tmp000", 0, vSubArguments, ss );
+    GenerateArg( "tmp001", 1, vSubArguments, ss );
+    GenerateArg( "tmp002", 2, vSubArguments, ss );
+    GenerateArg( "tmp003", 3, vSubArguments, ss );
+    GenerateArg( "tmp004", 4, vSubArguments, ss );
+    GenerateArg( "tmp005", 5, vSubArguments, ss );
     ss << "tmp = GetYieldmat(";
     ss<<"GetNullDate(),tmp000,tmp001,tmp002,tmp003,tmp004,tmp005);\n\t";
     ss << "return tmp;\n";
@@ -2119,46 +1060,16 @@ void OpYieldmat::GenSlidingWindowFunction(
 void OpPMT::GenSlidingWindowFunction(outputstream &ss,
         const std::string &sSymName, SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 3, 5 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss<<"    double tmp = 0;\n";
-    ss<<"    double temp=0.0;\n";
     ss<<"    int gid0 = get_global_id(0);\n";
-    ss<<"    double tmp0=0,tmp1=0,tmp2=0;\n";
-    ss<<"    double tmp3=0,tmp4=0;\n";
-    ss <<"\n    ";
-    //while (i-- > 1)
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
-        assert(pCur);
-        if (pCur->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken* pSVR =
-                static_cast< const formula::SingleVectorRefToken* >(pCur);
-            ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-        }
-        else if (pCur->GetType() == formula::svDouble)
-        {
-            ss << "{\n";
-        }
-
-        if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
-        {
-            ss <<"    temp="<<vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss <<";\n";
-            ss <<"    if (isnan(temp))\n";
-            ss <<"        tmp"<<i<<"= 0;\n";
-            ss <<"    else\n";
-            ss <<"        tmp"<<i<<"=temp;\n";
-            ss <<"    }\n";
-        }
-        else
-        {
-            ss <<"    
tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss <<";\n";
-        }
-    }
+    GenerateArg( "tmp0", 0, vSubArguments, ss );
+    GenerateArg( "tmp1", 1, vSubArguments, ss );
+    GenerateArg( "tmp2", 2, vSubArguments, ss );
+    GenerateArgWithDefault( "tmp3", 3, 0, vSubArguments, ss );
+    GenerateArgWithDefault( "tmp4", 4, 0, vSubArguments, ss );
     ss<<"    if(tmp0==0.0)\n";
     ss<<"        return -(tmp2+tmp3)/tmp1;\n";
     ss<<"    tmp-=tmp3;\n";
@@ -2172,14 +1083,13 @@ void OpPMT::GenSlidingWindowFunction(outputstream &ss,
 void OpNPV::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 2, 31 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    double tmp = 0.0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    int nCount = 1;\n";
-    ss << "    double arg0=";
-    ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<";\n";
+    GenerateArg( 0, vSubArguments, ss );
     //while (i-- > 1)
     for (size_t i = 1; i < vSubArguments.size(); i++)
     {
@@ -2295,50 +1205,18 @@ void OpNPV::GenSlidingWindowFunction(outputstream &ss,
 void OpPrice::GenSlidingWindowFunction(outputstream &ss,
           const std::string &sSymName, SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 6, 7 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss<<"    double tmp = 0;\n";
     ss<<"    int gid0 = get_global_id(0);\n";
-    ss<<"    double tmp0=0;\n";
-    ss<<"    double tmp1=0;\n";
-    ss<<"    double tmp2=0;\n";
-    ss<<"    double tmp3=0;\n";
-    ss<<"    double tmp4=0,tmp5=0;\n";
-    ss<<"    double tmp6=0;\n";
-    ss<<"\n";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
-        assert(pCur);
-        if (pCur->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken* pSVR =
-                static_cast< const formula::SingleVectorRefToken* >(pCur);
-            ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-        }
-        else if (pCur->GetType() == formula::svDouble)
-        {
-            ss << "{\n";
-        }
-
-        if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
-        {
-            ss << "        if (isnan(";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss << "))\n";
-            ss << "            tmp"<<i<<"= 0;\n";
-            ss << "        else\n";
-            ss << "            tmp"<<i<<"=";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss << ";\n    }\n";
-        }
-        else
-        {
-            ss << "        tmp"<<i<<"=";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss <<";\n";
-        }
-    }
+    GenerateArg( "tmp0", 0, vSubArguments, ss );
+    GenerateArg( "tmp1", 1, vSubArguments, ss );
+    GenerateArg( "tmp2", 2, vSubArguments, ss );
+    GenerateArg( "tmp3", 3, vSubArguments, ss );
+    GenerateArg( "tmp4", 4, vSubArguments, ss );
+    GenerateArg( "tmp5", 5, vSubArguments, ss );
+    GenerateArgWithDefault( "tmp6", 6, 0, vSubArguments, ss );
     ss << "    if(tmp4*tmp5 == 0) return NAN;\n";
     ss << "    tmp = getPrice_(tmp0,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);\n";
     ss << "    return tmp;\n";
@@ -2452,6 +1330,7 @@ void OpOddlyield::BinInlineFun(std::set<std::string>& 
decls,
 void OpOddlyield::GenSlidingWindowFunction(outputstream &ss,
           const std::string &sSymName, SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 8, 8 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss <<"    double tmp = 0;\n";
@@ -2478,142 +1357,18 @@ void 
OpOddlyield::GenSlidingWindowFunction(outputstream &ss,
             if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) {
                 ss << "gid0; i < " << pDVR->GetArrayLength();
                 ss << " && i < " << nCurWindowSize  << "; i++){\n";
-            } else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) {
-                ss << "0; i < " << pDVR->GetArrayLength();
-                ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n";
-            } else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){
-                ss << "0; i + gid0 < " << pDVR->GetArrayLength();
-                ss << " &&  i < "<< nCurWindowSize << "; i++){\n";
-            }
-            else {
-                ss << "0; i < "<< nCurWindowSize << "; i++){\n";
-            }
-        }
-        else if (pCur->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken* pSVR =
-            static_cast< const formula::SingleVectorRefToken* >(pCur);
-            ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-        }
-        else if (pCur->GetType() == formula::svDouble)
-        {
-            ss << "{\n";
-        }
-
-        if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
-        {
-            ss << "        if (isnan(";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss << "))\n";
-            ss << "            tmp"<<i<<"= 0;\n";
-            ss << "        else\n";
-            ss << "            tmp"<<i<<"=";
-            ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss << ";\n";
-            ss <<"    }\n";
-        }
-        else
-        {
-            ss << "        tmp"<<i<<"=";
-            ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss <<";\n";
-        }
-    }
-    ss <<"    int nNullDate = GetNullDate();\n";
-    ss <<"    tmp = GetOddlyield(nNullDate,tmp0,tmp1";
-    ss <<",tmp2,tmp3,tmp4,tmp5,tmp6,tmp7);\n";
-    ss <<"    return tmp;\n";
-    ss <<"}";
-}
-void OpPriceDisc::BinInlineFun(std::set<std::string>& decls,
-     std::set<std::string>& funs)
-{
-    decls.insert(GetYearDiffDecl);decls.insert(getDiffDecl);
-    decls.insert(getDaysInYearRangeDecl);decls.insert(GetDaysInYearDecl);
-    decls.insert(GetDaysInYearsDecl);decls.insert(getDaysInMonthRangeDecl);
-    decls.insert(addMonthsDecl);decls.insert(ScaDateDecl);
-    decls.insert(GetNullDateDecl);decls.insert(DateToDaysDecl);
-    decls.insert(DaysToDateDecl);decls.insert(DaysInMonthDecl);
-    decls.insert(IsLeapYearDecl);decls.insert(GetDiffDateDecl);
-    funs.insert(GetYearDiff);funs.insert(getDiff);
-    funs.insert(getDaysInYearRange);funs.insert(GetDaysInYear);
-    funs.insert(GetDaysInYears);funs.insert(getDaysInMonthRange);
-    funs.insert(addMonths);funs.insert(ScaDate);
-    funs.insert(GetNullDate);funs.insert(DateToDays);
-    funs.insert(DaysToDate);funs.insert(DaysInMonth);
-    funs.insert(IsLeapYear);funs.insert(GetDiffDate);
-}
-void OpPriceDisc::GenSlidingWindowFunction(outputstream &ss,
-          const std::string &sSymName, SubArguments &vSubArguments)
-{
-    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
-    ss << "{\n";
-    ss << "    double tmp = 0;\n";
-    ss << "    int gid0 = get_global_id(0);\n";
-    ss<<"    double tmp0=0;\n";
-    ss<<"    double tmp1=0;\n";
-    ss<<"    double tmp2=0;\n";
-    ss<<"    double tmp3=0;\n";
-    ss<<"    double tmp4=0;\n";
-    ss <<"    \n";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
-        assert(pCur);
-        if (pCur->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken* pSVR =
-            static_cast< const formula::SingleVectorRefToken* >(pCur);
-            ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-        }
-        else if (pCur->GetType() == formula::svDouble)
-        {
-            ss << "{\n";
-        }
-
-        if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
-        {
-            ss << "        if (isnan(";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss << "))\n";
-            ss << "            tmp"<<i<<"= 0;\n";
-            ss << "        else\n";
-            ss << "            tmp"<<i<<"=";
-            ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss << ";\n";
-            ss <<"    }\n";
-        }
-        else
-        {
-            ss << "        tmp"<<i<<"=";
-            ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss <<";\n";
-        }
-    }
-    ss <<"    int nNullDate = GetNullDate();\n";
-    ss <<"    tmp=tmp3* ( 1.0 -tmp2*GetYearDiff( nNullDate, ";
-    ss <<"tmp0,tmp1,tmp4));\n";
-    ss <<"    return tmp;\n";
-    ss <<"}";
-}
-void OpNper::GenSlidingWindowFunction(outputstream &ss,
-         const std::string &sSymName, SubArguments &vSubArguments)
- {
-    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
-    ss << "{\n";
-    ss << "    double tmp = 0;\n";
-    ss << "    int gid0 = get_global_id(0);\n";
-    ss <<"    double tmp0=0;\n";
-    ss <<"    double tmp1=0;\n";
-    ss <<"    double tmp2=0;\n";
-    ss <<"    double tmp3=0;\n";
-    ss <<"    double tmp4=0;\n";
-
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
-        assert(pCur);
-        if (pCur->GetType() == formula::svSingleVectorRef)
+            } else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) {
+                ss << "0; i < " << pDVR->GetArrayLength();
+                ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n";
+            } else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){
+                ss << "0; i + gid0 < " << pDVR->GetArrayLength();
+                ss << " &&  i < "<< nCurWindowSize << "; i++){\n";
+            }
+            else {
+                ss << "0; i < "<< nCurWindowSize << "; i++){\n";
+            }
+        }
+        else if (pCur->GetType() == formula::svSingleVectorRef)
         {
             const formula::SingleVectorRefToken* pSVR =
             static_cast< const formula::SingleVectorRefToken* >(pCur);
@@ -2643,6 +1398,62 @@ void OpNper::GenSlidingWindowFunction(outputstream &ss,
             ss <<";\n";
         }
     }
+    ss <<"    int nNullDate = GetNullDate();\n";
+    ss <<"    tmp = GetOddlyield(nNullDate,tmp0,tmp1";
+    ss <<",tmp2,tmp3,tmp4,tmp5,tmp6,tmp7);\n";
+    ss <<"    return tmp;\n";
+    ss <<"}";
+}
+void OpPriceDisc::BinInlineFun(std::set<std::string>& decls,
+     std::set<std::string>& funs)
+{
+    decls.insert(GetYearDiffDecl);decls.insert(getDiffDecl);
+    decls.insert(getDaysInYearRangeDecl);decls.insert(GetDaysInYearDecl);
+    decls.insert(GetDaysInYearsDecl);decls.insert(getDaysInMonthRangeDecl);
+    decls.insert(addMonthsDecl);decls.insert(ScaDateDecl);
+    decls.insert(GetNullDateDecl);decls.insert(DateToDaysDecl);
+    decls.insert(DaysToDateDecl);decls.insert(DaysInMonthDecl);
+    decls.insert(IsLeapYearDecl);decls.insert(GetDiffDateDecl);
+    funs.insert(GetYearDiff);funs.insert(getDiff);
+    funs.insert(getDaysInYearRange);funs.insert(GetDaysInYear);
+    funs.insert(GetDaysInYears);funs.insert(getDaysInMonthRange);
+    funs.insert(addMonths);funs.insert(ScaDate);
+    funs.insert(GetNullDate);funs.insert(DateToDays);
+    funs.insert(DaysToDate);funs.insert(DaysInMonth);
+    funs.insert(IsLeapYear);funs.insert(GetDiffDate);
+}
+void OpPriceDisc::GenSlidingWindowFunction(outputstream &ss,
+          const std::string &sSymName, SubArguments &vSubArguments)
+{
+    CHECK_PARAMETER_COUNT( 4, 5 );
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
+    ss << "    double tmp = 0;\n";
+    ss << "    int gid0 = get_global_id(0);\n";
+    GenerateArg( "tmp0", 0, vSubArguments, ss );
+    GenerateArg( "tmp1", 1, vSubArguments, ss );
+    GenerateArg( "tmp2", 2, vSubArguments, ss );
+    GenerateArg( "tmp3", 3, vSubArguments, ss );
+    GenerateArgWithDefault( "tmp4", 4, 0, vSubArguments, ss );
+    ss <<"    int nNullDate = GetNullDate();\n";
+    ss <<"    tmp=tmp3* ( 1.0 -tmp2*GetYearDiff( nNullDate, ";
+    ss <<"tmp0,tmp1,tmp4));\n";
+    ss <<"    return tmp;\n";
+    ss <<"}";
+}
+void OpNper::GenSlidingWindowFunction(outputstream &ss,
+         const std::string &sSymName, SubArguments &vSubArguments)
+{
+    CHECK_PARAMETER_COUNT( 3, 5 );
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
+    ss << "    double tmp = 0;\n";
+    ss << "    int gid0 = get_global_id(0);\n";
+    GenerateArg( "tmp0", 0, vSubArguments, ss );
+    GenerateArg( "tmp1", 1, vSubArguments, ss );
+    GenerateArg( "tmp2", 2, vSubArguments, ss );
+    GenerateArgWithDefault( "tmp3", 3, 0, vSubArguments, ss );
+    GenerateArgWithDefault( "tmp4", 4, 0, vSubArguments, ss );
     ss <<"    if (tmp0 == 0.0)\n";
     ss <<"        tmp=(-1*(tmp2 + tmp3)/tmp1);\n";
     ss <<"    else if (tmp4 > 0.0)\n";
@@ -2665,50 +1476,18 @@ void OpPPMT::BinInlineFun(std::set<std::string>& decls,
 void OpPPMT::GenSlidingWindowFunction(outputstream &ss,
         const std::string &sSymName, SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 4, 6 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss<<"    double tmp = 0;\n";
     ss<<"    int gid0 = get_global_id(0);\n";
     ss<<"    double arg=0;\n";
-    ss<<"    double tmp0=0;\n";
-    ss<<"    double tmp1=0;\n";
-    ss<<"    double tmp2=0;\n";
-    ss<<"    double tmp3=0;\n";
-    ss<<"    double tmp4=0,tmp5=0;\n";
-    ss <<"\n    ";
-    //while (i-- > 1)
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
-        assert(pCur);
-        if (pCur->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken* pSVR =
-                static_cast< const formula::SingleVectorRefToken* >(pCur);
-            ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-        }
-        else if (pCur->GetType() == formula::svDouble)
-        {
-            ss << "{\n";
-        }
-
-        if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
-        {
-            ss << "        arg=";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss << ";\n";
-            ss << "        if (isnan(arg))\n";
-            ss << "            tmp"<<i<<"= 0;\n";
-            ss << "        else\n";
-            ss << "            tmp"<<i<<"=arg;\n";
-            ss << "    }\n";
-        }
-        else
-        {
-            ss<<"    tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss<<";\n";
-        }
-    }
+    GenerateArg( "tmp0", 0, vSubArguments, ss );
+    GenerateArg( "tmp1", 1, vSubArguments, ss );
+    GenerateArg( "tmp2", 2, vSubArguments, ss );
+    GenerateArg( "tmp3", 3, vSubArguments, ss );
+    GenerateArgWithDefault( "tmp4", 4, 0, vSubArguments, ss );
+    GenerateArgWithDefault( "tmp5", 5, 0, vSubArguments, ss );
     ss<<"    double pmt=0 ;\n";
     ss<<"    if(tmp0==0.0)\n";
     ss<<"        return -(tmp3+tmp4)/tmp2;\n";
@@ -2759,62 +1538,21 @@ void OpCoupdaybs::BinInlineFun(std::set<std::string>& 
decls,
     funs.insert(coupdaybs_new);
 }
 void OpCoupdaybs::GenSlidingWindowFunction(
-    outputstream &ss, const std::string &sSymName, SubArguments &
-vSubArguments)
+    outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 3, 4 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    double tmp = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    int nSettle,nMat,nFreq,nBase;\n";
-    FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
-    if(tmpCur0->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur0);
-    ss <<"    if(isnan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR0->GetArrayLength()<<"))\n";
-    ss <<"        nSettle = 0;\n    else\n";
-    }
-    ss <<"        nSettle=(int)";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur1->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur1);
-    ss <<"    if(isnan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR1->GetArrayLength()<<"))\n";
-    ss <<"        nMat = 0;\n    else\n";
-    }
-    ss <<"        nMat=(int)";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur2->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur2);
-    ss <<"    if(isnan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR2->GetArrayLength()<<"))\n";
-    ss <<"        nFreq = 0;\n    else\n";
-    }
-    ss << "        nFreq=(int)";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur3->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur3);
-    ss <<"    if(isnan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR3->GetArrayLength()<<"))\n";
-    ss <<"        nBase = 0;\n    else\n";
-    }
-    ss << "        nBase=(int)";
-    ss << vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss << ";\n";
+    GenerateArg( "fSettle", 0, vSubArguments, ss );
+    GenerateArg( "fMat", 1, vSubArguments, ss );
+    GenerateArg( "fFreq", 2, vSubArguments, ss );
+    GenerateArgWithDefault( "fBase", 3, 0, vSubArguments, ss );
+    ss << "    int nSettle = fSettle;\n";
+    ss << "    int nMat = fMat;\n";
+    ss << "    int nFreq = fFreq;\n";
+    ss << "    int nBase = fBase;\n";
     ss <<"    tmp = coupdaybs_new(nSettle,nMat,nFreq,nBase);\n";
     ss <<"    return tmp;\n";
     ss <<"}";
@@ -2843,62 +1581,21 @@ void OpCoupdays::BinInlineFun(std::set<std::string>& 
decls,
     funs.insert(coupdays_new);
 }
 void OpCoupdays::GenSlidingWindowFunction(
-    outputstream &ss, const std::string &sSymName, SubArguments &
-vSubArguments)
+    outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 3, 4 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    double tmp = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    int nSettle,nMat,nFreq,nBase;\n";
-    FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
-    if(tmpCur0->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur0);
-    ss <<"    if(isnan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR0->GetArrayLength()<<"))\n";
-    ss <<"        nSettle = 0;\n    else\n";
-    }
-    ss <<"        nSettle=(int)";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur1->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur1);
-    ss <<"    if(isnan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR1->GetArrayLength()<<"))\n";
-    ss <<"        nMat = 0;\n    else\n";
-    }
-    ss <<"        nMat=(int)";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur2->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur2);
-    ss <<"    if(isnan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR2->GetArrayLength()<<"))\n";
-    ss <<"        nFreq = 0;\n    else\n";
-    }
-    ss << "        nFreq=(int)";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur3->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur3);
-    ss <<"    if(isnan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR3->GetArrayLength()<<"))\n";
-    ss <<"        nBase = 0;\n    else\n";
-    }
-    ss << "        nBase=(int)";
-    ss << vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss << ";\n";
+    GenerateArg( "fSettle", 0, vSubArguments, ss );
+    GenerateArg( "fMat", 1, vSubArguments, ss );
+    GenerateArg( "fFreq", 2, vSubArguments, ss );
+    GenerateArgWithDefault( "fBase", 3, 0, vSubArguments, ss );
+    ss << "    int nSettle = fSettle;\n";
+    ss << "    int nMat = fMat;\n";
+    ss << "    int nFreq = fFreq;\n";
+    ss << "    int nBase = fBase;\n";
     ss <<"    tmp = coupdays_new(nSettle,nMat,nFreq,nBase);\n";
     ss <<"    return tmp;\n";
     ss << "}";
@@ -2925,59 +1622,19 @@ void OpCouppcd::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName,
     SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 3, 4 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    double tmp = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    int nSettle,nMat,nFreq,nBase;\n";
-    FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
-    if(tmpCur0->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur0);
-    ss <<"    if(isnan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR0->GetArrayLength()<<"))\n";
-    ss <<"        nSettle = 0;\n    else\n";
-    }
-    ss <<"        nSettle=(int)";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur1->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur1);
-    ss <<"    if(isnan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR1->GetArrayLength()<<"))\n";
-    ss <<"        nMat = 0;\n    else\n";
-    }
-    ss <<"        nMat=(int)";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur2->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur2);
-    ss <<"    if(isnan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR2->GetArrayLength()<<"))\n";
-    ss <<"        nFreq = 0;\n    else\n";
-    }
-    ss << "        nFreq=(int)";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur3->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur3);
-    ss <<"    if(isnan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR3->GetArrayLength()<<"))\n";
-    ss <<"        nBase = 0;\n    else\n";
-    }
-    ss << "        nBase=(int)";
-    ss << vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss << ";\n";
+    GenerateArg( "fSettle", 0, vSubArguments, ss );
+    GenerateArg( "fMat", 1, vSubArguments, ss );
+    GenerateArg( "fFreq", 2, vSubArguments, ss );
+    GenerateArgWithDefault( "fBase", 3, 0, vSubArguments, ss );
+    ss << "    int nSettle = fSettle;\n";
+    ss << "    int nMat = fMat;\n";
+    ss << "    int nFreq = fFreq;\n";
+    ss << "    int nBase = fBase;\n";
     ss <<"    int nNullDate=693594;\n";
     ss <<"    tmp = lcl_GetCouppcd(nNullDate,nSettle,nMat,nFreq,nBase);\n";
     ss <<"    return tmp;\n";
@@ -3002,62 +1659,21 @@ void OpCoupncd::BinInlineFun(std::set<std::string>& 
decls,
     funs.insert(lcl_GetCoupncd);
 }
 void OpCoupncd::GenSlidingWindowFunction(
-    outputstream &ss, const std::string &sSymName, SubArguments &
-vSubArguments)
+    outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 3, 4 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    double tmp = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    int nSettle,nMat,nFreq,nBase;\n";
-    FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
-    if(tmpCur0->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur0);
-    ss <<"    if(isnan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR0->GetArrayLength()<<"))\n";
-    ss <<"        nSettle = 0;\n    else\n";
-    }
-    ss <<"        nSettle=(int)";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur1->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur1);
-    ss <<"    if(isnan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR1->GetArrayLength()<<"))\n";
-    ss <<"        nMat = 0;\n    else\n";
-    }
-    ss <<"        nMat=(int)";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur2->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur2);
-    ss <<"    if(isnan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR2->GetArrayLength()<<"))\n";
-    ss <<"        nFreq = 0;\n    else\n";
-    }
-    ss << "        nFreq=(int)";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur3->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur3);
-    ss <<"    if(isnan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR3->GetArrayLength()<<"))\n";
-    ss <<"        nBase = 0;\n    else\n";
-    }
-    ss << "        nBase=(int)";
-    ss << vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss << ";\n";
+    GenerateArg( "fSettle", 0, vSubArguments, ss );
+    GenerateArg( "fMat", 1, vSubArguments, ss );
+    GenerateArg( "fFreq", 2, vSubArguments, ss );
+    GenerateArgWithDefault( "fBase", 3, 0, vSubArguments, ss );
+    ss << "    int nSettle = fSettle;\n";
+    ss << "    int nMat = fMat;\n";
+    ss << "    int nFreq = fFreq;\n";
+    ss << "    int nBase = fBase;\n";
     ss <<"    int nNullDate=693594;\n";
     ss <<"    tmp = lcl_GetCoupncd(nNullDate,nSettle,nMat,nFreq,nBase);\n";
     ss <<"    return tmp;\n";
@@ -3098,59 +1714,19 @@ void OpCoupdaysnc::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName,
     SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 3, 4 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    double tmp = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    int nSettle,nMat,nFreq,nBase;\n";
-    FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
-    if(tmpCur0->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur0);
-    ss <<"    if(isnan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR0->GetArrayLength()<<"))\n";
-    ss <<"        nSettle = 0;\n    else\n";
-    }
-    ss <<"        nSettle=(int)";
-    ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur1->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur1);
-    ss <<"    if(isnan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR1->GetArrayLength()<<"))\n";
-    ss <<"        nMat = 0;\n    else\n";
-    }
-    ss <<"        nMat=(int)";
-    ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur2->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur2);
-    ss <<"    if(isnan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR2->GetArrayLength()<<"))\n";
-    ss <<"        nFreq = 0;\n    else\n";
-    }
-    ss << "        nFreq=(int)";
-    ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-    if(tmpCur3->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
-        formula::SingleVectorRefToken *>(tmpCur3);
-    ss <<"    if(isnan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR3->GetArrayLength()<<"))\n";
-    ss <<"        nBase = 0;\n    else\n";
-    }
-    ss << "        nBase=(int)";
-    ss << vSubArguments[3]->GenSlidingWindowDeclRef();
-    ss << ";\n";
+    GenerateArg( "fSettle", 0, vSubArguments, ss );
+    GenerateArg( "fMat", 1, vSubArguments, ss );
+    GenerateArg( "fFreq", 2, vSubArguments, ss );
+    GenerateArgWithDefault( "fBase", 3, 0, vSubArguments, ss );
+    ss << "    int nSettle = fSettle;\n";
+    ss << "    int nMat = fMat;\n";
+    ss << "    int nFreq = fFreq;\n";
+    ss << "    int nBase = fBase;\n";
     ss <<"    tmp = coupdaysnc_new(nSettle,nMat,nFreq,nBase);\n";
     ss <<"    return tmp;\n";
     ss << "}";
@@ -3177,59 +1753,19 @@ void OpCoupnum::BinInlineFun(std::set<std::string>& 
decls,
 void OpCoupnum::GenSlidingWindowFunction(outputstream &ss,
         const std::string &sSymName, SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 3, 4 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    double tmp = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    int nSettle,nMat,nFreq,nBase;\n";
-    FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
-    FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
-    if(tmpCur0->GetType() == formula::svSingleVectorRef)
-    {
-    const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
-    formula::SingleVectorRefToken *>(tmpCur0);
-    ss <<"    if(isnan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
-    ss <<")||(gid0 >="<<tmpCurDVR0->GetArrayLength()<<"))\n";
-    ss <<"        nSettle = 0;\n    else\n";
-    }
-    ss <<"        nSettle=(int)";

... etc. - the rest is truncated

Reply via email to