21 void RRI::GenSlidingWindowFunction(
22 std::stringstream &ss,
const std::string &sSymName, SubArguments &vSubArguments)
24 ss <<
"\ndouble " << sSymName;
25 ss <<
"_"<< BinFuncName() <<
"(";
26 for (
size_t i = 0;
i < vSubArguments.size();
i++)
30 vSubArguments[
i]->GenSlidingWindowDecl(ss);
33 ss <<
" double tmp = " << GetBottom() <<
";\n";
34 ss <<
" int gid0 = get_global_id(0);\n";
35 ss <<
" double fv;\n";
36 ss <<
" double pv;\n";
37 ss <<
" double nper;\n";
38 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
42 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
46 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
50 ss<<
" int buffer_nper_len = ";
54 ss<<
" int buffer_pv_len = ";
58 ss<<
" int buffer_fv_len = ";
62 ss<<
" if(gid0>=buffer_nper_len || isnan(";
63 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
65 ss<<
" nper = 0;\n\telse \n";
67 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
70 ss<<
" if(gid0>=buffer_pv_len || isnan(";
71 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
73 ss<<
" pv = 0;\n\telse \n";
75 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
78 ss<<
" if(gid0>=buffer_pv_len || isnan(";
79 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
81 ss<<
" fv = 0;\n\telse \n";
83 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
85 ss <<
" tmp = pow(fv*pow(pv,-1),1.0*pow(nper,-1))-1;\n";
86 ss <<
" return tmp;\n";
90 void OpNominal::GenSlidingWindowFunction(
91 std::stringstream &ss,
const std::string &sSymName,
SubArguments &
94 ss <<
"\ndouble " << sSymName;
95 ss <<
"_"<< BinFuncName() <<
"(";
96 for (
size_t i = 0;
i < vSubArguments.size();
i++)
100 vSubArguments[
i]->GenSlidingWindowDecl(ss);
103 ss <<
"double tmp = 0;\n\t";
104 ss <<
"double temp = 0;\n\t";
105 ss <<
"int gid0 = get_global_id(0);\n\t";
106 ss <<
"double tmp0=0,tmp1=0;\n";
107 for (
size_t i = 0;
i < vSubArguments.size();
i++)
122 if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
124 ss <<
" temp="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
126 ss <<
" if (isnan(temp))\n";
127 ss <<
" tmp"<<
i<<
"= 0;\n";
129 ss <<
" tmp"<<i<<
"=temp;\n";
134 ss <<
" tmp"<<
i<<
"="<<vSubArguments[
i]->GenSlidingWindowDeclRef(
139 ss<<
"if(tmp1==0)\n\t";
140 ss<<
"\treturn 0;\n\t";
141 ss<<
"tmp=pow( tmp1,-1);\n\t";
142 ss<<
"tmp=( pow( tmp0+ 1.0, tmp ) - 1.0 ) *";
144 ss <<
"return tmp;\n";
148 void OpDollarde::GenSlidingWindowFunction(
149 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
151 ss <<
"\ndouble " << sSymName;
152 ss <<
"_"<< BinFuncName() <<
"(";
153 for (
size_t i = 0;
i < vSubArguments.size();
i++)
157 vSubArguments[
i]->GenSlidingWindowDecl(ss);
160 ss <<
"double tmp = " << GetBottom() <<
";\n\t";
161 ss <<
"int gid0 = get_global_id(0);\n\t";
162 ss <<
"double fInt = " << GetBottom() <<
";\n\t";
163 ss <<
"double dollar;\n\t";
164 ss <<
"double fFrac;\n\t";
171 ss<<
"int buffer_dollar_len = ";
174 ss<<
"int buffer_frac_len = ";
177 ss<<
"if((gid0)>=buffer_dollar_len || isnan(";
178 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
180 ss<<
"dollar = 0;\n\telse \n\t\t";
182 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
184 ss<<
"if((gid0)>=buffer_frac_len || isnan(";
185 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
187 ss<<
"fFrac = 0;\n\telse \n\t\t";
188 ss<<
"fFrac = (int)(";
189 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
191 ss <<
"tmp = modf( dollar , &fInt );\n\t";
192 ss <<
"tmp /= fFrac;\n\t";
193 ss <<
"tmp *= pow( 10.0 , ceil( log10(fFrac ) ) );\n\t";
194 ss <<
"tmp += fInt;\t";
195 ss <<
"\n\treturn tmp;\n";
199 void OpDollarfr::GenSlidingWindowFunction(std::stringstream &ss,
200 const std::string &sSymName,
SubArguments &vSubArguments)
202 ss <<
"\ndouble " << sSymName;
203 ss <<
"_"<< BinFuncName() <<
"(";
204 for (
size_t i = 0;
i < vSubArguments.size();
i++)
208 vSubArguments[
i]->GenSlidingWindowDecl(ss);
211 ss <<
"double tmp = " << GetBottom() <<
";\n\t";
212 ss <<
"int gid0 = get_global_id(0);\n\t";
213 ss <<
"double fInt = " << GetBottom() <<
";\n\t";
214 ss <<
"double dollar;\n\t";
215 ss <<
"double fFrac;\n\t";
216 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
219 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
222 ss<<
"int buffer_dollar_len = ";
225 ss<<
"int buffer_frac_len = ";
228 ss<<
"if((gid0)>=buffer_dollar_len || isnan(";
229 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
231 ss<<
"dollar = 0;\n\telse \n\t\t";
233 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
235 ss<<
"if((gid0)>=buffer_frac_len || isnan(";
236 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
238 ss<<
"fFrac = 0;\n\telse \n\t\t";
239 ss<<
"fFrac = (int)(";
240 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
242 ss <<
"tmp = modf( dollar , &fInt );\n\t";
243 ss <<
"tmp *= fFrac;\n\t";
244 ss <<
"tmp *= pow( 10.0 , -ceil( log10(fFrac ) ) );\n\t";
245 ss <<
"tmp += fInt;\t";
246 ss <<
"\n\treturn tmp;\n";
250 void OpDISC::BinInlineFun(std::set<std::string>& decls,
251 std::set<std::string>& funs)
259 void OpDISC::GenSlidingWindowFunction(std::stringstream& ss,
260 const std::string &sSymName, SubArguments& vSubArguments)
262 ss <<
"\ndouble " << sSymName;
263 ss <<
"_" << BinFuncName() <<
"(";
264 for (
size_t i = 0;
i < vSubArguments.size();
i++)
268 vSubArguments[
i]->GenSlidingWindowDecl(ss);
271 ss <<
" double tmp = " << GetBottom() <<
";\n";
272 ss <<
" int gid0 = get_global_id(0);\n";
273 ss <<
" double arg0 = " << GetBottom() <<
";\n";
274 ss <<
" double arg1 = " << GetBottom() <<
";\n";
275 ss <<
" double arg2 = " << GetBottom() <<
";\n";
276 ss <<
" double arg3 = " << GetBottom() <<
";\n";
277 ss <<
" double arg4 = " << GetBottom() <<
";\n";
278 for (
size_t i = 0;
i < vSubArguments.size();
i++)
292 if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
295 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
297 ss <<
" arg" <<
i <<
" = 0;\n";
299 ss <<
" arg" << i <<
" = ";
300 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
305 ss <<
" arg" <<
i <<
" = ";
306 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
309 ss <<
" int nNullDate = 693594;\n";
310 ss <<
" tmp = 1.0 - arg2 / arg3;\n";
312 ss <<
" GetYearFrac_new(nNullDate, (int)arg0, (int)arg1, (int)arg4);\n";
313 ss <<
" return tmp;\n";
317 void OpINTRATE::BinInlineFun(std::set<std::string>& decls,
318 std::set<std::string>& funs)
330 void OpINTRATE::GenSlidingWindowFunction(std::stringstream& ss,
331 const std::string &sSymName,
SubArguments& vSubArguments)
333 ss <<
"\ndouble " << sSymName;
334 ss <<
"_" << BinFuncName() <<
"(";
335 for (
size_t i = 0;
i < vSubArguments.size();
i++)
339 vSubArguments[
i]->GenSlidingWindowDecl(ss);
342 ss <<
" double tmp = " << GetBottom() <<
";\n";
343 ss <<
" int gid0 = get_global_id(0);\n";
344 ss <<
" double arg0 = " << GetBottom() <<
";\n";
345 ss <<
" double arg1 = " << GetBottom() <<
";\n";
346 ss <<
" double arg2 = " << GetBottom() <<
";\n";
347 ss <<
" double arg3 = " << GetBottom() <<
";\n";
348 ss <<
" double arg4 = " << GetBottom() <<
";\n";
349 for (
size_t i = 0;
i < vSubArguments.size();
i++)
363 if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
366 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
368 ss <<
" arg" <<
i <<
" = 0;\n";
370 ss <<
" arg" << i <<
" = ";
371 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
376 ss <<
" arg" <<
i <<
" = ";
377 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
380 ss <<
" int nNullDate = GetNullDate();\n";
381 ss <<
" tmp = ((arg3 / arg2) - 1) / GetYearDiff_new(nNullDate, (int)arg0,";
382 ss <<
" (int)arg1,(int)arg4);\n";
383 ss <<
" return tmp;\n";
387 void OpFV::BinInlineFun(std::set<std::string>& decls,
388 std::set<std::string>& funs)
394 void OpFV::GenSlidingWindowFunction(std::stringstream& ss,
395 const std::string &sSymName, SubArguments& vSubArguments)
397 ss <<
"\ndouble " << sSymName;
398 ss <<
"_"<< BinFuncName() <<
"(";
399 for (
size_t i = 0;
i < vSubArguments.size();
i++)
403 vSubArguments[
i]->GenSlidingWindowDecl(ss);
406 ss <<
" double tmp = " << GetBottom() <<
";\n";
407 ss <<
" int gid0 = get_global_id(0);\n";
408 ss <<
" double arg0 = " << GetBottom() <<
";\n";
409 ss <<
" double arg1 = " << GetBottom() <<
";\n";
410 ss <<
" double arg2 = " << GetBottom() <<
";\n";
411 ss <<
" double arg3 = " << GetBottom() <<
";\n";
412 ss <<
" double arg4 = " << GetBottom() <<
";\n";
413 unsigned j = vSubArguments.size();
416 FormulaToken* pCur = vSubArguments[j]->GetFormulaToken();
423 ss << vSubArguments[j]->GenSlidingWindowDeclRef();
425 ss <<
" arg" << j <<
" = " <<GetBottom() <<
";\n";
427 ss <<
" arg" << j <<
" = ";
428 ss << vSubArguments[j]->GenSlidingWindowDeclRef();
432 ss <<
" tmp = GetFV(arg0, arg1, arg2, arg3, arg4);\n";
433 ss <<
" return tmp;\n";
437 void OpIPMT::BinInlineFun(std::set<std::string>& decls,
438 std::set<std::string>& funs)
444 void OpIPMT::GenSlidingWindowFunction(std::stringstream& ss,
445 const std::string &sSymName,
SubArguments& vSubArguments)
447 ss <<
"\ndouble " << sSymName;
448 ss <<
"_"<< BinFuncName() <<
"(";
449 for (
size_t i = 0;
i < vSubArguments.size();
i++)
453 vSubArguments[
i]->GenSlidingWindowDecl(ss);
456 ss <<
" double tmp = " << GetBottom() <<
";\n";
457 ss <<
" int gid0 = get_global_id(0);\n";
458 ss <<
" double arg0 = " << GetBottom() <<
";\n";
459 ss <<
" double arg1 = " << GetBottom() <<
";\n";
460 ss <<
" double arg2 = " << GetBottom() <<
";\n";
461 ss <<
" double arg3 = " << GetBottom() <<
";\n";
462 ss <<
" double arg4 = " << GetBottom() <<
";\n";
463 ss <<
" double arg5 = " << GetBottom() <<
";\n";
464 unsigned j = vSubArguments.size();
474 ss << vSubArguments[j]->GenSlidingWindowDeclRef();
476 ss <<
" arg" << j <<
" = " <<GetBottom() <<
";\n";
478 ss <<
" arg" << j <<
" = ";
479 ss << vSubArguments[j]->GenSlidingWindowDeclRef();
483 ss <<
" double pmt ;\n";
484 ss <<
" if(arg0 == 0.0)\n";
485 ss <<
" return 0;\n";
486 ss <<
" double temp1 = 0;\n";
487 ss <<
" double abl = pow(1.0 + arg0, arg2);\n";
488 ss <<
" temp1 -= arg4;\n";
489 ss <<
" temp1 -= arg3 * abl;\n";
490 ss <<
" pmt = temp1 / (1.0 + arg0 * arg5) /";
491 ss <<
" ( (abl - 1.0) / arg0);\n";
492 ss <<
" double temp = pow( 1 + arg0, arg1 - 2);\n";
493 ss <<
" if(arg1 == 1.0)\n";
495 ss <<
" if(arg5 > 0.0)\n";
496 ss <<
" tmp = 0.0;\n";
498 ss <<
" tmp = -arg3;\n";
502 ss <<
" if(arg5 > 0.0)\n";
503 ss <<
" tmp = GetFV(arg0, arg1 - 2.0, pmt, arg3, 1.0)";
506 ss <<
" tmp = GetFV(arg0, arg1 - 1.0, pmt, arg3, 0.0);\n";
508 ss <<
" tmp = tmp * arg0;\n";
509 ss <<
" return tmp;\n";
512 void OpISPMT::GenSlidingWindowFunction(std::stringstream& ss,
513 const std::string &sSymName,
SubArguments& vSubArguments)
515 ss <<
"\ndouble " << sSymName;
516 ss <<
"_" << BinFuncName() <<
"(";
517 for (
size_t i = 0;
i < vSubArguments.size();
i++)
521 vSubArguments[
i]->GenSlidingWindowDecl(ss);
524 ss <<
" double tmp = " << GetBottom() <<
";\n";
525 ss <<
" int gid0 = get_global_id(0);\n";
526 ss <<
" double arg0 = " << GetBottom() <<
";\n";
527 ss <<
" double arg1 = " << GetBottom() <<
";\n";
528 ss <<
" double arg2 = " << GetBottom() <<
";\n";
529 ss <<
" double arg3 = " << GetBottom() <<
";\n";
530 for (
size_t i = 0;
i < vSubArguments.size();
i++)
544 if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
547 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
549 ss <<
" arg" <<
i <<
" = 0;\n";
551 ss <<
" arg" << i <<
" = ";
552 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
557 ss <<
" arg" << i <<
" = ";
558 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
561 ss <<
" tmp = arg3 * arg0 * ( arg1 - arg2) * pow(arg2, -1);\n";
562 ss <<
" return tmp;\n";
566 void OpPDuration::GenSlidingWindowFunction(std::stringstream& ss,
567 const std::string &sSymName,
SubArguments& vSubArguments)
569 ss <<
"\ndouble " << sSymName;
570 ss <<
"_" << BinFuncName() <<
"(";
571 for (
size_t i = 0;
i < vSubArguments.size();
i++)
575 vSubArguments[
i]->GenSlidingWindowDecl(ss);
578 ss <<
" double tmp = " << GetBottom() <<
";\n";
579 ss <<
" int gid0 = get_global_id(0);\n";
580 ss <<
" double arg0 = " << GetBottom() <<
";\n";
581 ss <<
" double arg1 = " << GetBottom() <<
";\n";
582 ss <<
" double arg2 = " << GetBottom() <<
";\n";
583 for (
size_t i = 0;
i < vSubArguments.size();
i++)
597 if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
600 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
602 ss <<
" arg" <<
i <<
" = 0;\n";
604 ss <<
" arg" << i <<
" = ";
605 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
610 ss <<
" arg" << i <<
" = ";
611 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
614 ss <<
" tmp = log(arg2 * pow( arg1,-1)) / log(arg0 + 1.0);\n";
615 ss <<
" return tmp;\n";
619 void OpDuration_ADD::BinInlineFun(std::set<std::string>& decls,
620 std::set<std::string>& funs)
632 void OpDuration_ADD::GenSlidingWindowFunction(std::stringstream& ss,
633 const std::string &sSymName,
SubArguments& vSubArguments)
635 ss <<
"\ndouble " << sSymName;
636 ss <<
"_"<< BinFuncName() <<
"(";
637 for (
size_t i = 0;
i < vSubArguments.size();
i++)
641 vSubArguments[
i]->GenSlidingWindowDecl(ss);
644 ss <<
" double tmp = " << GetBottom() <<
";\n";
645 ss <<
" int gid0 = get_global_id(0);\n";
646 ss <<
" double arg0 = " << GetBottom() <<
";\n";
647 ss <<
" double arg1 = " << GetBottom() <<
";\n";
648 ss <<
" double arg2 = " << GetBottom() <<
";\n";
649 ss <<
" double arg3 = " << GetBottom() <<
";\n";
650 ss <<
" double arg4 = " << GetBottom() <<
";\n";
651 ss <<
" double arg5 = " << GetBottom() <<
";\n";
652 unsigned j = vSubArguments.size();
655 FormulaToken* pCur = vSubArguments[j]->GetFormulaToken();
662 ss << vSubArguments[j]->GenSlidingWindowDeclRef();
664 ss <<
" arg" << j <<
" = " <<GetBottom() <<
";\n";
666 ss <<
" arg" << j <<
" = ";
667 ss << vSubArguments[j]->GenSlidingWindowDeclRef();
671 ss <<
" int nNullDate = GetNullDate();\n";
672 ss <<
" tmp = GetDuration( nNullDate, (int)arg0, (int)arg1, arg2,";
673 ss <<
" arg3, (int)arg4, (int)arg5);\n";
674 ss <<
" return tmp;\n";
677 void OpMDuration::BinInlineFun(std::set<std::string>& decls,
678 std::set<std::string>& funs)
692 void OpMDuration::GenSlidingWindowFunction(std::stringstream& ss,
693 const std::string &sSymName,
SubArguments& vSubArguments)
695 ss <<
"\ndouble " << sSymName;
696 ss <<
"_"<< BinFuncName() <<
"(";
697 for (
size_t i = 0;
i < vSubArguments.size();
i++)
701 vSubArguments[
i]->GenSlidingWindowDecl(ss);
704 ss <<
" double tmp = " << GetBottom() <<
";\n";
705 ss <<
" int gid0 = get_global_id(0);\n";
706 ss <<
" double arg0 = " << GetBottom() <<
";\n";
707 ss <<
" double arg1 = " << GetBottom() <<
";\n";
708 ss <<
" double arg2 = " << GetBottom() <<
";\n";
709 ss <<
" double arg3 = " << GetBottom() <<
";\n";
710 ss <<
" double arg4 = " << GetBottom() <<
";\n";
711 ss <<
" double arg5 = " << GetBottom() <<
";\n";
712 for (
size_t i = 0;
i < vSubArguments.size();
i++)
726 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
729 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
731 ss <<
" arg" <<
i <<
" = 0;\n";
733 ss <<
" arg" << i <<
" = ";
734 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
739 ss <<
" arg" << i <<
" = ";
740 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
743 ss <<
" int nNullDate = 693594;\n";
744 ss <<
" tmp = GetDuration_new( nNullDate, (int)arg0, (int)arg1, arg2,";
745 ss <<
" arg3, (int)arg4, (int)arg5);\n";
746 ss <<
" tmp = tmp * pow(1.0 + arg3 * pow((int)arg4, -1.0), -1);\n";
747 ss <<
" return tmp;\n";
750 void Fvschedule::GenSlidingWindowFunction(
751 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
754 FormulaToken* pCur = vSubArguments[1]->GetFormulaToken();
761 ss <<
"\ndouble " << sSymName;
762 ss <<
"_"<< BinFuncName() <<
"(";
763 for (
size_t i = 0;
i < vSubArguments.size();
i++)
767 vSubArguments[
i]->GenSlidingWindowDecl(ss);
770 ss <<
"double tmp = 1.0;\n\t";
771 ss <<
"int gid0 = get_global_id(0);\n\t";
772 ss <<
"double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
774 ss <<
"if (isnan(arg0))\n\t\t";
775 ss <<
"arg0 = 0;\n\t";
776 ss <<
"double arg1;\n\t";
777 ss <<
"int arrayLength = " << pCurDVR->
GetArrayLength() <<
";\n\t";
778 ss <<
"for (int i = 0; i + gid0 < arrayLength &&";
779 ss <<
" i < " << nCurWindowSize <<
"; i++){\n\t\t";
781 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n\t\t\t";
782 ss <<
"if (isnan(arg1))\n\t\t\t\t";
783 ss <<
"arg1 = 0;\n\t\t\t";
784 ss <<
"tmp *= arg1 + 1.0;\n\t\t";
786 ss <<
"return (double)tmp * arg0";
789 void Cumipmt::BinInlineFun(std::set<std::string>& decls,
790 std::set<std::string>& funs)
795 void Cumipmt::GenSlidingWindowFunction(
796 std::stringstream &ss,
const std::string &sSymName,
SubArguments &
799 ss <<
"\ndouble " << sSymName;
800 ss <<
"_"<< BinFuncName() <<
"(";
801 for (
size_t i = 0;
i < vSubArguments.size();
i++)
805 vSubArguments[
i]->GenSlidingWindowDecl(ss);
808 ss <<
" int gid0 = get_global_id(0);\n";
809 ss <<
" double fRate,fVal;\n";
810 ss <<
" int nStartPer,nEndPer,nNumPeriods,nPayType;\n";
811 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
812 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
813 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
815 FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
816 FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
822 ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
824 ss <<
" fRate = 0;\n else\n";
826 ss <<
" fRate = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
833 ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
835 ss <<
" nNumPeriods = 0;\n else\n";
837 ss <<
" nNumPeriods = (int)";
838 ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
845 ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
847 ss <<
" fVal = 0;\n else\n";
849 ss <<
" fVal = "<<vSubArguments[2]->GenSlidingWindowDeclRef();
856 ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
858 ss <<
" nStartPer = 0;\n else\n";
860 ss <<
" nStartPer = (int)";
861 ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
868 ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
870 ss <<
" nEndPer = 0;\n else\n";
872 ss <<
" nEndPer = (int)";
873 ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
881 ss <<vSubArguments[5]->GenSlidingWindowDeclRef();
883 ss <<
" nPayType = 0;\n else\n";
885 ss <<
" nPayType = (int)"<<vSubArguments[5]->GenSlidingWindowDeclRef();
887 ss <<
" double fPmt;\n";
888 ss <<
" fPmt = GetPMT_new( fRate, nNumPeriods, fVal, 0.0, nPayType );\n";
889 ss <<
" double tmp = 0.0;\n";
890 ss <<
" if( nStartPer == 1 )\n";
892 ss <<
" if( nPayType <= 0 )\n";
893 ss <<
" tmp = -fVal;\n";
894 ss <<
" nStartPer++;\n";
896 ss <<
" for( ; nStartPer<= nEndPer ; nStartPer++ )\n";
898 ss <<
" if( nPayType > 0 )\n";
899 ss <<
" tmp += GetFV_new( fRate, nStartPer - 2 , ";
900 ss <<
"fPmt, fVal, 1 ) - fPmt;\n";
902 ss <<
" tmp += GetFV_new( fRate, nStartPer - 1 , ";
903 ss <<
"fPmt, fVal, 0 );\n";
905 ss <<
" tmp *= fRate;\n";
906 ss <<
" return tmp;\n";
910 void IRR::GenSlidingWindowFunction(std::stringstream &ss,
911 const std::string &sSymName,
SubArguments &vSubArguments)
913 ss <<
"\ndouble " << sSymName;
914 ss <<
"_" << BinFuncName() <<
"(";
915 for (
size_t i = 0;
i < vSubArguments.size();
i++)
919 vSubArguments[
i]->GenSlidingWindowDecl(ss);
922 ss <<
" #define Epsilon 1.0E-7\n";
923 ss <<
" int gid0 = get_global_id(0);\n";
924 FormulaToken* pSur = vSubArguments[1]->GetFormulaToken();
926 ss <<
" double fEstimated = ";
927 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
928 ss <<
" double fEps = 1.0;\n";
929 ss <<
" double x = 0.0, xNew = 0.0, fNumerator = 0.0, fDenominator = 0.0;\n";
930 ss <<
" double nCount = 0.0;\n";
936 ss <<
" fEstimated = 0.1;\n";
937 ss <<
" if (isnan(fEstimated))\n";
943 ss <<
" if (isnan(fEstimated))\n";
947 ss <<
" x = fEstimated;\n";
948 ss <<
" unsigned short nItCount = 0;\n";
949 ss <<
" while (fEps > Epsilon && nItCount < 20){\n";
950 ss <<
" nCount = 0.0; fNumerator = 0.0; fDenominator = 0.0;\n";
951 ss <<
" double arg0, arg1;\n";
952 ss <<
" int i = 0;\n";
953 FormulaToken* pCur = vSubArguments[0]->GetFormulaToken();
961 ss <<
" && i < " << nCurWindowSize <<
" /2*2; i++){\n";
963 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
966 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
967 ss <<
" if (!isnan(arg0)){\n";
968 ss <<
" fNumerator += arg0 / pow(1.0 + x, nCount);\n";
969 ss <<
" fDenominator+=-1*nCount*arg0/pow(1.0+x,nCount+1.0);\n";
970 ss <<
" nCount += 1;\n";
972 ss <<
" if (!isnan(arg1)){\n";
973 ss <<
" fNumerator += arg1 / pow(1.0 + x, nCount);\n";
974 ss <<
" fDenominator+=-1*nCount*arg1/pow(1.0+x,nCount+1.0);\n";
975 ss <<
" nCount += 1;\n";
979 ss <<
" && i < " << nCurWindowSize <<
") ;{\n";
983 ss <<
" && i < (gid0+" << nCurWindowSize <<
" )/2*2; i++){\n";
985 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
986 ss <<
" if (!isnan(arg0)){\n";
987 ss <<
" fNumerator += arg0 / pow(1.0 + x, nCount);\n";
988 ss <<
" fDenominator+=-1*nCount*arg0/pow(1.0+x,nCount+1.0);\n";
989 ss <<
" nCount += 1;\n";
993 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
994 ss <<
" if (!isnan(arg1)){\n";
995 ss <<
" fNumerator += arg1 / pow(1.0 + x, nCount);\n";
996 ss <<
" fDenominator+=-1*nCount*arg1/pow(1.0+x,nCount+1.0);\n";
997 ss <<
" nCount+=1;\n";
1001 ss <<
" && i < gid0+" << nCurWindowSize <<
"){\n";
1005 ss <<
" && i < " << nCurWindowSize <<
" /2*2; i++){\n";
1007 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
1010 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
1011 ss <<
" if (!isnan(arg0)){\n";
1012 ss <<
" fNumerator += arg0 / pow(1.0 + x, nCount);\n";
1013 ss <<
" fDenominator+=-1*nCount*arg0/pow(1.0+x,nCount+1.0);\n";
1014 ss <<
" nCount += 1;\n";
1016 ss <<
" if (!isnan(arg1)){\n";
1017 ss <<
" fNumerator += arg1 / pow(1.0 + x, nCount);\n";
1018 ss <<
" fDenominator+=-1*nCount*arg1/pow(1.0+x,nCount+1.0);\n";
1019 ss <<
" nCount+=1;\n";
1023 ss <<
" i < " << nCurWindowSize <<
"){\n";
1026 ss <<
"; i < " << nCurWindowSize <<
" /2*2; i++){\n";
1028 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
1031 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
1032 ss <<
" if (!isnan(arg0)){\n";
1033 ss <<
" fNumerator += arg0 / pow(1.0 + x, nCount);\n";
1034 ss <<
" fDenominator+=-1*nCount*arg0/pow(1.0+x,nCount+1.0);\n";
1035 ss <<
" nCount += 1;\n";
1037 ss <<
" if (!isnan(arg1)){\n";
1038 ss <<
" fNumerator += arg1 / pow(1.0 + x, nCount);\n";
1039 ss <<
" fDenominator+=-1*nCount*arg1/pow(1.0+x,nCount+1.0);\n";
1040 ss <<
" nCount+=1;\n";
1043 ss <<
"if(i<" << nCurWindowSize <<
"){\n";
1047 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
1048 ss <<
" if (isnan(arg0))\n";
1049 ss <<
" continue;\n";
1050 ss <<
" fNumerator += arg0 / pow(1.0+x, nCount);\n";
1051 ss <<
" fDenominator += -nCount * arg0 / pow(1.0+x,nCount+1.0);\n";
1052 ss <<
" nCount+=1;\n";
1054 ss <<
" xNew = x - fNumerator / fDenominator;\n";
1055 ss <<
" fEps = fabs(xNew - x);\n";
1056 ss <<
" x = xNew;\n";
1057 ss <<
" nItCount++;\n }\n";
1058 ss <<
" if (fEstimated == 0.0 && fabs(x) < Epsilon)\n";
1059 ss <<
" x = 0.0;\n";
1060 ss <<
" if (fEps < Epsilon)\n";
1061 ss <<
" return x;\n";
1066 ss <<
" return (double)523;\n";
1070 void XNPV::GenSlidingWindowFunction(
1071 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
1073 FormulaToken *pCur = vSubArguments[1]->GetFormulaToken();
1078 ss <<
"\ndouble " << sSymName;
1079 ss <<
"_"<< BinFuncName() <<
"( ";
1080 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1084 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1088 ss <<
"double result = 0.0;\n\t";
1089 ss <<
"int gid0 = get_global_id(0);\n\t";
1090 ss <<
"int i=0;\n\t";
1091 ss <<
"double date;\n\t";
1092 ss <<
"double value;\n\t";
1093 ss <<
"double rate;\n\t";
1094 ss <<
"double dateNull;\n\t";
1095 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1099 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
1103 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
1106 ss<<
"int buffer_rate_len = ";
1109 ss<<
"int buffer_value_len = ";
1112 ss<<
"int buffer_date_len = ";
1115 ss<<
"if((gid0)>=buffer_date_len || isnan(";
1116 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1118 ss<<
"return NAN;\n\telse \n";
1120 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1122 ss<<
"if((gid0)>=buffer_rate_len || isnan(";
1123 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1125 ss<<
"return NAN;\n\telse \n";
1127 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1129 ss<<
"if(1 == buffer_date_len )\n";
1131 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1133 ss <<
"for (int i = ";
1136 ss <<
"gid0; i < "<< nCurWindowSize <<
"; i++)\n\t\t";
1140 ss <<
"0; i < gid0+"<< nCurWindowSize <<
"; i++)\n\t\t";
1144 ss <<
"0; i < "<< nCurWindowSize <<
"; i++)\n\t\t";
1149 ss <<
"if((i+gid0)>=buffer_value_len || (i+gid0)>=buffer_date_len)\n\t\t";
1150 ss <<
"return result;\n\telse \n\t\t";
1154 ss <<
"if(i>=buffer_value_len || i>=buffer_date_len)\n\t\t";
1155 ss <<
"return result;\n\telse \n\t\t";
1159 ss << vSubArguments[1]->GenSlidingWindowDeclRef(
true);
1162 ss << vSubArguments[2]->GenSlidingWindowDeclRef(
true);
1164 ss <<
"result += value/(pow((rate+1),(date-dateNull)/365));\n";
1166 ss <<
"return result;\n";
1170 void PriceMat::BinInlineFun(std::set<std::string>& decls,
1171 std::set<std::string>& funs)
1181 void PriceMat::GenSlidingWindowFunction(
1182 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
1184 ss <<
"\ndouble " << sSymName;
1185 ss <<
"_"<< BinFuncName() <<
"(";
1186 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1190 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1193 ss <<
"int gid0 = get_global_id(0);\n\t";
1194 ss <<
"double result=0;\n\t";
1195 ss<<
"int nNullDate = GetNullDate( );\n\t";
1196 ss <<
"int settle;\n\t";
1197 ss <<
"int mat;\n\t";
1198 ss <<
"int issue;\n\t";
1199 ss <<
"double rate;\n\t";
1200 ss <<
"double yield;\n\t";
1201 ss <<
"int nBase;\n\t";
1202 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1205 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
1208 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
1211 FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
1214 FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
1217 FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
1221 ss<<
"int buffer_settle_len = ";
1224 ss<<
"int buffer_mat_len = ";
1227 ss<<
"int buffer_issue_len = ";
1230 ss<<
"int buffer_rate_len = ";
1233 ss<<
"int buffer_yield_len = ";
1236 ss<<
"int buffer_base_len = ";
1239 ss<<
"if(gid0>=buffer_settle_len || isnan(";
1240 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1242 ss<<
"settle = 0;\n\telse \n\t\t";
1244 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1246 ss<<
"if(gid0>=buffer_mat_len || isnan(";
1247 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1249 ss<<
"mat = 0;\n\telse \n\t\t";
1251 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1253 ss<<
"if(gid0>=buffer_issue_len || isnan(";
1254 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1256 ss<<
"issue = 0;\n\telse \n\t\t";
1258 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1260 ss<<
"if(gid0>=buffer_rate_len || isnan(";
1261 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
1263 ss<<
"rate = 0;\n\telse \n\t\t";
1265 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
1267 ss<<
"if(gid0>=buffer_yield_len || isnan(";
1268 ss << vSubArguments[4]->GenSlidingWindowDeclRef();
1270 ss<<
"yield = 0;\n\telse \n\t\t";
1272 ss << vSubArguments[4]->GenSlidingWindowDeclRef();
1274 ss<<
"if(gid0>=buffer_base_len || isnan(";
1275 ss << vSubArguments[5]->GenSlidingWindowDeclRef();
1277 ss<<
"nBase = 0;\n\telse \n\t\t";
1279 ss << vSubArguments[5]->GenSlidingWindowDeclRef();
1281 ss<<
"double fIssMat = GetYearFrac( nNullDate, issue, mat, nBase);\n";
1282 ss<<
"double fIssSet = GetYearFrac( nNullDate, issue, settle,nBase);\n";
1283 ss<<
"double fSetMat = GetYearFrac( nNullDate, settle, mat, nBase);\n";
1284 ss<<
"result = 1.0 + fIssMat * rate;\n\t";
1285 ss<<
"result /= 1.0 + fSetMat * yield;\n\t";
1286 ss<<
"result -= fIssSet * rate;\n\t";
1287 ss<<
"result*= 100.0;\n\t";
1288 ss<<
"return result;\n\t";
1292 void OpSYD::GenSlidingWindowFunction(std::stringstream &ss,
1293 const std::string &sSymName,
SubArguments &vSubArguments)
1295 ss <<
"\ndouble " << sSymName;
1296 ss <<
"_"<< BinFuncName() <<
"(";
1297 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1301 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1304 ss <<
" int gid0 = get_global_id(0);\n";
1305 ss <<
" double result=0;\n";
1306 ss <<
" double cost;\n";
1307 ss <<
" double salvage;\n";
1308 ss <<
" double life;\n";
1309 ss <<
" double period;\n";
1310 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1314 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
1318 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
1326 ss <<
" int buffer_cost_len = ";
1330 ss <<
" int buffer_salvage_len = ";
1334 ss <<
" int buffer_life_len = ";
1337 ss <<
" int buffer_period_len = ";
1341 ss <<
" if(gid0>=buffer_cost_len || isnan(";
1342 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1344 ss <<
" cost = 0;\n\telse \n";
1346 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1348 ss <<
" if(gid0>=buffer_salvage_len || isnan(";
1349 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1351 ss <<
" salvage = 0;\n\telse \n";
1353 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1355 ss <<
" if(gid0>=buffer_life_len || isnan(";
1356 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1358 ss <<
" life = 0;\n\telse \n";
1360 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1362 ss <<
" if(gid0>=buffer_period_len || isnan(";
1363 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
1365 ss <<
" period = 0;\n\telse \n";
1367 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
1369 ss <<
" double tmpvalue = ((life*(life+1))*pow(2.0,-1));\n";
1370 ss <<
" result = ((cost-salvage)*(life-period+1)";
1371 ss <<
"*pow(tmpvalue,-1));\n";
1372 ss <<
" return result;\n";
1376 void MIRR::GenSlidingWindowFunction(
1377 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
1379 FormulaToken* pCur = vSubArguments[0]->GetFormulaToken();
1384 FormulaToken* pCur1 = vSubArguments[1]->GetFormulaToken();
1389 FormulaToken* pCur2 = vSubArguments[2]->GetFormulaToken();
1395 ss <<
"\ndouble " << sSymName;
1396 ss <<
"_"<< BinFuncName() <<
"(";
1397 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1401 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1404 ss <<
"double tmp = " << GetBottom() <<
";\n\t";
1405 ss <<
"int gid0 = get_global_id(0);\n\t";
1406 ss <<
"double arg0, arg1, arg2;\n\t";
1407 ss <<
"arg1 = " << vSubArguments[1]->GenSlidingWindowDeclRef();
1409 ss <<
"arg2 = " << vSubArguments[2]->GenSlidingWindowDeclRef();
1413 ss <<
"if (gid0 >= argLen1)\n\t\t";
1414 ss <<
"arg1 = 0.0;\n\t";
1415 ss <<
"if (gid0 >= argLen2)\n\t\t";
1416 ss <<
"arg2 = 0.0;\n\t";
1417 ss <<
"if (isnan(arg1))\n\t\t";
1418 ss <<
"arg1 = 0.0;\n\t";
1419 ss <<
"if (isnan(arg2))\n\t\t";
1420 ss <<
"arg2 = 0.0;\n\t";
1421 ss <<
"double invest = arg1 + 1.0;\n\t";
1422 ss <<
"double reinvest = arg2 + 1.0;\n\t";
1423 ss <<
"double NPV_invest = 0.0;\n\t";
1424 ss <<
"double Pow_invest = 1.0;\n\t";
1425 ss <<
"double NPV_reinvest = 0.0;\n\t";
1426 ss <<
"double Pow_reinvest = 1.0;\n\t";
1427 ss <<
"int nCount = 0;\n\t";
1428 ss <<
"int arrayLength = " << pCurDVR->
GetArrayLength() <<
";\n\t";
1429 ss <<
"for (int i = 0; i + gid0 < arrayLength &&";
1430 ss <<
" i < " << nCurWindowSize <<
"; i++){\n\t\t";
1431 ss <<
"arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
1433 ss <<
"if (isnan(arg0))\n\t\t\t";
1434 ss <<
"continue;\n\t\t";
1435 ss <<
"if (arg0 > 0.0)\n\t\t\t";
1436 ss <<
"NPV_reinvest += arg0 * Pow_reinvest;\n\t\t";
1437 ss <<
"else if (arg0 < 0.0)\n\t\t\t";
1438 ss <<
"NPV_invest += arg0 * Pow_invest;\n\t\t";
1439 ss <<
"Pow_reinvest /= reinvest;\n\t\t";
1440 ss <<
"Pow_invest /= invest;\n\t\t";
1441 ss <<
"nCount++;\n\t";
1444 ss <<
"-NPV_reinvest /NPV_invest * pow(reinvest,(double)nCount-1);\n\t";
1445 ss <<
"tmp = pow(tmp, 1.0 / (nCount - 1)) - 1.0;\n\t";
1446 ss <<
"return (double)tmp;\n";
1450 void OpEffective::GenSlidingWindowFunction(std::stringstream& ss,
1451 const std::string &sSymName,
SubArguments& vSubArguments)
1453 ss <<
"\ndouble " << sSymName;
1454 ss <<
"_" << BinFuncName() <<
"(";
1455 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1459 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1462 ss <<
" double tmp = " << GetBottom() <<
";\n";
1463 ss <<
" int gid0 = get_global_id(0);\n\t";
1464 ss <<
" double arg0 = " << GetBottom() <<
";\n";
1465 ss <<
" double arg1 = " << GetBottom() <<
";\n";
1466 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1480 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
1482 ss <<
" if (isnan(";
1483 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
1485 ss <<
" arg" <<
i <<
" = 0;\n";
1487 ss <<
" arg" << i <<
" = ";
1488 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1493 ss <<
" arg" <<
i <<
" = ";
1494 ss << vSubArguments[i]->GenSlidingWindowDeclRef() <<
";\n";
1497 ss <<
" tmp = pow(1.0 + arg0 * pow(arg1, -1), arg1)-1.0;\n";
1498 ss <<
" return tmp;\n";
1502 void OpTbilleq::BinInlineFun(std::set<std::string>& decls,
1503 std::set<std::string>& funs)
1514 void OpTbilleq::GenSlidingWindowFunction(
1515 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
1517 ss <<
"\ndouble " << sSymName;
1518 ss <<
"_"<< BinFuncName() <<
"(";
1519 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1523 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1526 ss <<
" int gid0 = get_global_id(0);\n";
1527 ss <<
"double tmp = 0;\n\t";
1528 ss <<
"double tmp000;\n\t";
1529 ss <<
"double tmp001;\n\t";
1530 ss <<
"double tmp002;\n\t";
1532 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1536 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
1540 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
1544 ss<<
"int buffer_tmp000_len = ";
1548 ss<<
"int buffer_tmp001_len = ";
1552 ss<<
"int buffer_tmp002_len = ";
1556 ss<<
"if(gid0>=buffer_tmp000_len || isnan(";
1557 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1559 ss<<
"tmp000 = 0;\n\telse \n\t\t";
1561 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1564 ss<<
"if(gid0>=buffer_tmp001_len || isnan(";
1565 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1567 ss<<
"tmp001 = 0;\n\telse \n\t\t";
1569 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1572 ss<<
"if(gid0>=buffer_tmp002_len || isnan(";
1573 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1575 ss<<
"tmp002 = 0;\n\telse \n\t\t";
1577 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1580 ss<<
"tmp001+=1.0;\n";
1581 ss<<
"int nDiff =GetDiffDate360(GetNullDate(),tmp000,tmp001,true);\n";
1582 ss<<
"tmp =( 365 * tmp002 ) / ( 360 - ( tmp002 * ( nDiff ) ) );\n";
1583 ss <<
"return tmp;\n";
1586 void OpCumprinc::BinInlineFun(std::set<std::string>& decls,
1587 std::set<std::string>& funs)
1592 void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss,
1593 const std::string &sSymName,
SubArguments &vSubArguments)
1595 ss <<
"\ndouble " << sSymName;
1596 ss <<
"_"<< BinFuncName() <<
"(";
1597 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1601 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1604 ss <<
" double tmp = " << GetBottom() <<
";\n";
1605 ss <<
" int gid0 = get_global_id(0);\n";
1606 ss <<
" double fRate,fVal;\n";
1607 ss <<
" int nStartPer,nEndPer,nNumPeriods,nPayType;\n";
1608 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1609 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
1610 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
1611 FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
1612 FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
1613 FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
1619 ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
1621 ss <<
" fRate = 0;\n else\n";
1623 ss <<
" fRate = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
1630 ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
1632 ss <<
" nNumPeriods = 0;\n else\n";
1634 ss <<
" nNumPeriods = (int)";
1635 ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
1642 ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
1644 ss <<
" fVal = 0;\n else\n";
1646 ss <<
" fVal = "<<vSubArguments[2]->GenSlidingWindowDeclRef();
1653 ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
1655 ss <<
" nStartPer = 0;\n else\n";
1657 ss <<
" nStartPer = (int)";
1658 ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
1665 ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
1667 ss <<
" nEndPer = 0;\n else\n";
1669 ss <<
" nEndPer = (int)";
1670 ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
1678 ss <<vSubArguments[5]->GenSlidingWindowDeclRef();
1680 ss <<
" nPayType = 0;\n else\n";
1682 ss <<
" nPayType = (int)";
1683 ss <<vSubArguments[5]->GenSlidingWindowDeclRef();
1685 ss <<
" double fPmt;\n";
1686 ss <<
" fPmt = GetPMT_new( fRate, nNumPeriods,fVal,0.0,nPayType );\n";
1687 ss <<
" if(nStartPer == 1)\n";
1689 ss <<
" if( nPayType <= 0 )\n";
1690 ss <<
" tmp = fPmt + fVal * fRate;\n";
1692 ss <<
" tmp = fPmt;\n";
1693 ss <<
" nStartPer=nStartPer+1;\n";
1695 ss <<
" for( int i = nStartPer ; i <= nEndPer ; i++ )\n";
1697 ss <<
" if( nPayType > 0 )\n";
1698 ss <<
" tmp += fPmt - ( GetFV_new( fRate,i - 2,";
1699 ss <<
"fPmt,fVal,1)- fPmt ) * fRate;\n";
1701 ss <<
" tmp += fPmt - GetFV_new( fRate, i - 1,";
1702 ss <<
"fPmt,fVal,0 ) * fRate;\n";
1704 ss <<
" return tmp;\n";
1707 void OpAccrint::BinInlineFun(std::set<std::string>& decls,
1708 std::set<std::string>& funs)
1717 void OpAccrint::GenSlidingWindowFunction(
1718 std::stringstream &ss,
const std::string &sSymName,
1719 SubArguments &vSubArguments)
1721 ss <<
"\ndouble " << sSymName;
1722 ss <<
"_"<< BinFuncName() <<
"(";
1723 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1727 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1730 ss <<
" int gid0 = get_global_id(0);\n";
1731 ss <<
" double tmp = 0;\n";
1732 ss <<
" int nStartDate,nEndDate,mode,freq;\n";
1733 ss <<
" int nDays1stYear=0;\n";
1734 ss <<
" double fVal,fRate;\n";
1735 FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
1738 FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
1741 FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
1744 FormulaToken* tmpCur4 = vSubArguments[4]->GetFormulaToken();
1747 FormulaToken* tmpCur5 = vSubArguments[5]->GetFormulaToken();
1750 FormulaToken* tmpCur6 = vSubArguments[6]->GetFormulaToken();
1753 ss<<
" int buffer_nIssue_len = ";
1756 ss<<
" int buffer_nSettle_len = ";
1759 ss<<
" int buffer_fRate_len = ";
1762 ss<<
" int buffer_fVal_len = ";
1765 ss<<
" int buffer_nFreq_len = ";
1768 ss<<
" int buffer_nMode_len = ";
1771 ss<<
" if(gid0 >= buffer_nIssue_len || isnan(";
1772 ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
1774 ss <<
" nStartDate = 0;\n else\n";
1775 ss <<
" nStartDate=(int)";
1776 ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
1778 ss <<
" if(gid0 >= buffer_nSettle_len || isnan(";
1779 ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
1781 ss <<
" nEndDate = 0;\n else\n";
1782 ss <<
" nEndDate=(int)";
1783 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1785 ss <<
" if(gid0 >= buffer_fRate_len || isnan(";
1786 ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
1788 ss <<
" fRate = 0;\n else\n";
1790 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
1792 ss <<
" if(gid0 >= buffer_fVal_len || isnan(";
1793 ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
1795 ss <<
" fVal = 0;\n else\n";
1797 ss << vSubArguments[4]->GenSlidingWindowDeclRef();
1799 ss <<
" if(gid0 >= buffer_nFreq_len || isnan(";
1800 ss <<vSubArguments[5]->GenSlidingWindowDeclRef();
1802 ss <<
" freq = 0;\n else\n";
1803 ss <<
" freq= (int)";
1804 ss << vSubArguments[5]->GenSlidingWindowDeclRef();
1806 ss <<
" if(gid0 >= buffer_nMode_len || isnan(";
1807 ss <<vSubArguments[6]->GenSlidingWindowDeclRef();
1809 ss <<
" mode = 0;\n else\n";
1810 ss <<
" mode = (int)";
1811 ss << vSubArguments[6]->GenSlidingWindowDeclRef();
1813 ss <<
" int nNullDate=GetNullDate();\n";
1814 ss <<
" int nTotalDays = GetDiffDate(nNullDate,nStartDate,";
1815 ss <<
"nEndDate, mode,&nDays1stYear);\n";
1816 ss <<
" tmp = fVal*fRate*convert_double(nTotalDays)";
1817 ss <<
"/convert_double(nDays1stYear);\n";
1818 ss <<
" return tmp;\n";
1822 void OpAccrintm::BinInlineFun(std::set<std::string>& decls,
1823 std::set<std::string>& funs)
1832 void OpAccrintm::GenSlidingWindowFunction(
1833 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
1835 ss <<
"\ndouble " << sSymName;
1836 ss <<
"_"<< BinFuncName() <<
"(";
1837 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1841 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1844 ss <<
"int gid0 = get_global_id(0);\n\t";
1845 ss <<
"double tmp = " << GetBottom() <<
";\n\t";
1846 ss <<
"int nStartDate,nEndDate,mode;\n\t";
1847 ss <<
"double fRate,fVal;\n\t";
1848 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1851 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
1855 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
1859 FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
1863 FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
1866 ss<<
"int buffer_nIssue_len = ";
1870 ss<<
"int buffer_nSettle_len = ";
1874 ss<<
"int buffer_fRate_len = ";
1878 ss<<
"int buffer_fVal_len = ";
1882 ss<<
"int buffer_nMode_len = ";
1885 ss <<
"if(gid0 >= buffer_nIssue_len || isnan(";
1886 ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
1888 ss <<
"nStartDate = 0;\n\telse\n\t\t";
1889 ss <<
"nStartDate=(int)";
1890 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1892 ss <<
"if(gid0 >= buffer_nSettle_len || isnan(";
1893 ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
1895 ss <<
"nEndDate = 0;\n\telse\n\t\t";
1896 ss <<
"nEndDate=(int)";
1897 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1900 ss <<
"if(gid0 >= buffer_fRate_len || isnan(";
1901 ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
1903 ss <<
"fRate = 0;\n\telse\n\t\t";
1905 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1907 ss <<
"if(gid0 >= buffer_fVal_len || isnan(";
1908 ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
1910 ss <<
"fVal = 0;\n\telse\n\t\t";
1912 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
1914 ss <<
"if(gid0 >= buffer_nMode_len || isnan(";
1915 ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
1917 ss <<
"mode = 0;\n\telse\n\t\t";
1918 ss <<
"mode = (int)";
1919 ss << vSubArguments[4]->GenSlidingWindowDeclRef();
1921 ss <<
"int nDays1stYear=0;\n\t";
1922 ss <<
"int nNullDate=GetNullDate();\n\t";
1923 ss <<
"int nTotalDays = GetDiffDate(nNullDate,nStartDate,";
1924 ss <<
"nEndDate, mode,&nDays1stYear);\n\t";
1925 ss <<
"tmp = fVal*fRate*convert_double(nTotalDays)";
1926 ss <<
"/convert_double(nDays1stYear);\n\t";
1927 ss <<
"return tmp;\n";
1931 void OpYield::BinInlineFun(std::set<std::string>& decls,
1932 std::set<std::string>& funs)
1959 void OpYield::GenSlidingWindowFunction(
1960 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
1962 ss <<
"\ndouble " << sSymName;
1963 ss <<
"_"<< BinFuncName() <<
"(";
1964 for (
size_t i = 0;
i < vSubArguments.size();
i++)
1968 vSubArguments[
i]->GenSlidingWindowDecl(ss);
1971 ss <<
"double tmp = 0;\n\t";
1972 ss <<
"int gid0 = get_global_id(0);\n\t";
1973 ss <<
"double tmp000;\n\t";
1974 ss <<
"double tmp001;\n\t";
1975 ss <<
"double tmp002;\n\t";
1976 ss <<
"double tmp003;\n\t";
1977 ss <<
"double tmp004;\n\t";
1978 ss <<
"double tmp005;\n\t";
1979 ss <<
"double tmp006;\n\t";
1981 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1985 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
1989 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
1993 FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
1997 FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
2001 FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
2005 FormulaToken *tmpCur6 = vSubArguments[6]->GetFormulaToken();
2009 ss<<
"int buffer_tmp000_len = ";
2013 ss<<
"int buffer_tmp001_len = ";
2017 ss<<
"int buffer_tmp002_len = ";
2021 ss<<
"int buffer_tmp003_len = ";
2025 ss<<
"int buffer_tmp004_len = ";
2029 ss<<
"int buffer_tmp005_len = ";
2033 ss<<
"int buffer_tmp006_len = ";
2037 ss<<
"if(gid0>=buffer_tmp000_len || isnan(";
2038 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2040 ss<<
"tmp000 = 0;\n\telse \n\t\t";
2042 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2045 ss<<
"if(gid0>=buffer_tmp001_len || isnan(";
2046 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
2048 ss<<
"tmp001 = 0;\n\telse \n\t\t";
2050 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
2053 ss<<
"if(gid0>=buffer_tmp002_len || isnan(";
2054 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
2056 ss<<
"tmp002 = 0;\n\telse \n\t\t";
2058 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
2061 ss<<
"if(gid0>=buffer_tmp003_len || isnan(";
2062 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
2064 ss<<
"tmp003 = 0;\n\telse \n\t\t";
2066 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
2069 ss<<
"if(gid0>=buffer_tmp004_len || isnan(";
2070 ss << vSubArguments[4]->GenSlidingWindowDeclRef();
2072 ss<<
"tmp004 = 0;\n\telse \n\t\t";
2074 ss << vSubArguments[4]->GenSlidingWindowDeclRef();
2077 ss<<
"if(gid0>=buffer_tmp005_len || isnan(";
2078 ss << vSubArguments[5]->GenSlidingWindowDeclRef();
2080 ss<<
"tmp005 = 0;\n\telse \n\t\t";
2082 ss << vSubArguments[5]->GenSlidingWindowDeclRef();
2085 ss<<
"if(gid0>=buffer_tmp006_len || isnan(";
2086 ss << vSubArguments[6]->GenSlidingWindowDeclRef();
2088 ss<<
"tmp006 = 0;\n\telse \n\t\t";
2090 ss << vSubArguments[6]->GenSlidingWindowDeclRef();
2093 ss <<
"tmp = getYield_(";
2094 ss <<
"GetNullDate(),tmp000,tmp001,tmp002,tmp003,tmp004,tmp005,tmp006);\n\t ";
2095 ss <<
"return tmp;\n";
2099 void OpSLN::GenSlidingWindowFunction(std::stringstream &ss,
2100 const std::string &sSymName,
SubArguments &vSubArguments)
2102 ss <<
"\ndouble " << sSymName;
2103 ss <<
"_"<< BinFuncName() <<
"(";
2104 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2108 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2111 ss <<
" double tmp = 0;\n";
2112 ss <<
" int gid0 = get_global_id(0);\n";
2113 ss <<
" double cost;\n";
2114 ss <<
" double salvage;\n";
2115 ss <<
" double life;\n";
2117 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
2120 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
2123 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
2126 ss<<
" int buffer_cost_len = ";
2129 ss<<
" int buffer_salvage_len = ";
2132 ss<<
" int buffer_life_len = ";
2135 ss<<
" if(gid0>=buffer_cost_len || isnan(";
2136 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2138 ss<<
" cost = 0;\n\telse \n";
2140 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2142 ss<<
" if(gid0>=buffer_salvage_len || isnan(";
2143 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
2145 ss<<
" salvage = 0;\n\telse \n";
2147 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
2149 ss<<
" if(gid0>=buffer_life_len || isnan(";
2150 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
2152 ss<<
" life = 0;\n\telse \n";
2154 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
2156 ss <<
" tmp = (cost-salvage)*pow(life,-1);\n";
2157 ss <<
" return tmp;\n";
2161 void OpYieldmat::BinInlineFun(std::set<std::string>& decls,
2162 std::set<std::string>& funs)
2175 void OpYieldmat::GenSlidingWindowFunction(
2176 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
2178 ss <<
"\ndouble " << sSymName;
2179 ss <<
"_"<< BinFuncName() <<
"(";
2180 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2184 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2187 ss <<
"double tmp = 0;\n\t";
2188 ss <<
"int gid0 = get_global_id(0);\n\t";
2189 ss <<
"double tmp000;\n\t";
2190 ss <<
"double tmp001;\n\t";
2191 ss <<
"double tmp002;\n\t";
2192 ss <<
"double tmp003;\n\t";
2193 ss <<
"double tmp004;\n\t";
2194 ss <<
"double tmp005;\n\t";
2196 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
2200 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
2204 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
2208 FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
2212 FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
2216 FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
2220 ss<<
"int buffer_tmp000_len = ";
2224 ss<<
"int buffer_tmp001_len = ";
2228 ss<<
"int buffer_tmp002_len = ";
2232 ss<<
"int buffer_tmp003_len = ";
2236 ss<<
"int buffer_tmp004_len = ";
2240 ss<<
"int buffer_tmp005_len = ";
2244 ss<<
"if(gid0>=buffer_tmp000_len || isnan(";
2245 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2247 ss<<
"tmp000 = 0;\n\telse \n\t\t";
2249 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2252 ss<<
"if(gid0>=buffer_tmp001_len || isnan(";
2253 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
2255 ss<<
"tmp001 = 0;\n\telse \n\t\t";
2257 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
2260 ss<<
"if(gid0>=buffer_tmp002_len || isnan(";
2261 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
2263 ss<<
"tmp002 = 0;\n\telse \n\t\t";
2265 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
2268 ss<<
"if(gid0>=buffer_tmp003_len || isnan(";
2269 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
2271 ss<<
"tmp003 = 0;\n\telse \n\t\t";
2273 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
2276 ss<<
"if(gid0>=buffer_tmp004_len || isnan(";
2277 ss << vSubArguments[4]->GenSlidingWindowDeclRef();
2279 ss<<
"tmp004 = 0;\n\telse \n\t\t";
2281 ss << vSubArguments[4]->GenSlidingWindowDeclRef();
2284 ss<<
"if(gid0>=buffer_tmp005_len || isnan(";
2285 ss << vSubArguments[5]->GenSlidingWindowDeclRef();
2287 ss<<
"tmp005 = 0;\n\telse \n\t\t";
2289 ss << vSubArguments[5]->GenSlidingWindowDeclRef();
2292 ss <<
"tmp = GetYieldmat(";
2293 ss<<
"GetNullDate(),tmp000,tmp001,tmp002,tmp003,tmp004,tmp005);\n\t";
2294 ss <<
"return tmp;\n";
2298 void OpPMT::GenSlidingWindowFunction(std::stringstream &ss,
2299 const std::string &sSymName,
SubArguments &vSubArguments)
2301 ss <<
"\ndouble " << sSymName;
2302 ss <<
"_"<< BinFuncName() <<
"(";
2303 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2307 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2310 ss<<
" double tmp = 0;\n";
2311 ss<<
" double temp=0.0;\n";
2312 ss<<
" int gid0 = get_global_id(0);\n";
2313 ss<<
" double tmp0=0,tmp1=0,tmp2=0;\n";
2314 ss<<
" double tmp3=0,tmp4=0;\n";
2317 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2332 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
2334 ss <<
" temp="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
2336 ss <<
" if (isnan(temp))\n";
2337 ss <<
" tmp"<<
i<<
"= 0;\n";
2339 ss <<
" tmp"<<i<<
"=temp;\n";
2344 ss <<
" tmp"<<
i<<
"="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
2348 ss<<
" if(tmp0==0.0)\n";
2349 ss<<
" return -(tmp2+tmp3)/tmp1;\n";
2350 ss<<
" tmp-=tmp3;\n";
2351 ss<<
" tmp=tmp-tmp2*pow(1.0+tmp0,tmp1);\n";
2352 ss<<
" tmp=tmp*pow(( (1.0+tmp0*tmp4)* ";
2353 ss<<
"( (pow(1.0+tmp0,tmp1)-1.0)/tmp0)),-1);\n";
2354 ss<<
" return tmp;\n";
2358 void OpNPV::GenSlidingWindowFunction(std::stringstream &ss,
2359 const std::string &sSymName,
SubArguments &vSubArguments)
2361 ss <<
"\ndouble " << sSymName;
2362 ss <<
"_"<< BinFuncName() <<
"(";
2363 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2367 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2370 ss <<
" double tmp = 0.0;\n";
2371 ss <<
" int gid0 = get_global_id(0);\n";
2372 ss <<
" int nCount = 1;\n";
2373 ss <<
" double arg0=";
2374 ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
2377 for (
size_t i = 1;
i < vSubArguments.size();
i++)
2386 ss <<
" for (int i = ";
2389 ss <<
" && i < " << nCurWindowSize <<
"; i++){\n";
2392 ss <<
" && i < gid0+"<< nCurWindowSize <<
"; i++){\n";
2395 ss <<
" && i < "<< nCurWindowSize <<
"; i++){\n";
2398 ss <<
"0; i < "<< nCurWindowSize <<
"; i++){\n";
2413 ss <<
"nCount += 1;\n";
2415 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
2417 ss <<
" double temp=";
2418 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
2420 ss <<
" double temp1=1.0;";
2421 ss <<
" if (isnan(temp)){\n";
2422 ss <<
" tmp += 0;}\n";
2424 ss <<
" for(int i=1;i<nCount;i+=2)\n";
2425 ss <<
" temp1*=pow(1.0f+ arg0 ,2);\n";
2426 ss <<
" if(nCount%2)\n";
2427 ss <<
" temp1*=1.0f+ arg0;\n";
2428 ss <<
" tmp +=temp/ temp1;\n";
2429 ss <<
" nCount += 1;\n";
2435 ss <<
" double temp=";
2436 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
2438 ss <<
" double temp1=1.0;";
2439 ss <<
" for(int i=1;i<nCount;i+=2)";
2440 ss <<
" temp1*=pow(1.0f+ arg0 ,2);\n";
2441 ss <<
" if(nCount%2)";
2442 ss <<
" temp1*=1.0f+ arg0;\n";
2443 ss <<
" tmp +=temp/ temp1;\n";
2444 ss <<
" nCount += 1;\n";
2447 ss <<
" return tmp;\n";
2451 void OpPrice::BinInlineFun(std::set<std::string>& decls,
2452 std::set<std::string>& funs)
2488 void OpPrice::GenSlidingWindowFunction(std::stringstream &ss,
2489 const std::string &sSymName,
SubArguments &vSubArguments)
2491 ss <<
"\ndouble " << sSymName;
2492 ss <<
"_"<< BinFuncName() <<
"(";
2493 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2497 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2500 ss<<
" double tmp = 0;\n";
2501 ss<<
" int gid0 = get_global_id(0);\n";
2502 ss<<
" double tmp0=0;\n";
2503 ss<<
" double tmp1=0;\n";
2504 ss<<
" double tmp2=0;\n";
2505 ss<<
" double tmp3=0;\n";
2506 ss<<
" double tmp4=0,tmp5=0;\n";
2507 ss<<
" double tmp6=0;\n";
2509 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2524 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
2526 ss <<
" if (isnan(";
2527 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
2529 ss <<
" tmp"<<
i<<
"= 0;\n";
2531 ss <<
" tmp"<<i<<
"=";
2532 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
2537 ss <<
" tmp"<<
i<<
"=";
2538 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
2542 ss <<
" if(tmp4*tmp5 == 0) return NAN;\n";
2543 ss <<
" tmp = getPrice_(tmp0,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);\n";
2544 ss <<
" return tmp;\n";
2548 void OpOddlprice::BinInlineFun(std::set<std::string>& decls,
2549 std::set<std::string>& funs)
2562 void OpOddlprice::GenSlidingWindowFunction(std::stringstream &ss,
2563 const std::string &sSymName,
SubArguments &vSubArguments)
2565 ss <<
"\ndouble " << sSymName;
2566 ss <<
"_"<< BinFuncName() <<
"(";
2567 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2571 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2574 ss <<
" double tmp = 0;\n";
2575 ss <<
" int gid0 = get_global_id(0);\n";
2576 ss <<
" double tmp0=0;\n";
2577 ss <<
" double tmp1=0;\n";
2578 ss <<
" double tmp2=0;\n";
2579 ss <<
" double tmp3=0;\n";
2580 ss <<
" double tmp4=0;\n";
2581 ss <<
" double tmp5=0;\n";
2582 ss <<
" double tmp6=0;\n";
2583 ss <<
" double tmp7=0;\n";
2585 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2594 ss <<
" for (int i = ";
2597 ss <<
" && i < " << nCurWindowSize <<
"; i++){\n";
2600 ss <<
" && i < gid0+"<< nCurWindowSize <<
"; i++){\n";
2603 ss <<
" && i < "<< nCurWindowSize <<
"; i++){\n";
2606 ss <<
"0; i < "<< nCurWindowSize <<
"; i++){\n";
2620 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
2622 ss <<
" if (isnan(";
2623 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
2625 ss <<
" tmp"<<
i<<
"= 0;\n";
2627 ss <<
" tmp"<<i<<
"=";
2628 ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
2634 ss <<
" tmp"<<
i<<
"=";
2635 ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
2639 ss <<
" int nNullDate = GetNullDate();\n";
2640 ss <<
" tmp = GetOddlprice(nNullDate,tmp0,tmp1,";
2641 ss <<
"tmp2,tmp3,tmp4,tmp5,tmp6,tmp7);\n";
2642 ss <<
" return tmp;\n";
2645 void OpOddlyield::BinInlineFun(std::set<std::string>& decls,
2646 std::set<std::string>& funs)
2659 void OpOddlyield::GenSlidingWindowFunction(std::stringstream &ss,
2660 const std::string &sSymName,
SubArguments &vSubArguments)
2662 ss <<
"\ndouble " << sSymName;
2663 ss <<
"_"<< BinFuncName() <<
"(";
2664 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2668 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2671 ss <<
" double tmp = 0;\n";
2672 ss <<
" int gid0 = get_global_id(0);\n";
2673 ss <<
" double tmp0=0;\n";
2674 ss <<
" double tmp1=0;\n";
2675 ss <<
" double tmp2=0;\n";
2676 ss <<
" double tmp3=0;\n";
2677 ss <<
" double tmp4=0;\n";
2678 ss <<
" double tmp5=0;\n";
2679 ss <<
" double tmp6=0;\n";
2680 ss <<
" double tmp7=0;\n";
2682 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2691 ss <<
" for (int i = ";
2694 ss <<
" && i < " << nCurWindowSize <<
"; i++){\n";
2697 ss <<
" && i < gid0+"<< nCurWindowSize <<
"; i++){\n";
2700 ss <<
" && i < "<< nCurWindowSize <<
"; i++){\n";
2703 ss <<
"0; i < "<< nCurWindowSize <<
"; i++){\n";
2717 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
2719 ss <<
" if (isnan(";
2720 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
2722 ss <<
" tmp"<<
i<<
"= 0;\n";
2724 ss <<
" tmp"<<i<<
"=";
2725 ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
2731 ss <<
" tmp"<<
i<<
"=";
2732 ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
2736 ss <<
" int nNullDate = GetNullDate();\n";
2737 ss <<
" tmp = GetOddlyield(nNullDate,tmp0,tmp1";
2738 ss <<
",tmp2,tmp3,tmp4,tmp5,tmp6,tmp7);\n";
2739 ss <<
" return tmp;\n";
2742 void OpPriceDisc::BinInlineFun(std::set<std::string>& decls,
2743 std::set<std::string>& funs)
2760 void OpPriceDisc::GenSlidingWindowFunction(std::stringstream &ss,
2761 const std::string &sSymName,
SubArguments &vSubArguments)
2763 ss <<
"\ndouble " << sSymName;
2764 ss <<
"_"<< BinFuncName() <<
"(";
2765 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2769 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2772 ss <<
" double tmp = 0;\n";
2773 ss <<
" int gid0 = get_global_id(0);\n";
2774 ss<<
" double tmp0=0;\n";
2775 ss<<
" double tmp1=0;\n";
2776 ss<<
" double tmp2=0;\n";
2777 ss<<
" double tmp3=0;\n";
2778 ss<<
" double tmp4=0;\n";
2780 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2795 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
2797 ss <<
" if (isnan(";
2798 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
2800 ss <<
" tmp"<<
i<<
"= 0;\n";
2802 ss <<
" tmp"<<i<<
"=";
2803 ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
2809 ss <<
" tmp"<<
i<<
"=";
2810 ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
2814 ss <<
" int nNullDate = GetNullDate();\n";
2815 ss <<
" tmp=tmp3* ( 1.0 -tmp2*GetYearDiff( nNullDate, ";
2816 ss <<
"tmp0,tmp1,tmp4));\n";
2817 ss <<
" return tmp;\n";
2820 void OpNper::GenSlidingWindowFunction(std::stringstream &ss,
2821 const std::string &sSymName,
SubArguments &vSubArguments)
2823 ss <<
"\ndouble " << sSymName;
2824 ss <<
"_"<< BinFuncName() <<
"(";
2825 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2829 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2832 ss <<
" double tmp = 0;\n";
2833 ss <<
" int gid0 = get_global_id(0);\n";
2834 ss <<
" double tmp0=0;\n";
2835 ss <<
" double tmp1=0;\n";
2836 ss <<
" double tmp2=0;\n";
2837 ss <<
" double tmp3=0;\n";
2838 ss <<
" double tmp4=0;\n";
2840 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2855 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
2857 ss <<
" if (isnan(";
2858 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
2860 ss <<
" tmp"<<
i<<
"= 0;\n";
2862 ss <<
" tmp"<<i<<
"=";
2863 ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
2869 ss <<
" tmp"<<
i<<
"=";
2870 ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
2874 ss <<
" if (tmp0 == 0.0)\n";
2875 ss <<
" tmp=(-1*(tmp2 + tmp3)/tmp1);\n";
2876 ss <<
" else if (tmp4 > 0.0)\n";
2877 ss <<
" tmp=log(-1*(tmp0*tmp3-tmp1*(1.0+tmp0))*";
2878 ss <<
"pow((tmp0*tmp2+tmp1*(1.0+tmp0)),-1))/log(1.0+tmp0);\n";
2880 ss <<
" tmp=log(-1*(tmp0*tmp3-tmp1)*pow(tmp0*tmp2+tmp1,-1))";
2881 ss <<
"/log(1.0+tmp0);\n";
2882 ss <<
" return tmp;\n";
2886 void OpPPMT::BinInlineFun(std::set<std::string>& decls,
2887 std::set<std::string>& funs)
2893 void OpPPMT::GenSlidingWindowFunction(std::stringstream &ss,
2894 const std::string &sSymName,
SubArguments &vSubArguments)
2896 ss <<
"\ndouble " << sSymName;
2897 ss <<
"_"<< BinFuncName() <<
"(";
2898 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2902 vSubArguments[
i]->GenSlidingWindowDecl(ss);
2905 ss<<
" double tmp = 0;\n";
2906 ss<<
" int gid0 = get_global_id(0);\n";
2907 ss<<
" double arg=0;\n";
2908 ss<<
" double tmp0=0;\n";
2909 ss<<
" double tmp1=0;\n";
2910 ss<<
" double tmp2=0;\n";
2911 ss<<
" double tmp3=0;\n";
2912 ss<<
" double tmp4=0,tmp5=0;\n";
2915 for (
size_t i = 0;
i < vSubArguments.size();
i++)
2930 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
2933 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
2935 ss <<
" if (isnan(arg))\n";
2936 ss <<
" tmp"<<
i<<
"= 0;\n";
2938 ss <<
" tmp"<<i<<
"=arg;\n";
2943 ss<<
" tmp"<<
i<<
"="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
2947 ss<<
" double pmt=0 ;\n";
2948 ss<<
" if(tmp0==0.0)\n";
2949 ss<<
" return -(tmp3+tmp4)/tmp2;\n";
2950 ss<<
" pmt=pmt-tmp4-tmp3*pow(1.0+tmp0,tmp2);\n";
2951 ss<<
" pmt=pmt*pow(( (1.0+tmp0*tmp5)* ";
2952 ss<<
"( (pow(1.0+tmp0,tmp2)-1.0)/tmp0)),-1);\n";
2953 ss<<
" double temp = pow( 1+tmp0,tmp1-2);\n";
2954 ss<<
" double re;\n";
2955 ss<<
" if(tmp1==1.0){\n";
2956 ss<<
" if(tmp5>0.0)\n";
2963 ss<<
" if(tmp5>0.0)\n ";
2964 ss<<
" re=GetFV(tmp0, tmp1-2.0, pmt, tmp3, 1.0) - pmt;\n";
2966 ss<<
" re=GetFV(tmp0, tmp1-1.0, pmt, tmp3, 0.0);\n";
2968 ss<<
" re = re * tmp0;\n";
2969 ss<<
" tmp = pmt - re;\n";
2970 ss<<
" return tmp;\n";
2974 void OpCoupdaybs::BinInlineFun(std::set<std::string>& decls,
2975 std::set<std::string>& funs)
2996 void OpCoupdaybs::GenSlidingWindowFunction(
2997 std::stringstream &ss,
const std::string &sSymName,
SubArguments &
3000 ss <<
"\ndouble " << sSymName;
3001 ss <<
"_"<< BinFuncName() <<
"(";
3002 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3006 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3009 ss <<
" double tmp = 0;\n";
3010 ss <<
" int gid0 = get_global_id(0);\n";
3011 ss <<
" int nSettle,nMat,nFreq,nBase;\n";
3012 FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
3013 FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
3014 FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
3015 FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
3020 ss <<
" if(isnan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
3022 ss <<
" nSettle = 0;\n else\n";
3024 ss <<
" nSettle=(int)";
3025 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3031 ss <<
" if(isnan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
3033 ss <<
" nMat = 0;\n else\n";
3036 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
3042 ss <<
" if(isnan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
3044 ss <<
" nFreq = 0;\n else\n";
3046 ss <<
" nFreq=(int)";
3047 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
3053 ss <<
" if(isnan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
3055 ss <<
" nBase = 0;\n else\n";
3057 ss <<
" nBase=(int)";
3058 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
3060 ss <<
" tmp = coupdaybs_new(nSettle,nMat,nFreq,nBase);\n";
3061 ss <<
" return tmp;\n";
3065 void OpCoupdays::BinInlineFun(std::set<std::string>& decls,
3066 std::set<std::string>& funs)
3087 void OpCoupdays::GenSlidingWindowFunction(
3088 std::stringstream &ss,
const std::string &sSymName,
SubArguments &
3091 ss <<
"\ndouble " << sSymName;
3092 ss <<
"_"<< BinFuncName() <<
"(";
3093 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3097 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3100 ss <<
" double tmp = 0;\n";
3101 ss <<
" int gid0 = get_global_id(0);\n";
3102 ss <<
" int nSettle,nMat,nFreq,nBase;\n";
3103 FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
3104 FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
3105 FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
3106 FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
3111 ss <<
" if(isnan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
3113 ss <<
" nSettle = 0;\n else\n";
3115 ss <<
" nSettle=(int)";
3116 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3122 ss <<
" if(isnan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
3124 ss <<
" nMat = 0;\n else\n";
3127 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
3133 ss <<
" if(isnan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
3135 ss <<
" nFreq = 0;\n else\n";
3137 ss <<
" nFreq=(int)";
3138 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
3144 ss <<
" if(isnan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
3146 ss <<
" nBase = 0;\n else\n";
3148 ss <<
" nBase=(int)";
3149 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
3151 ss <<
" tmp = coupdays_new(nSettle,nMat,nFreq,nBase);\n";
3152 ss <<
" return tmp;\n";
3155 void OpCouppcd::BinInlineFun(std::set<std::string>& decls,
3156 std::set<std::string>& funs)
3173 void OpCouppcd::GenSlidingWindowFunction(
3174 std::stringstream &ss,
const std::string &sSymName,
3177 ss <<
"\ndouble " << sSymName;
3178 ss <<
"_"<< BinFuncName() <<
"(";
3179 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3183 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3186 ss <<
" double tmp = 0;\n";
3187 ss <<
" int gid0 = get_global_id(0);\n";
3188 ss <<
" int nSettle,nMat,nFreq,nBase;\n";
3189 FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
3190 FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
3191 FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
3192 FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
3197 ss <<
" if(isnan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
3199 ss <<
" nSettle = 0;\n else\n";
3201 ss <<
" nSettle=(int)";
3202 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3208 ss <<
" if(isnan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
3210 ss <<
" nMat = 0;\n else\n";
3213 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
3219 ss <<
" if(isnan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
3221 ss <<
" nFreq = 0;\n else\n";
3223 ss <<
" nFreq=(int)";
3224 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
3230 ss <<
" if(isnan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
3232 ss <<
" nBase = 0;\n else\n";
3234 ss <<
" nBase=(int)";
3235 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
3237 ss <<
" int nNullDate=693594;\n";
3238 ss <<
" tmp = lcl_GetCouppcd(nNullDate,nSettle,nMat,nFreq,nBase);\n";
3239 ss <<
" return tmp;\n";
3242 void OpCoupncd::BinInlineFun(std::set<std::string>& decls,
3243 std::set<std::string>& funs)
3260 void OpCoupncd::GenSlidingWindowFunction(
3261 std::stringstream &ss,
const std::string &sSymName,
SubArguments &
3264 ss <<
"\ndouble " << sSymName;
3265 ss <<
"_"<< BinFuncName() <<
"(";
3266 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3270 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3273 ss <<
" double tmp = 0;\n";
3274 ss <<
" int gid0 = get_global_id(0);\n";
3275 ss <<
" int nSettle,nMat,nFreq,nBase;\n";
3276 FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
3277 FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
3278 FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
3279 FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
3284 ss <<
" if(isnan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
3286 ss <<
" nSettle = 0;\n else\n";
3288 ss <<
" nSettle=(int)";
3289 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3295 ss <<
" if(isnan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
3297 ss <<
" nMat = 0;\n else\n";
3300 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
3306 ss <<
" if(isnan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
3308 ss <<
" nFreq = 0;\n else\n";
3310 ss <<
" nFreq=(int)";
3311 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
3317 ss <<
" if(isnan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
3319 ss <<
" nBase = 0;\n else\n";
3321 ss <<
" nBase=(int)";
3322 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
3324 ss <<
" int nNullDate=693594;\n";
3325 ss <<
" tmp = lcl_GetCoupncd(nNullDate,nSettle,nMat,nFreq,nBase);\n";
3326 ss <<
" return tmp;\n";
3330 void OpCoupdaysnc::BinInlineFun(std::set<std::string>& decls,
3331 std::set<std::string>& funs)
3360 void OpCoupdaysnc::GenSlidingWindowFunction(
3361 std::stringstream &ss,
const std::string &sSymName,
3364 ss <<
"\ndouble " << sSymName;
3365 ss <<
"_"<< BinFuncName() <<
"(";
3366 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3370 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3373 ss <<
" double tmp = 0;\n";
3374 ss <<
" int gid0 = get_global_id(0);\n";
3375 ss <<
" int nSettle,nMat,nFreq,nBase;\n";
3376 FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
3377 FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
3378 FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
3379 FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
3384 ss <<
" if(isnan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
3386 ss <<
" nSettle = 0;\n else\n";
3388 ss <<
" nSettle=(int)";
3389 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3395 ss <<
" if(isnan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
3397 ss <<
" nMat = 0;\n else\n";
3400 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
3406 ss <<
" if(isnan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
3408 ss <<
" nFreq = 0;\n else\n";
3410 ss <<
" nFreq=(int)";
3411 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
3417 ss <<
" if(isnan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
3419 ss <<
" nBase = 0;\n else\n";
3421 ss <<
" nBase=(int)";
3422 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
3424 ss <<
" tmp = coupdaysnc_new(nSettle,nMat,nFreq,nBase);\n";
3425 ss <<
" return tmp;\n";
3429 void OpCoupnum::BinInlineFun(std::set<std::string>& decls,
3430 std::set<std::string>& funs)
3447 void OpCoupnum::GenSlidingWindowFunction(std::stringstream &ss,
3448 const std::string &sSymName,
SubArguments &vSubArguments)
3450 ss <<
"\ndouble " << sSymName;
3451 ss <<
"_"<< BinFuncName() <<
"(";
3452 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3456 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3459 ss <<
" double tmp = 0;\n";
3460 ss <<
" int gid0 = get_global_id(0);\n";
3461 ss <<
" int nSettle,nMat,nFreq,nBase;\n";
3462 FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
3463 FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
3464 FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
3465 FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
3470 ss <<
" if(isnan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
3472 ss <<
" nSettle = 0;\n else\n";
3474 ss <<
" nSettle=(int)";
3475 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3481 ss <<
" if(isnan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
3483 ss <<
" nMat = 0;\n else\n";
3486 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
3492 ss <<
" if(isnan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
3494 ss <<
" nFreq = 0;\n else\n";
3496 ss <<
" nFreq=(int)";
3497 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
3503 ss <<
" if(isnan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
3505 ss <<
" nBase = 0;\n else\n";
3507 ss <<
" nBase=(int)";
3508 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
3510 ss <<
" tmp = coupnum_new(nSettle,nMat,nFreq,nBase);\n";
3511 ss <<
" return tmp;\n";
3514 void OpAmordegrc::BinInlineFun(std::set<std::string>& decls,
3515 std::set<std::string>& funs)
3526 void OpAmordegrc::GenSlidingWindowFunction(std::stringstream &ss,
3527 const std::string &sSymName,
SubArguments &vSubArguments)
3529 ss <<
"\ndouble " << sSymName;
3530 ss <<
"_"<< BinFuncName() <<
"(";
3531 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3535 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3538 ss <<
"int gid0 = get_global_id(0);\n";
3539 ss <<
" double tmp = " << GetBottom() <<
";\n";
3540 ss <<
" double fCost,fRestVal,fPer,fRate;\n";
3541 ss <<
" int nDate,nFirstPer,nBase;\n";
3542 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
3543 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
3544 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
3545 FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
3546 FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
3547 FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
3548 FormulaToken *tmpCur6 = vSubArguments.size() < 7 ?
nullptr : vSubArguments[6]->GetFormulaToken();
3553 ss <<
" if(isnan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
3555 ss <<
" fCost = 0;\n else\n";
3558 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3564 ss <<
" if(isnan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
3566 ss <<
" nDate = 0;\n else\n";
3568 ss <<
" nDate=(int)";
3569 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
3575 ss <<
" if(isnan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
3577 ss <<
" nFirstPer = 0;\n else\n";
3579 ss <<
" nFirstPer=(int)";
3580 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
3586 ss <<
" if(isnan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
3588 ss <<
" fRestVal = 0;\n else\n";
3591 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
3597 ss <<
" if(isnan(" <<vSubArguments[4]->GenSlidingWindowDeclRef();
3599 ss <<
" fPer = 0;\n else\n";
3602 ss << vSubArguments[4]->GenSlidingWindowDeclRef();
3608 ss <<
" if(isnan(" <<vSubArguments[5]->GenSlidingWindowDeclRef();
3610 ss <<
" fRate = 0;\n else\n";
3613 ss << vSubArguments[5]->GenSlidingWindowDeclRef();
3615 if(tmpCur6 ==
nullptr)
3617 ss <<
" nBase = 0;\n";
3625 ss <<
" if(isnan(" <<vSubArguments[6]->GenSlidingWindowDeclRef();
3627 ss <<
" nBase = 0;\n else\n";
3629 ss <<
" nBase = (int)";
3630 ss << vSubArguments[6]->GenSlidingWindowDeclRef();
3633 ss <<
" uint nPer = convert_int( fPer );\n";
3634 ss <<
" double fUsePer = 1.0 *pow( fRate,-1);\n";
3635 ss <<
" double fAmorCoeff;\n";
3636 ss <<
" if( fUsePer < 3.0 )\n";
3637 ss <<
" fAmorCoeff = 1.0;\n";
3638 ss <<
" else if( fUsePer < 5.0 )\n";
3639 ss <<
" fAmorCoeff = 1.5;\n";
3640 ss <<
" else if( fUsePer <= 6.0 )\n";
3641 ss <<
" fAmorCoeff = 2.0;\n";
3643 ss <<
" fAmorCoeff = 2.5;\n";
3644 ss <<
" fRate *= fAmorCoeff;\n";
3645 ss <<
" tmp = Round( GetYearFrac( 693594,";
3646 ss <<
"nDate, nFirstPer, nBase ) * fRate * fCost);\n";
3647 ss <<
" fCost = fCost-tmp;\n";
3648 ss <<
" double fRest = fCost - fRestVal;\n";
3649 ss <<
" for( uint n = 0 ; n < nPer ; n++ )\n";
3651 ss <<
" tmp = Round( fRate * fCost);\n";
3652 ss <<
" fRest -= tmp;\n";
3653 ss <<
" if( fRest < 0.0 )\n";
3655 ss <<
" switch( nPer - n )\n";
3659 ss <<
" tmp = Round( fCost * 0.5);\n";
3661 ss <<
" tmp = 0.0;\n";
3664 ss <<
" fCost -= tmp;\n";
3666 ss <<
" return tmp;\n";
3669 void OpAmorlinc::BinInlineFun(std::set<std::string>& decls,
3670 std::set<std::string>& funs)
3681 void OpAmorlinc::GenSlidingWindowFunction(std::stringstream &ss,
3682 const std::string &sSymName,
SubArguments &vSubArguments)
3684 ss <<
"\ndouble " << sSymName;
3685 ss <<
"_"<< BinFuncName() <<
"(";
3686 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3690 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3693 ss <<
" int gid0 = get_global_id(0);\n";
3694 ss <<
" double tmp = 0;\n";
3695 ss <<
" double fCost,fRestVal,fPer,fRate;\n";
3696 ss <<
" int nDate,nFirstPer,nBase;\n";
3697 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
3698 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
3699 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
3700 FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
3701 FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
3702 FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
3703 FormulaToken *tmpCur6 = vSubArguments.size() < 7 ?
nullptr : vSubArguments[6]->GetFormulaToken();
3708 ss <<
" if(isnan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
3710 ss <<
" fCost = 0;\n else\n";
3713 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3719 ss <<
" if(isnan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
3721 ss <<
" nDate = 0;\n else\n";
3723 ss <<
" nDate=(int)";
3724 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
3730 ss <<
" if(isnan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
3732 ss <<
" nFirstPer = 0;\n else\n";
3734 ss <<
" nFirstPer=(int)";
3735 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
3741 ss <<
" if(isnan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
3743 ss <<
" fRestVal = 0;\n else\n";
3746 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
3752 ss <<
" if(isnan(" <<vSubArguments[4]->GenSlidingWindowDeclRef();
3754 ss <<
" fPer = 0;\n else\n";
3757 ss << vSubArguments[4]->GenSlidingWindowDeclRef();
3763 ss <<
" if(isnan(" <<vSubArguments[5]->GenSlidingWindowDeclRef();
3765 ss <<
" fRate = 0;\n else\n";
3768 ss << vSubArguments[5]->GenSlidingWindowDeclRef();
3770 if(tmpCur6 ==
nullptr)
3772 ss <<
" nBase = 0;\n";
3780 ss <<
" if(isnan(" <<vSubArguments[6]->GenSlidingWindowDeclRef();
3782 ss <<
" nBase = 0;\n else\n";
3784 ss <<
" nBase = (int)";
3785 ss << vSubArguments[6]->GenSlidingWindowDeclRef();
3788 ss <<
" int nPer = convert_int( fPer );\n";
3789 ss <<
" double fOneRate = fCost * fRate;\n";
3790 ss <<
" double fCostDelta = fCost - fRestVal;\n";
3791 ss <<
" double f0Rate = GetYearFrac( 693594,";
3792 ss <<
"nDate, nFirstPer, nBase )* fRate * fCost;\n";
3793 ss <<
" int nNumOfFullPeriods = (int)";
3794 ss <<
"( ( fCost - fRestVal - f0Rate) *pow(fOneRate,-1) );\n";
3795 ss <<
" if( nPer == 0 )\n";
3796 ss <<
" tmp = f0Rate;\n";
3797 ss <<
" else if( nPer <= nNumOfFullPeriods )\n";
3798 ss <<
" tmp = fOneRate;\n";
3799 ss <<
" else if( nPer == nNumOfFullPeriods + 1 )\n";
3800 ss <<
" tmp = fCostDelta - fOneRate * nNumOfFullPeriods - f0Rate;\n";
3802 ss <<
" tmp = 0.0;\n";
3803 ss <<
" return tmp;\n";
3806 void OpReceived::BinInlineFun(std::set<std::string>& decls,
3807 std::set<std::string>& funs)
3819 void OpReceived::GenSlidingWindowFunction(std::stringstream &ss,
3820 const std::string &sSymName,
SubArguments &vSubArguments)
3822 ss <<
"\ndouble " << sSymName;
3823 ss <<
"_"<< BinFuncName() <<
"(";
3824 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3828 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3831 ss <<
" double tmp = " << GetBottom() <<
";\n";
3832 ss <<
" int gid0 = get_global_id(0);\n";
3833 ss <<
" int nSettle, nMat;\n";
3834 ss <<
" double fInvest,fDisc;\n";
3835 ss <<
" int rOB;\n";
3836 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
3839 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
3842 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
3845 FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
3848 FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
3851 ss<<
" int buffer_settle_len = ";
3854 ss<<
" int buffer_mat_len = ";
3857 ss<<
" int buffer_invest_len = ";
3860 ss<<
" int buffer_disc_len = ";
3863 ss<<
" int buffer_rob_len = ";
3866 ss <<
" if(gid0 >= buffer_settle_len || isnan(";
3867 ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
3869 ss <<
" nSettle = 0;\n\telse\n";
3870 ss <<
" nSettle = (int)"<<vSubArguments[0]->GenSlidingWindowDeclRef();
3872 ss <<
" if(gid0 >= buffer_mat_len || isnan(";
3873 ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
3875 ss <<
" nMat = 0;\n\telse\n";
3876 ss <<
" nMat = (int)";
3877 ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
3879 ss <<
" if(gid0 >= buffer_invest_len || isnan(";
3880 ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
3882 ss <<
" fInvest = 0;\n\telse\n";
3883 ss <<
" fInvest = "<<vSubArguments[2]->GenSlidingWindowDeclRef();
3885 ss <<
" if(gid0 >= buffer_disc_len || isnan(";
3886 ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
3888 ss <<
" fDisc = 0;\n\telse\n";
3889 ss <<
" fDisc = "<<vSubArguments[3]->GenSlidingWindowDeclRef();
3891 ss <<
" if(gid0 >= buffer_rob_len || isnan(";
3892 ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
3894 ss <<
" rOB = 0;\n\telse\n";
3895 ss <<
" rOB = (int)"<<vSubArguments[4]->GenSlidingWindowDeclRef();
3897 ss <<
" double tmpvalue = (1.0-(fDisc";
3898 ss <<
" * GetYearDiff( GetNullDate()";
3899 ss <<
",nSettle,nMat,rOB)));\n";
3900 ss <<
" tmp = fInvest*pow(tmpvalue,-1);\n";
3901 ss <<
" return tmp;\n";
3905 void OpYielddisc::BinInlineFun(std::set<std::string>& decls,
3906 std::set<std::string>& funs)
3916 void OpYielddisc::GenSlidingWindowFunction(
3917 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
3920 ss <<
"\ndouble " << sSymName;
3921 ss <<
"_"<< BinFuncName() <<
"(";
3922 for (
size_t i = 0;
i < vSubArguments.size();
i++)
3926 vSubArguments[
i]->GenSlidingWindowDecl(ss);
3929 ss <<
"double tmp = 0;\n\t";
3930 ss <<
"int gid0 = get_global_id(0);\n\t";
3931 ss <<
"double tmp000;\n\t";
3932 ss <<
"double tmp001;\n\t";
3933 ss <<
"double tmp002;\n\t";
3934 ss <<
"double tmp003;\n\t";
3935 ss <<
"double tmp004;\n\t";
3937 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
3941 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
3945 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
3949 FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
3953 FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
3957 ss<<
"int buffer_tmp000_len = ";
3961 ss<<
"int buffer_tmp001_len = ";
3965 ss<<
"int buffer_tmp002_len = ";
3969 ss<<
"int buffer_tmp003_len = ";
3973 ss<<
"int buffer_tmp004_len = ";
3977 ss<<
"if(gid0>=buffer_tmp000_len || isnan(";
3978 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3980 ss<<
"tmp000 = 0;\n\telse \n\t\t";
3982 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3985 ss<<
"if(gid0>=buffer_tmp001_len || isnan(";
3986 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
3988 ss<<
"tmp001 = 0;\n\telse \n\t\t";
3990 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
3993 ss<<
"if(gid0>=buffer_tmp002_len || isnan(";
3994 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
3996 ss<<
"tmp002 = 0;\n\telse \n\t\t";
3998 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
4001 ss<<
"if(gid0>=buffer_tmp003_len || isnan(";
4002 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
4004 ss<<
"tmp003 = 0;\n\telse \n\t\t";
4006 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
4009 ss<<
"if(gid0>=buffer_tmp004_len || isnan(";
4010 ss << vSubArguments[4]->GenSlidingWindowDeclRef();
4012 ss<<
"tmp004 = 0;\n\telse \n\t\t";
4014 ss << vSubArguments[4]->GenSlidingWindowDeclRef();
4017 ss<<
"if(tmp002 <= 0 || tmp003 <= 0 || tmp000 >= tmp001 )\n";
4018 ss<<
" return CreateDoubleError(IllegalArgument);\n";
4019 ss<<
"tmp = (tmp003/tmp002)-1;\n\t";
4020 ss <<
"tmp /= GetYearFrac( GetNullDate(),tmp000,tmp001,tmp004);\n\t";
4021 ss <<
"return tmp;\n";
4025 void OpTbillprice::BinInlineFun(std::set<std::string>& decls,
4026 std::set<std::string>& funs)
4037 void OpTbillprice::GenSlidingWindowFunction(
4038 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
4040 ss <<
"\ndouble " << sSymName;
4041 ss <<
"_"<< BinFuncName() <<
"(";
4042 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4046 vSubArguments[
i]->GenSlidingWindowDecl(ss);
4049 ss <<
" int gid0 = get_global_id(0);\n";
4050 ss <<
" double tmp = 0;\n";
4052 ss <<
" int singleIndex = gid0;\n";
4053 ss <<
" int doubleIndex = gid0;\n";
4054 ss <<
" int i = gid0;\n";
4055 GenTmpVariables(ss,vSubArguments);
4056 CheckAllSubArgumentIsNan(ss,vSubArguments);
4058 ss <<
" tmp1+=1.0;\n";
4059 ss <<
" double fFraction =GetYearFrac(693594,tmp0,tmp1,0);\n";
4060 ss <<
" tmp = 100.0 * ( 1.0 - tmp2 * fFraction );\n";
4061 ss <<
" return tmp;\n";
4064 void RATE::BinInlineFun(std::set<std::string>& decls,
4065 std::set<std::string>& funs)
4072 void RATE::GenSlidingWindowFunction(
4073 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
4075 ss <<
"\ndouble " << sSymName;
4076 ss <<
"_"<< BinFuncName() <<
"(";
4077 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4081 vSubArguments[
i]->GenSlidingWindowDecl(ss);
4084 FormulaToken* pCur = vSubArguments[5]->GetFormulaToken();
4090 ss <<
" double result;\n";
4091 ss <<
" int gid0 = get_global_id(0);\n";
4092 ss <<
" bool bValid = true, bFound = false;\n";
4093 ss <<
" double fX, fXnew, fTerm, fTermDerivation;\n";
4094 ss <<
" double fGeoSeries, fGeoSeriesDerivation;\n";
4095 ss <<
" int nIterationsMax = 150;\n";
4096 ss <<
" int nCount = 0;\n";
4097 ss <<
" double fEpsilonSmall = 1.0E-14;\n";
4098 ss <<
" double arg0, arg1, arg2, arg3, arg4, arg5;\n";
4099 ss <<
" arg0=" << vSubArguments[0]->GenSlidingWindowDeclRef()<<
";\n";
4100 ss <<
" arg1=" << vSubArguments[1]->GenSlidingWindowDeclRef()<<
";\n";
4101 ss <<
" arg2=" << vSubArguments[2]->GenSlidingWindowDeclRef()<<
";\n";
4102 ss <<
" arg3=" << vSubArguments[3]->GenSlidingWindowDeclRef()<<
";\n";
4103 ss <<
" arg4=" << vSubArguments[4]->GenSlidingWindowDeclRef()<<
";\n";
4104 ss <<
" arg5=" << vSubArguments[5]->GenSlidingWindowDeclRef()<<
";\n";
4106 ss <<
" if (isnan(arg0) || isnan(arg1) || isnan(arg2)){\n";
4107 ss <<
" result = 523;\n";
4108 ss <<
" return result;\n";
4110 ss <<
" if (isnan(arg3))\n";
4111 ss <<
" arg3 = 0.0;\n";
4112 ss <<
" if (isnan(arg4))\n";
4113 ss <<
" arg4 = 0.0;\n";
4114 ss <<
" if (isnan(arg5))\n";
4115 ss <<
" arg5 = 0.1;\n";
4116 ss <<
" if (gid0 >= guessLen)\n";
4117 ss <<
" arg5 = 0.1;\n";
4118 ss <<
" arg3 = arg3 - arg1 * arg4;\n";
4119 ss <<
" arg2 = arg2 + arg1 * arg4;\n";
4120 ss <<
" if (arg0 == Round(arg0)){\n";
4121 ss <<
" fX = arg5;\n";
4122 ss <<
" double fPowN, fPowNminus1;\n";
4123 ss <<
" while (!bFound && nCount < nIterationsMax)\n";
4125 ss <<
" fPowNminus1 = pow( 1.0+fX, arg0-1.0);\n";
4126 ss <<
" fPowN = fPowNminus1 * (1.0+fX);\n";
4127 ss <<
" if (fX == 0.0)\n";
4129 ss <<
" fGeoSeries = arg0;\n";
4130 ss <<
" fGeoSeriesDerivation = arg0 * (arg0-1.0)";
4131 ss <<
"*pow(2.0,-1);\n";
4135 ss <<
" fGeoSeries = (fPowN-1.0)*pow(fX,-1);\n";
4136 ss <<
" fGeoSeriesDerivation =";
4137 ss <<
" arg0 * fPowNminus1 * pow( fX , -1) - fGeoSeries * pow(fX, -1);\n";
4139 ss <<
" fTerm = arg3 + arg2 *fPowN+ arg1 * fGeoSeries;\n";
4140 ss <<
" fTermDerivation = arg2 * arg0 * fPowNminus1 +";
4141 ss <<
"arg1 * fGeoSeriesDerivation;\n";
4142 ss <<
" if (fabs(fTerm) < fEpsilonSmall)\n";
4143 ss <<
" bFound = true;\n";
4146 ss <<
" if (fTermDerivation == 0.0)\n";
4147 ss <<
" fXnew = fX + 1.1 * SCdEpsilon;\n";
4149 ss <<
" fXnew = fX - fTerm ";
4150 ss <<
"*pow( fTermDerivation,-1);\n";
4151 ss <<
" nCount++;\n";
4152 ss <<
" bFound = (fabs(fXnew - fX) < SCdEpsilon);\n";
4153 ss <<
" fX = fXnew;\n";
4159 ss <<
" fX = (arg5 < -1.0) ? -1.0 : arg5;\n";
4160 ss <<
" while (bValid && !bFound && nCount < nIterationsMax)\n";
4162 ss <<
" if (fX == 0.0){\n";
4163 ss <<
" fGeoSeries = arg0;\n";
4164 ss <<
" fGeoSeriesDerivation = arg0 * ";
4165 ss <<
"(arg0-1.0)* pow(2.0,-1);\n";
4167 ss <<
" fGeoSeries = (pow( 1.0+fX, arg0) - 1.0)";
4168 ss <<
" *pow( fX,-1);\n";
4169 ss <<
" fGeoSeriesDerivation =";
4170 ss <<
" arg0 * pow(1.0+fX,arg0-1.0) *pow(fX,-1)";
4171 ss <<
" - fGeoSeries *pow( fX,-1);\n";
4173 ss <<
" fTerm = arg3 + arg2 *pow(1.0+fX, arg0)";
4174 ss <<
"+ arg1 * fGeoSeries;\n";
4175 ss <<
" fTermDerivation =";
4176 ss <<
"arg2*arg0*pow(1.0+fX,arg0-1.0)";
4177 ss <<
"+arg1*fGeoSeriesDerivation;\n";
4178 ss <<
" if (fabs(fTerm) < fEpsilonSmall)\n";
4179 ss <<
" bFound = true;\n";
4181 ss <<
" if (fTermDerivation == 0.0)\n";
4182 ss <<
" fXnew = fX + 1.1 * SCdEpsilon;\n";
4184 ss <<
" fXnew = fX - fTerm ";
4185 ss <<
"*pow( fTermDerivation,-1);\n";
4186 ss <<
" nCount++;\n";
4187 ss <<
" bFound = (fabs(fXnew - fX) < SCdEpsilon);\n";
4188 ss <<
" fX = fXnew;\n";
4189 ss <<
" bValid = (fX >= -1.0);\n";
4193 ss <<
" if (bValid && bFound)\n";
4194 ss <<
" result = fX;\n";
4196 ss <<
" result = 523;\n";
4197 ss <<
" return result;\n";
4201 void OpTbillyield::BinInlineFun(std::set<std::string>& decls,
4202 std::set<std::string>& funs)
4215 void OpTbillyield::GenSlidingWindowFunction(
4216 std::stringstream &ss,
const std::string &sSymName,
SubArguments &vSubArguments)
4218 ss <<
"\ndouble " << sSymName;
4219 ss <<
"_"<< BinFuncName() <<
"(";
4220 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4224 vSubArguments[
i]->GenSlidingWindowDecl(ss);
4227 ss <<
"int gid0 = get_global_id(0);\n\t";
4228 ss <<
"double tmp = 0;\n\t";
4229 ss <<
"double tmp000;\n\t";
4230 ss <<
"double tmp001;\n\t";
4231 ss <<
"double tmp002;\n\t";
4233 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
4237 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
4241 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
4245 ss<<
"int buffer_tmp000_len = ";
4249 ss<<
"int buffer_tmp001_len = ";
4253 ss<<
"int buffer_tmp002_len = ";
4257 ss<<
"if(gid0>=buffer_tmp000_len || isnan(";
4258 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
4260 ss<<
"tmp000 = 0;\n\telse \n\t\t";
4262 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
4265 ss<<
"if(gid0>=buffer_tmp001_len || isnan(";
4266 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
4268 ss<<
"tmp001 = 0;\n\telse \n\t\t";
4270 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
4273 ss<<
"if(gid0>=buffer_tmp002_len || isnan(";
4274 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
4276 ss<<
"tmp002 = 0;\n\telse \n\t\t";
4278 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
4280 ss <<
" int nDiff=GetDiffDate360(GetNullDate(),tmp000,tmp001,true);\n";
4282 ss <<
" tmp=100.0;\n";
4283 ss <<
" tmp = tmp *pow( tmp002,-1);\n";
4284 ss <<
" tmp = tmp - 1.0;\n";
4285 ss <<
" tmp = tmp * pow( nDiff,-1.0 );\n";
4286 ss <<
" tmp = tmp * 360.0;\n";
4287 ss <<
" return tmp;\n";
4290 void OpDDB::GenSlidingWindowFunction(std::stringstream& ss,
4291 const std::string &sSymName,
SubArguments& vSubArguments)
4293 ss <<
"\ndouble " << sSymName;
4294 ss <<
"_"<< BinFuncName() <<
"(";
4295 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4299 vSubArguments[
i]->GenSlidingWindowDecl(ss);
4302 ss <<
" int gid0 = get_global_id(0);\n";
4303 ss <<
" double tmp = 0;\n";
4304 ss <<
" double fCost, fSalvage, fLife, fPeriod, fFactor;\n";
4305 ss <<
" double fRate, fOldValue, fNewValue;\n";
4307 FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
4308 FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
4309 FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
4310 FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
4311 FormulaToken* tmpCur4 = vSubArguments[4]->GetFormulaToken();
4317 ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
4319 ss <<
" fCost = 0;\n else\n";
4321 ss <<
" fCost = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
4328 ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
4330 ss <<
" fSalvage = 0;\n else\n";
4332 ss <<
" fSalvage = ";
4333 ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
4340 ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
4342 ss <<
" fLife = 0;\n else\n";
4345 ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
4352 ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
4354 ss <<
" fPeriod = 0;\n else\n";
4356 ss <<
" fPeriod = "<<vSubArguments[3]->GenSlidingWindowDeclRef();
4363 ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
4365 ss <<
" fFactor = 0;\n else\n";
4367 ss <<
" fFactor = "<<vSubArguments[4]->GenSlidingWindowDeclRef();
4369 ss <<
" fRate = fFactor * pow(fLife,-1);\n";
4370 ss <<
" if (fRate >= 1.0)\n";
4372 ss <<
" fRate = 1.0;\n";
4373 ss <<
" if (fPeriod == 1.0)\n";
4374 ss <<
" fOldValue = fCost;\n";
4376 ss <<
" fOldValue = 0.0;\n";
4379 ss <<
" fOldValue = fCost * pow(1.0 - fRate, fPeriod - 1);\n";
4380 ss <<
" fNewValue = fCost * pow(1.0 - fRate, fPeriod);\n";
4381 ss <<
" if (fNewValue < fSalvage)\n";
4382 ss <<
" tmp = fOldValue - fSalvage;\n";
4384 ss <<
" tmp = fOldValue - fNewValue;\n";
4385 ss <<
" if (tmp < 0.0)\n";
4386 ss <<
" tmp = 0.0;\n";
4387 ss <<
" return tmp;\n";
4390 void OpPV::GenSlidingWindowFunction(
4391 std::stringstream &ss,
const std::string &sSymName,
SubArguments &
4394 ss <<
"\ndouble " << sSymName;
4395 ss <<
"_"<< BinFuncName() <<
"(";
4396 for (
size_t i = 0;
i < vSubArguments.size();
i++)
4400 vSubArguments[
i]->GenSlidingWindowDecl(ss);
4403 ss <<
" double result = 0;\n";
4404 ss <<
" int gid0 = get_global_id(0);\n";
4405 ss <<
" double rate;\n";
4406 ss <<
" double nper;\n";
4407 ss <<
" double pmt;\n";
4408 ss <<
" double fv;\n";
4409 ss <<
" double type;\n";
4411 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
4415 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
4419 FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
4423 if(vSubArguments.size()>3)
4425 FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
4428 ss<<
" int buffer_fv_len = ";
4433 if(vSubArguments.size()>4)
4435 FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
4438 ss<<
" int buffer_type_len = ";
4443 ss<<
" int buffer_rate_len = ";
4447 ss<<
" int buffer_nper_len = ";
4451 ss<<
" int buffer_pmt_len = ";
4455 ss<<
" if(gid0>=buffer_rate_len || isnan(";
4456 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
4458 ss<<
" rate = 0;\n else \n";
4460 ss << vSubArguments[0]->GenSlidingWindowDeclRef();
4463 ss<<
" if(gid0>=buffer_nper_len || isnan(";
4464 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
4466 ss<<
" nper = 0;\n else \n";
4468 ss << vSubArguments[1]->GenSlidingWindowDeclRef();
4471 ss<<
" if(gid0>=buffer_pmt_len || isnan(";
4472 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
4474 ss<<
" pmt = 0;\n else \n";
4476 ss << vSubArguments[2]->GenSlidingWindowDeclRef();
4479 if(vSubArguments.size()>3)
4481 ss<<
" if(gid0>=buffer_fv_len || isnan(";
4482 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
4484 ss<<
" fv = 0;\n else \n";
4486 ss << vSubArguments[3]->GenSlidingWindowDeclRef();
4493 if(vSubArguments.size()>4)
4495 ss<<
" if(gid0>=buffer_type_len || isnan(";
4496 ss << vSubArguments[4]->GenSlidingWindowDeclRef();
4498 ss<<
" type = 0;\n else \n";
4500 ss << vSubArguments[4]->GenSlidingWindowDeclRef();
4506 ss <<
" if(rate == 0)\n";
4507 ss <<
" result=fv+pmt*nper;\n";
4508 ss <<
" else if(type > 0)\n";
4509 ss <<
" result=(fv*pow(1+rate,-nper))+";
4510 ss <<
"(pmt*(1-pow(1+rate,-nper+1))*pow(rate,-1))+pmt;\n";
4512 ss <<
" result=(fv*pow(1+rate,-nper))+"