Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : */
9 :
10 : #include "op_financial.hxx"
11 :
12 : #include "formulagroup.hxx"
13 : #include "document.hxx"
14 : #include "formulacell.hxx"
15 : #include "tokenarray.hxx"
16 : #include "compiler.hxx"
17 : #include "interpre.hxx"
18 : #include "formula/vectortoken.hxx"
19 : #include <sstream>
20 :
21 : using namespace formula;
22 :
23 : namespace sc { namespace opencl {
24 : // Definitions of inline functions
25 : #include "opinlinefun_finacial.cxx"
26 :
27 0 : void RRI::GenSlidingWindowFunction(
28 : std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
29 : {
30 0 : ss << "\ndouble " << sSymName;
31 0 : ss << "_"<< BinFuncName() <<"(";
32 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
33 : {
34 0 : if (i)
35 0 : ss << ",";
36 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
37 : }
38 0 : ss << ") {\n";
39 0 : ss << " double tmp = " << GetBottom() <<";\n";
40 0 : ss << " int gid0 = get_global_id(0);\n";
41 0 : ss << " double fv;\n";
42 0 : ss << " double pv;\n";
43 0 : ss << " double nper;\n";
44 : #ifdef ISNAN
45 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
46 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
47 0 : formula::SingleVectorRefToken *>(tmpCur0);
48 :
49 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
50 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
51 0 : formula::SingleVectorRefToken *>(tmpCur1);
52 :
53 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
54 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
55 0 : formula::SingleVectorRefToken *>(tmpCur2);
56 :
57 0 : ss<< " int buffer_nper_len = ";
58 0 : ss<< tmpCurDVR0->GetArrayLength();
59 0 : ss << ";\n";
60 :
61 0 : ss<< " int buffer_pv_len = ";
62 0 : ss<< tmpCurDVR1->GetArrayLength();
63 0 : ss << ";\n";
64 :
65 0 : ss<< " int buffer_fv_len = ";
66 0 : ss<< tmpCurDVR2->GetArrayLength();
67 0 : ss << ";\n";
68 : #endif
69 :
70 : #ifdef ISNAN
71 0 : ss<<" if(gid0>=buffer_nper_len || isNan(";
72 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
73 0 : ss<<"))\n";
74 0 : ss<<" nper = 0;\n\telse \n";
75 : #endif
76 0 : ss<<" nper = ";
77 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
78 0 : ss<<";\n";
79 :
80 : #ifdef ISNAN
81 0 : ss<<" if(gid0>=buffer_pv_len || isNan(";
82 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
83 0 : ss<<"))\n";
84 0 : ss<<" pv = 0;\n\telse \n";
85 : #endif
86 0 : ss<<" pv = ";
87 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
88 0 : ss<<";\n";
89 :
90 : #ifdef ISNAN
91 0 : ss<<" if(gid0>=buffer_pv_len || isNan(";
92 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
93 0 : ss<<"))\n";
94 0 : ss<<" fv = 0;\n\telse \n";
95 : #endif
96 0 : ss<<" fv = ";
97 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
98 0 : ss<<";\n";
99 0 : ss << " tmp = pow(fv*pow(pv,-1),1.0*pow(nper,-1))-1;\n";
100 0 : ss << " return tmp;\n";
101 0 : ss << "}";
102 0 : }
103 :
104 0 : void OpNominal::GenSlidingWindowFunction(
105 : std::stringstream &ss, const std::string &sSymName, SubArguments &
106 : vSubArguments)
107 : {
108 0 : ss << "\ndouble " << sSymName;
109 0 : ss << "_"<< BinFuncName() <<"(";
110 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
111 : {
112 0 : if (i)
113 0 : ss << ",";
114 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
115 : }
116 0 : ss << ") {\n\t";
117 0 : ss << "double tmp = 0;\n\t";
118 0 : ss << "double temp = 0;\n\t";
119 0 : ss << "int gid0 = get_global_id(0);\n\t";
120 0 : ss << "double tmp0=0,tmp1=0;\n";
121 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
122 : {
123 0 : FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
124 : assert(pCur);
125 0 : if (pCur->GetType() == formula::svSingleVectorRef)
126 : {
127 : #ifdef ISNAN
128 : const formula::SingleVectorRefToken* pSVR =
129 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
130 0 : ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n";
131 : #else
132 : #endif
133 : }
134 0 : else if (pCur->GetType() == formula::svDouble)
135 : {
136 : #ifdef ISNAN
137 0 : ss << "{\n";
138 : #endif
139 : }
140 : else
141 : {
142 : #ifdef ISNAN
143 : #endif
144 : }
145 : #ifdef ISNAN
146 0 : if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
147 : {
148 0 : ss <<" temp="<<vSubArguments[i]->GenSlidingWindowDeclRef();
149 0 : ss <<";\n";
150 0 : ss <<" if (isNan(temp))\n";
151 0 : ss <<" tmp"<<i<<"= 0;\n";
152 0 : ss <<" else\n";
153 0 : ss <<" tmp"<<i<<"=temp;\n";
154 0 : ss <<" }\n";
155 : }
156 : else
157 : {
158 0 : ss <<" tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(
159 0 : );
160 0 : ss <<";\n";
161 : }
162 : #else
163 : ss <<" tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
164 : ss <<";\n";
165 : #endif
166 : }
167 0 : ss<<"if(tmp1==0)\n\t";
168 0 : ss<<"\treturn 0;\n\t";
169 0 : ss<<"tmp=pow( tmp1,-1);\n\t";
170 0 : ss<<"tmp=( pow( tmp0+ 1.0, tmp ) - 1.0 ) *";
171 0 : ss<<"tmp1;\n\t";
172 0 : ss << "return tmp;\n";
173 0 : ss << "}";
174 0 : }
175 :
176 0 : void OpDollarde::GenSlidingWindowFunction(
177 : std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
178 : {
179 0 : ss << "\ndouble " << sSymName;
180 0 : ss << "_"<< BinFuncName() <<"(";
181 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
182 : {
183 0 : if (i)
184 0 : ss << ",";
185 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
186 : }
187 0 : ss << ") {\n\t";
188 0 : ss << "double tmp = " << GetBottom() <<";\n\t";
189 0 : ss << "int gid0 = get_global_id(0);\n\t";
190 0 : ss << "double fInt = " << GetBottom() <<";\n\t";
191 0 : ss << "double dollar;\n\t";
192 0 : ss << "double fFrac;\n\t";
193 : #ifdef ISNAN
194 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
195 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
196 0 : formula::SingleVectorRefToken *>(tmpCur0);
197 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
198 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
199 0 : formula::SingleVectorRefToken *>(tmpCur1);
200 0 : ss<< "int buffer_dollar_len = ";
201 0 : ss<< tmpCurDVR0->GetArrayLength();
202 0 : ss << ";\n\t";
203 0 : ss<< "int buffer_frac_len = ";
204 0 : ss<< tmpCurDVR1->GetArrayLength();
205 0 : ss << ";\n\t";
206 : #endif
207 : #ifdef ISNAN
208 0 : ss<<"if((gid0)>=buffer_dollar_len || isNan(";
209 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
210 0 : ss<<"))\n\t\t";
211 0 : ss<<"dollar = 0;\n\telse \n\t\t";
212 : #endif
213 0 : ss<<"dollar = ";
214 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
215 0 : ss<<";\n\t";
216 : #ifdef ISNAN
217 0 : ss<<"if((gid0)>=buffer_frac_len || isNan(";
218 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
219 0 : ss<<"))\n\t\t";
220 0 : ss<<"fFrac = 0;\n\telse \n\t\t";
221 : #endif
222 0 : ss<<"fFrac = ";
223 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
224 0 : ss<<";\n\t";
225 0 : ss << "tmp = modf( dollar , &fInt );\n\t";
226 0 : ss << "tmp /= fFrac;\n\t";
227 0 : ss << "tmp *= pow( 10.0 , ceil( log10(fFrac ) ) );\n\t";
228 0 : ss << "tmp += fInt;\t";
229 0 : ss << "\n\treturn tmp;\n";
230 0 : ss << "}";
231 0 : }
232 :
233 0 : void OpDollarfr::GenSlidingWindowFunction(std::stringstream &ss,
234 : const std::string &sSymName, SubArguments &vSubArguments)
235 : {
236 0 : ss << "\ndouble " << sSymName;
237 0 : ss << "_"<< BinFuncName() <<"(";
238 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
239 : {
240 0 : if (i)
241 0 : ss << ",";
242 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
243 : }
244 0 : ss << ") {\n\t";
245 0 : ss << "double tmp = " << GetBottom() <<";\n\t";
246 0 : ss << "int gid0 = get_global_id(0);\n\t";
247 0 : ss << "double fInt = " << GetBottom() <<";\n\t";
248 0 : ss << "double dollar;\n\t";
249 0 : ss << "double fFrac;\n\t";
250 : #ifdef ISNAN
251 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
252 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
253 0 : formula::SingleVectorRefToken *>(tmpCur0);
254 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
255 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
256 0 : formula::SingleVectorRefToken *>(tmpCur1);
257 0 : ss<< "int buffer_dollar_len = ";
258 0 : ss<< tmpCurDVR0->GetArrayLength();
259 0 : ss << ";\n\t";
260 0 : ss<< "int buffer_frac_len = ";
261 0 : ss<< tmpCurDVR1->GetArrayLength();
262 0 : ss << ";\n\t";
263 : #endif
264 : #ifdef ISNAN
265 0 : ss<<"if((gid0)>=buffer_dollar_len || isNan(";
266 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
267 0 : ss<<"))\n\t\t";
268 0 : ss<<"dollar = 0;\n\telse \n\t\t";
269 : #endif
270 0 : ss<<"dollar = ";
271 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
272 0 : ss<<";\n\t";
273 : #ifdef ISNAN
274 0 : ss<<"if((gid0)>=buffer_frac_len || isNan(";
275 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
276 0 : ss<<"))\n\t\t";
277 0 : ss<<"fFrac = 0;\n\telse \n\t\t";
278 : #endif
279 0 : ss<<"fFrac = ";
280 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
281 0 : ss<<";\n\t";
282 0 : ss << "tmp = modf( dollar , &fInt );\n\t";
283 0 : ss << "tmp *= fFrac;\n\t";
284 0 : ss << "tmp *= pow( 10.0 , -ceil( log10(fFrac ) ) );\n\t";
285 0 : ss << "tmp += fInt;\t";
286 0 : ss << "\n\treturn tmp;\n";
287 0 : ss << "}";
288 0 : }
289 :
290 0 : void OpDISC::BinInlineFun(std::set<std::string>& decls,
291 : std::set<std::string>& funs)
292 : {
293 0 : decls.insert(GetYearFrac_newDecl);decls.insert(DaysToDate_newDecl);
294 0 : decls.insert(DaysInMonthDecl);decls.insert(IsLeapYearDecl);
295 0 : funs.insert(GetYearFrac_new);funs.insert(DaysToDate_new);
296 0 : funs.insert(DaysInMonth);funs.insert(IsLeapYear);
297 0 : }
298 :
299 0 : void OpDISC::GenSlidingWindowFunction(std::stringstream& ss,
300 : const std::string &sSymName, SubArguments& vSubArguments)
301 : {
302 0 : ss << "\ndouble " << sSymName;
303 0 : ss << "_" << BinFuncName() << "(";
304 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
305 : {
306 0 : if (i)
307 0 : ss << ",";
308 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
309 : }
310 0 : ss << ") {\n\t";
311 0 : ss << " double tmp = " << GetBottom() << ";\n";
312 0 : ss << " int gid0 = get_global_id(0);\n";
313 0 : ss << " double arg0 = " << GetBottom() << ";\n";
314 0 : ss << " double arg1 = " << GetBottom() << ";\n";
315 0 : ss << " double arg2 = " << GetBottom() << ";\n";
316 0 : ss << " double arg3 = " << GetBottom() << ";\n";
317 0 : ss << " double arg4 = " << GetBottom() << ";\n";
318 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
319 : {
320 0 : FormulaToken* pCur = vSubArguments[i]->GetFormulaToken();
321 : assert(pCur);
322 0 : if (pCur->GetType() == formula::svSingleVectorRef)
323 : {
324 : #ifdef ISNAN
325 : const formula::SingleVectorRefToken* pSVR =
326 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
327 0 : ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n";
328 : #endif
329 : }
330 0 : else if (pCur->GetType() == formula::svDouble)
331 : {
332 : #ifdef ISNAN
333 0 : ss << " {\n";
334 : #endif
335 : }
336 : #ifdef ISNAN
337 0 : if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
338 : {
339 0 : ss << " if (isNan(";
340 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef();
341 0 : ss << "))\n";
342 0 : ss << " arg" << i << " = 0;\n";
343 0 : ss << " else\n";
344 0 : ss << " arg" << i << " = ";
345 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
346 0 : ss << " }\n";
347 : }
348 : else
349 : {
350 0 : ss << " arg" << i << " = ";
351 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
352 : }
353 : #else
354 : ss << " arg" << i;
355 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
356 : #endif
357 : }
358 0 : ss << " int nNullDate = 693594;\n";
359 0 : ss << " tmp = 1.0 - arg2 / arg3;\n";
360 0 : ss << " tmp /=";
361 0 : ss << " GetYearFrac_new(nNullDate, (int)arg0, (int)arg1, (int)arg4);\n";
362 0 : ss << " return tmp;\n";
363 0 : ss << "}";
364 0 : }
365 :
366 :
367 0 : void OpINTRATE::BinInlineFun(std::set<std::string>& decls,
368 : std::set<std::string>& funs)
369 : {
370 0 : decls.insert(GetYearDiff_newDecl);decls.insert(GetDiffDate_newDecl);
371 0 : decls.insert(DaysToDate_newDecl);decls.insert(GetNullDateDecl);
372 0 : decls.insert(DateToDaysDecl);decls.insert(DaysInMonthDecl);
373 0 : decls.insert(IsLeapYearDecl);
374 0 : funs.insert(GetYearDiff_new);funs.insert(GetDiffDate_new);
375 0 : funs.insert(DaysToDate_new);funs.insert(GetNullDate);
376 0 : funs.insert(DateToDays);funs.insert(DaysInMonth);
377 0 : funs.insert(IsLeapYear);
378 0 : }
379 :
380 0 : void OpINTRATE::GenSlidingWindowFunction(std::stringstream& ss,
381 : const std::string &sSymName, SubArguments& vSubArguments)
382 : {
383 0 : ss << "\ndouble " << sSymName;
384 0 : ss << "_" << BinFuncName() << "(";
385 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
386 : {
387 0 : if (i)
388 0 : ss << ",";
389 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
390 : }
391 0 : ss << ") {\n";
392 0 : ss << " double tmp = " << GetBottom() << ";\n";
393 0 : ss << " int gid0 = get_global_id(0);\n";
394 0 : ss << " double arg0 = " << GetBottom() << ";\n";
395 0 : ss << " double arg1 = " << GetBottom() << ";\n";
396 0 : ss << " double arg2 = " << GetBottom() << ";\n";
397 0 : ss << " double arg3 = " << GetBottom() << ";\n";
398 0 : ss << " double arg4 = " << GetBottom() << ";\n";
399 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
400 : {
401 0 : FormulaToken* pCur = vSubArguments[i]->GetFormulaToken();
402 : assert(pCur);
403 0 : if (pCur->GetType() == formula::svSingleVectorRef)
404 : {
405 : #ifdef ISNAN
406 : const formula::SingleVectorRefToken* pSVR =
407 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
408 0 : ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n";
409 : #endif
410 : }
411 0 : else if (pCur->GetType() == formula::svDouble)
412 : {
413 : #ifdef ISNAN
414 0 : ss << " {\n";
415 : #endif
416 : }
417 : #ifdef ISNAN
418 0 : if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
419 : {
420 0 : ss << " if (isNan(";
421 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef();
422 0 : ss << "))\n";
423 0 : ss << " arg" << i << " = 0;\n";
424 0 : ss << " else\n";
425 0 : ss << " arg" << i << " = ";
426 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
427 0 : ss << " }\n";
428 : }
429 : else
430 : {
431 0 : ss << " arg" << i << " = ";
432 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
433 : }
434 : #else
435 : ss << " arg" << i;
436 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
437 : #endif
438 : }
439 0 : ss << " int nNullDate = GetNullDate();\n";
440 0 : ss << " tmp = arg3 * pow(arg2,-1) - 1.0;\n";
441 0 : ss << " tmp = tmp * pow(GetYearDiff_new(nNullDate, (int)arg0,";
442 0 : ss << " (int)arg1,(int)arg4),-1);\n";
443 0 : ss << " return tmp;\n";
444 0 : ss << "}";
445 0 : }
446 :
447 0 : void OpFV::BinInlineFun(std::set<std::string>& decls,
448 : std::set<std::string>& funs)
449 : {
450 0 : decls.insert(GetZwDecl);
451 0 : funs.insert(GetZw);
452 0 : }
453 :
454 0 : void OpFV::GenSlidingWindowFunction(std::stringstream& ss,
455 : const std::string &sSymName, SubArguments& vSubArguments)
456 : {
457 0 : ss << "\ndouble " << sSymName;
458 0 : ss << "_"<< BinFuncName() <<"(";
459 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
460 : {
461 0 : if (i)
462 0 : ss << ",";
463 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
464 : }
465 0 : ss << ") {\n";
466 0 : ss << " double tmp = " << GetBottom() << ";\n";
467 0 : ss << " int gid0 = get_global_id(0);\n";
468 0 : ss << " double arg0 = " << GetBottom() << ";\n";
469 0 : ss << " double arg1 = " << GetBottom() << ";\n";
470 0 : ss << " double arg2 = " << GetBottom() << ";\n";
471 0 : ss << " double arg3 = " << GetBottom() << ";\n";
472 0 : ss << " double arg4 = " << GetBottom() << ";\n";
473 0 : unsigned j = vSubArguments.size();
474 0 : while (j--)
475 : {
476 0 : FormulaToken* pCur = vSubArguments[j]->GetFormulaToken();
477 : assert(pCur);
478 0 : if(pCur->GetType() == formula::svSingleVectorRef)
479 : {
480 : #ifdef ISNAN
481 : const formula::SingleVectorRefToken* pSVR =
482 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
483 0 : ss << " if(gid0 >= " << pSVR->GetArrayLength() << " || isNan(";
484 0 : ss << vSubArguments[j]->GenSlidingWindowDeclRef();
485 0 : ss << "))\n";
486 0 : ss << " arg" << j << " = " <<GetBottom() << ";\n";
487 0 : ss << " else\n";
488 : #endif
489 0 : ss << " arg" << j << " = ";
490 0 : ss << vSubArguments[j]->GenSlidingWindowDeclRef();
491 0 : ss << ";\n";
492 : }
493 : }
494 0 : ss << " tmp = GetZw(arg0, arg1, arg2, arg3, arg4);\n";
495 0 : ss << " return tmp;\n";
496 0 : ss << "}";
497 0 : }
498 :
499 0 : void OpIPMT::BinInlineFun(std::set<std::string>& decls,
500 : std::set<std::string>& funs)
501 : {
502 0 : decls.insert(GetZwDecl);
503 0 : funs.insert(GetZw);
504 0 : }
505 :
506 0 : void OpIPMT::GenSlidingWindowFunction(std::stringstream& ss,
507 : const std::string &sSymName, SubArguments& vSubArguments)
508 : {
509 0 : ss << "\ndouble " << sSymName;
510 0 : ss << "_"<< BinFuncName() <<"(";
511 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
512 : {
513 0 : if (i)
514 0 : ss << ",";
515 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
516 : }
517 0 : ss << ") {\n";
518 0 : ss << " double tmp = " << GetBottom() << ";\n";
519 0 : ss << " int gid0 = get_global_id(0);\n";
520 0 : ss << " double arg0 = " << GetBottom() << ";\n";
521 0 : ss << " double arg1 = " << GetBottom() << ";\n";
522 0 : ss << " double arg2 = " << GetBottom() << ";\n";
523 0 : ss << " double arg3 = " << GetBottom() << ";\n";
524 0 : ss << " double arg4 = " << GetBottom() << ";\n";
525 0 : ss << " double arg5 = " << GetBottom() << ";\n";
526 0 : unsigned j = vSubArguments.size();
527 0 : while (j--)
528 : {
529 0 : FormulaToken* pCur = vSubArguments[j]->GetFormulaToken();
530 : assert(pCur);
531 0 : if(pCur->GetType() == formula::svSingleVectorRef)
532 : {
533 : #ifdef ISNAN
534 : const formula::SingleVectorRefToken* pSVR =
535 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
536 0 : ss << " if(gid0 >= " << pSVR->GetArrayLength() << " || isNan(";
537 0 : ss << vSubArguments[j]->GenSlidingWindowDeclRef();
538 0 : ss << "))\n";
539 0 : ss << " arg" << j << " = " <<GetBottom() << ";\n";
540 0 : ss << " else\n";
541 : #endif
542 0 : ss << " arg" << j << " = ";
543 0 : ss << vSubArguments[j]->GenSlidingWindowDeclRef();
544 0 : ss << ";\n";
545 : }
546 : }
547 0 : ss << " double pmt ;\n";
548 0 : ss << " if(arg0 == 0.0)\n";
549 0 : ss << " return 0;\n";
550 0 : ss << " double temp1 = 0;\n";
551 0 : ss << " double abl = pow(1.0 + arg0, arg2);\n";
552 0 : ss << " temp1 -= arg4;\n";
553 0 : ss << " temp1 -= arg3 * abl;\n";
554 0 : ss << " pmt = temp1 / (1.0 + arg0 * arg5) /";
555 0 : ss << " ( (abl - 1.0) / arg0);\n";
556 0 : ss << " double temp = pow( 1 + arg0, arg1 - 2);\n";
557 0 : ss << " if(arg1 == 1.0)\n";
558 0 : ss << " {\n";
559 0 : ss << " if(arg5 > 0.0)\n";
560 0 : ss << " tmp = 0.0;\n";
561 0 : ss << " else\n";
562 0 : ss << " tmp = -arg3;\n";
563 0 : ss << " }\n";
564 0 : ss << " else\n";
565 0 : ss << " {\n";
566 0 : ss << " if(arg5 > 0.0)\n";
567 0 : ss << " tmp = GetZw(arg0, arg1 - 2.0, pmt, arg3, 1.0)";
568 0 : ss << " - pmt;\n";
569 0 : ss << " else\n";
570 0 : ss << " tmp = GetZw(arg0, arg1 - 1.0, pmt, arg3, 0.0);\n";
571 0 : ss << " }\n";
572 0 : ss << " tmp = tmp * arg0;\n";
573 0 : ss << " return tmp;\n";
574 0 : ss << "}";
575 0 : }
576 0 : void OpISPMT::GenSlidingWindowFunction(std::stringstream& ss,
577 : const std::string &sSymName, SubArguments& vSubArguments)
578 : {
579 0 : ss << "\ndouble " << sSymName;
580 0 : ss << "_" << BinFuncName() <<"(";
581 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
582 : {
583 0 : if (i)
584 0 : ss << ",";
585 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
586 : }
587 0 : ss << ") {\n";
588 0 : ss << " double tmp = " << GetBottom() << ";\n";
589 0 : ss << " int gid0 = get_global_id(0);\n";
590 0 : ss << " double arg0 = " << GetBottom() << ";\n";
591 0 : ss << " double arg1 = " << GetBottom() << ";\n";
592 0 : ss << " double arg2 = " << GetBottom() << ";\n";
593 0 : ss << " double arg3 = " << GetBottom() << ";\n";
594 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
595 : {
596 0 : FormulaToken* pCur = vSubArguments[i]->GetFormulaToken();
597 : assert(pCur);
598 0 : if (pCur->GetType() == formula::svSingleVectorRef)
599 : {
600 : #ifdef ISNAN
601 : const formula::SingleVectorRefToken* pSVR =
602 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
603 0 : ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n";
604 : #endif
605 : }
606 0 : else if (pCur->GetType() == formula::svDouble)
607 : {
608 : #ifdef ISNAN
609 0 : ss << " {\n";
610 : #endif
611 : }
612 : #ifdef ISNAN
613 0 : if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
614 : {
615 0 : ss << " if (isNan(";
616 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef();
617 0 : ss << "))\n";
618 0 : ss << " arg" << i << " = 0;\n";
619 0 : ss << " else\n";
620 0 : ss << " arg" << i << " = ";
621 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
622 0 : ss << " }\n";
623 : }
624 : else
625 : {
626 0 : ss << " arg" << i << " = ";
627 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
628 : }
629 : #else
630 : ss << " arg" << i;
631 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
632 : #endif
633 : }
634 0 : ss << " tmp = arg3 * arg0 * ( arg1 - arg2) * pow(arg2, -1);\n";
635 0 : ss << " return tmp;\n";
636 0 : ss << "}";
637 0 : }
638 :
639 0 : void OpDuration::GenSlidingWindowFunction(std::stringstream& ss,
640 : const std::string &sSymName, SubArguments& vSubArguments)
641 : {
642 0 : ss << "\ndouble " << sSymName;
643 0 : ss << "_" << BinFuncName() <<"(";
644 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
645 : {
646 0 : if (i)
647 0 : ss << ",";
648 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
649 : }
650 0 : ss << ") {\n";
651 0 : ss << " double tmp = " << GetBottom() << ";\n";
652 0 : ss << " int gid0 = get_global_id(0);\n";
653 0 : ss << " double arg0 = " << GetBottom() << ";\n";
654 0 : ss << " double arg1 = " << GetBottom() << ";\n";
655 0 : ss << " double arg2 = " << GetBottom() << ";\n";
656 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
657 : {
658 0 : FormulaToken* pCur = vSubArguments[i]->GetFormulaToken();
659 : assert(pCur);
660 0 : if (pCur->GetType() == formula::svSingleVectorRef)
661 : {
662 : #ifdef ISNAN
663 : const formula::SingleVectorRefToken* pSVR =
664 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
665 0 : ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n";
666 : #endif
667 : }
668 0 : else if (pCur->GetType() == formula::svDouble)
669 : {
670 : #ifdef ISNAN
671 0 : ss << " {\n";
672 : #endif
673 : }
674 : #ifdef ISNAN
675 0 : if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
676 : {
677 0 : ss << " if (isNan(";
678 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef();
679 0 : ss << "))\n";
680 0 : ss << " arg" << i << " = 0;\n";
681 0 : ss << " else\n";
682 0 : ss << " arg" << i << " = ";
683 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
684 0 : ss << " }\n";
685 : }
686 : else
687 : {
688 0 : ss << " arg" << i << " = ";
689 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
690 : }
691 : #else
692 : ss << " arg" << i;
693 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
694 : #endif
695 : }
696 0 : ss << " tmp = log(arg2 * pow( arg1,-1)) / log(arg0 + 1.0);\n";
697 0 : ss << " return tmp;\n";
698 0 : ss << "}";
699 0 : }
700 :
701 0 : void OpDuration_ADD::BinInlineFun(std::set<std::string>& decls,
702 : std::set<std::string>& funs)
703 : {
704 0 : decls.insert(GetDurationDecl);decls.insert(lcl_GetcoupnumDecl);
705 0 : decls.insert(GetYearFracDecl);decls.insert(DaysToDateDecl);
706 0 : decls.insert(GetNullDateDecl);decls.insert(DateToDaysDecl);
707 0 : decls.insert(DaysInMonthDecl);decls.insert(IsLeapYearDecl);
708 0 : funs.insert(GetDuration);funs.insert(lcl_Getcoupnum);
709 0 : funs.insert(GetYearFrac);funs.insert(DaysToDate);
710 0 : funs.insert(GetNullDate);funs.insert(DateToDays);
711 0 : funs.insert(DaysInMonth);funs.insert(IsLeapYear);
712 0 : }
713 :
714 0 : void OpDuration_ADD::GenSlidingWindowFunction(std::stringstream& ss,
715 : const std::string &sSymName, SubArguments& vSubArguments)
716 : {
717 0 : ss << "\ndouble " << sSymName;
718 0 : ss << "_"<< BinFuncName() <<"(";
719 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
720 : {
721 0 : if (i)
722 0 : ss << ",";
723 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
724 : }
725 0 : ss << ") {\n";
726 0 : ss << " double tmp = " << GetBottom() << ";\n";
727 0 : ss << " int gid0 = get_global_id(0);\n";
728 0 : ss << " double arg0 = " << GetBottom() << ";\n";
729 0 : ss << " double arg1 = " << GetBottom() << ";\n";
730 0 : ss << " double arg2 = " << GetBottom() << ";\n";
731 0 : ss << " double arg3 = " << GetBottom() << ";\n";
732 0 : ss << " double arg4 = " << GetBottom() << ";\n";
733 0 : ss << " double arg5 = " << GetBottom() << ";\n";
734 0 : unsigned j = vSubArguments.size();
735 0 : while (j--)
736 : {
737 0 : FormulaToken* pCur = vSubArguments[j]->GetFormulaToken();
738 : assert(pCur);
739 0 : if(pCur->GetType() == formula::svSingleVectorRef)
740 : {
741 : #ifdef ISNAN
742 : const formula::SingleVectorRefToken* pSVR =
743 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
744 0 : ss << " if(gid0 >= " << pSVR->GetArrayLength() << " || isNan(";
745 0 : ss << vSubArguments[j]->GenSlidingWindowDeclRef();
746 0 : ss << "))\n";
747 0 : ss << " arg" << j << " = " <<GetBottom() << ";\n";
748 0 : ss << " else\n";
749 : #endif
750 0 : ss << " arg" << j << " = ";
751 0 : ss << vSubArguments[j]->GenSlidingWindowDeclRef();
752 0 : ss << ";\n";
753 : }
754 : }
755 0 : ss << " int nNullDate = GetNullDate();\n";
756 0 : ss << " tmp = GetDuration( nNullDate, (int)arg0, (int)arg1, arg2,";
757 0 : ss << " arg3, (int)arg4, (int)arg5);\n";
758 0 : ss << " return tmp;\n";
759 0 : ss << "}";
760 0 : }
761 0 : void OpMDuration::BinInlineFun(std::set<std::string>& decls,
762 : std::set<std::string>& funs)
763 : {
764 0 : decls.insert(GetDuration_newDecl);decls.insert(lcl_Getcoupnum_newDecl);
765 0 : decls.insert(addMonthsDecl);decls.insert(checklessthanDecl);
766 0 : decls.insert(setDayDecl);decls.insert(ScaDateDecl);
767 0 : decls.insert(GetYearFracDecl);decls.insert(DaysToDateDecl);
768 0 : decls.insert(DaysInMonthDecl);decls.insert(IsLeapYearDecl);
769 0 : funs.insert(GetDuration_new);funs.insert(lcl_Getcoupnum_new);
770 0 : funs.insert(addMonths);funs.insert(checklessthan);
771 0 : funs.insert(setDay);funs.insert(ScaDate);
772 0 : funs.insert(GetYearFrac);funs.insert(DaysToDate);
773 0 : funs.insert(DaysInMonth);funs.insert(IsLeapYear);
774 0 : }
775 :
776 0 : void OpMDuration::GenSlidingWindowFunction(std::stringstream& ss,
777 : const std::string &sSymName, SubArguments& vSubArguments)
778 : {
779 0 : ss << "\ndouble " << sSymName;
780 0 : ss << "_"<< BinFuncName() <<"(";
781 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
782 : {
783 0 : if (i)
784 0 : ss << ",";
785 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
786 : }
787 0 : ss << ") {\n";
788 0 : ss << " double tmp = " << GetBottom() << ";\n";
789 0 : ss << " int gid0 = get_global_id(0);\n";
790 0 : ss << " double arg0 = " << GetBottom() << ";\n";
791 0 : ss << " double arg1 = " << GetBottom() << ";\n";
792 0 : ss << " double arg2 = " << GetBottom() << ";\n";
793 0 : ss << " double arg3 = " << GetBottom() << ";\n";
794 0 : ss << " double arg4 = " << GetBottom() << ";\n";
795 0 : ss << " double arg5 = " << GetBottom() << ";\n";
796 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
797 : {
798 0 : FormulaToken* pCur = vSubArguments[i]->GetFormulaToken();
799 : assert(pCur);
800 0 : if (pCur->GetType() == formula::svSingleVectorRef)
801 : {
802 : #ifdef ISNAN
803 : const formula::SingleVectorRefToken* pSVR =
804 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
805 0 : ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n";
806 : #endif
807 : }
808 0 : else if (pCur->GetType() == formula::svDouble)
809 : {
810 : #ifdef ISNAN
811 0 : ss << " {\n";
812 : #endif
813 : }
814 : #ifdef ISNAN
815 0 : if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
816 : {
817 0 : ss << " if (isNan(";
818 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef();
819 0 : ss << "))\n";
820 0 : ss << " arg" << i << " = 0;\n";
821 0 : ss << " else\n";
822 0 : ss << " arg" << i << " = ";
823 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
824 0 : ss << " }\n";
825 : }
826 : else
827 : {
828 0 : ss << " arg" << i << " = ";
829 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
830 : }
831 : #else
832 : ss << " arg" << i;
833 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
834 : #endif
835 : }
836 0 : ss << " int nNullDate = 693594;\n";
837 0 : ss << " tmp = GetDuration_new( nNullDate, (int)arg0, (int)arg1, arg2,";
838 0 : ss << " arg3, (int)arg4, (int)arg5);\n";
839 0 : ss << " tmp = tmp * pow(1.0 + arg3 * pow((int)arg4, -1.0), -1);\n";
840 0 : ss << " return tmp;\n";
841 0 : ss << "}";
842 0 : }
843 0 : void Fvschedule::GenSlidingWindowFunction(
844 : std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
845 : {
846 0 : FormulaToken* pCur = vSubArguments[1]->GetFormulaToken();
847 : assert(pCur);
848 : const formula::DoubleVectorRefToken* pCurDVR =
849 0 : static_cast<const formula::DoubleVectorRefToken *>(pCur);
850 0 : size_t nCurWindowSize = pCurDVR->GetRefRowSize();
851 0 : ss << "\ndouble " << sSymName;
852 0 : ss << "_"<< BinFuncName() <<"(";
853 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
854 : {
855 0 : if (i)
856 0 : ss << ",";
857 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
858 : }
859 0 : ss << ") {\n\t";
860 0 : ss << "double tmp = 1.0;\n\t";
861 0 : ss << "int gid0 = get_global_id(0);\n\t";
862 0 : ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
863 0 : ss << ";\n\t";
864 : #ifdef ISNAN
865 0 : ss << "if (isNan(arg0))\n\t\t";
866 0 : ss << "arg0 = 0;\n\t";
867 : #endif
868 0 : ss << "double arg1;\n\t";
869 0 : ss << "int arrayLength = " << pCurDVR->GetArrayLength() << ";\n\t";
870 : #ifdef ISNAN
871 0 : ss << "for (int i = 0; i + gid0 < arrayLength &&";
872 0 : ss << " i < " << nCurWindowSize << "; i++){\n\t\t";
873 : #else
874 : ss << "for (int i = 0; i < " << nCurWindowSize << "; i++){\n\t\t";
875 : #endif
876 0 : ss << "arg1 = ";
877 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n\t\t\t";
878 : #ifdef ISNAN
879 0 : ss << "if (isNan(arg1))\n\t\t\t\t";
880 0 : ss << "arg1 = 0;\n\t\t\t";
881 : #endif
882 0 : ss << "tmp *= arg1 + 1.0;\n\t\t";
883 0 : ss << "}\n\t";
884 0 : ss << "return (double)tmp * arg0";
885 0 : ss << ";\n}";
886 0 : }
887 0 : void Cumipmt::BinInlineFun(std::set<std::string>& decls,
888 : std::set<std::string>& funs)
889 : {
890 0 : decls.insert(GetRmz_newDecl); decls.insert(GetZw_newDecl);
891 0 : funs.insert(GetRmz_new);funs.insert(GetZw_new);
892 0 : }
893 0 : void Cumipmt::GenSlidingWindowFunction(
894 : std::stringstream &ss, const std::string &sSymName, SubArguments &
895 : vSubArguments)
896 : {
897 0 : ss << "\ndouble " << sSymName;
898 0 : ss << "_"<< BinFuncName() <<"(";
899 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
900 : {
901 0 : if (i)
902 0 : ss << ",";
903 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
904 : }
905 0 : ss << ") {\n";
906 0 : ss << " int gid0 = get_global_id(0);\n";
907 0 : ss << " double fRate,fVal;\n";
908 0 : ss << " int nStartPer,nEndPer,nNumPeriods,nPayType;\n";
909 : #ifdef ISNAN
910 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
911 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
912 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
913 0 : FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
914 0 : FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
915 0 : FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
916 : #endif
917 : #ifdef ISNAN
918 0 : if(tmpCur0->GetType() == formula::svSingleVectorRef)
919 : {
920 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
921 0 : formula::SingleVectorRefToken *>(tmpCur0);
922 0 : ss <<" if(gid0 >= "<<tmpCurDVR0->GetArrayLength()<<" || isNan(";
923 0 : ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
924 0 : ss <<"))\n";
925 0 : ss <<" fRate = 0;\n else\n";
926 : }
927 : #endif
928 0 : ss <<" fRate = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
929 0 : ss <<";\n";
930 : #ifdef ISNAN
931 0 : if(tmpCur1->GetType() == formula::svSingleVectorRef)
932 : {
933 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
934 0 : formula::SingleVectorRefToken *>(tmpCur1);
935 0 : ss <<" if(gid0 >= "<<tmpCurDVR1->GetArrayLength()<<" || isNan(";
936 0 : ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
937 0 : ss <<"))\n";
938 0 : ss <<" nNumPeriods = 0;\n else\n";
939 : }
940 : #endif
941 0 : ss <<" nNumPeriods = (int)";
942 0 : ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
943 0 : ss <<";\n";
944 : #ifdef ISNAN
945 0 : if(tmpCur2->GetType() == formula::svSingleVectorRef)
946 : {
947 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
948 0 : formula::SingleVectorRefToken *>(tmpCur2);
949 0 : ss <<" if(gid0 >= "<<tmpCurDVR2->GetArrayLength()<<" || isNan(";
950 0 : ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
951 0 : ss <<"))\n";
952 0 : ss <<" fVal = 0;\n else\n";
953 : }
954 : #endif
955 0 : ss <<" fVal = "<<vSubArguments[2]->GenSlidingWindowDeclRef();
956 0 : ss <<";\n";
957 : #ifdef ISNAN
958 0 : if(tmpCur3->GetType() == formula::svSingleVectorRef)
959 : {
960 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
961 0 : formula::SingleVectorRefToken *>(tmpCur3);
962 0 : ss <<" if(gid0 >= "<<tmpCurDVR3->GetArrayLength()<<" || isNan(";
963 0 : ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
964 0 : ss <<"))\n";
965 0 : ss <<" nStartPer = 0;\n else\n";
966 : }
967 : #endif
968 0 : ss <<" nStartPer = (int)";
969 0 : ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
970 0 : ss <<";\n";
971 : #ifdef ISNAN
972 0 : if(tmpCur4->GetType() == formula::svSingleVectorRef)
973 : {
974 : const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
975 0 : formula::SingleVectorRefToken *>(tmpCur4);
976 0 : ss <<" if(gid0 >= "<<tmpCurDVR4->GetArrayLength()<<" || isNan(";
977 0 : ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
978 0 : ss <<"))\n";
979 0 : ss <<" nEndPer = 0;\n else\n";
980 : }
981 : #endif
982 0 : ss <<" nEndPer = (int)";
983 0 : ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
984 0 : ss <<";\n";
985 :
986 : #ifdef ISNAN
987 0 : if(tmpCur5->GetType() == formula::svSingleVectorRef)
988 : {
989 : const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const
990 0 : formula::SingleVectorRefToken *>(tmpCur5);
991 0 : ss <<" if(gid0 >= "<<tmpCurDVR5->GetArrayLength()<<" || isNan(";
992 0 : ss <<vSubArguments[5]->GenSlidingWindowDeclRef();
993 0 : ss <<"))\n";
994 0 : ss <<" nPayType = 0;\n else\n";
995 : }
996 : #endif
997 0 : ss <<" nPayType = (int)"<<vSubArguments[5]->GenSlidingWindowDeclRef();
998 0 : ss <<";\n";
999 0 : ss <<" double fRmz;\n";
1000 0 : ss <<" fRmz = GetRmz_new( fRate, nNumPeriods, fVal, 0.0, nPayType );\n";
1001 0 : ss <<" double tmp = 0.0;\n";
1002 0 : ss <<" if( nStartPer == 1 )\n";
1003 0 : ss <<" {\n";
1004 0 : ss <<" if( nPayType <= 0 )\n";
1005 0 : ss <<" tmp = -fVal;\n";
1006 0 : ss <<" nStartPer++;\n";
1007 0 : ss <<" }\n";
1008 0 : ss <<" for( ; nStartPer<= nEndPer ; nStartPer++ )\n";
1009 0 : ss <<" {\n";
1010 0 : ss <<" if( nPayType > 0 )\n";
1011 0 : ss <<" tmp += GetZw_new( fRate, nStartPer - 2 , ";
1012 0 : ss <<"fRmz, fVal, 1 ) - fRmz;\n";
1013 0 : ss <<" else\n";
1014 0 : ss <<" tmp += GetZw_new( fRate, nStartPer - 1 , ";
1015 0 : ss <<"fRmz, fVal, 0 );\n";
1016 0 : ss <<" }\n";
1017 0 : ss <<" tmp *= fRate;\n";
1018 0 : ss <<" return tmp;\n";
1019 0 : ss <<"}";
1020 0 : }
1021 :
1022 0 : void IRR::GenSlidingWindowFunction(std::stringstream &ss,
1023 : const std::string &sSymName, SubArguments &vSubArguments)
1024 : {
1025 0 : ss << "\ndouble " << sSymName;
1026 0 : ss << "_" << BinFuncName() << "(";
1027 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
1028 : {
1029 0 : if (i)
1030 0 : ss << ",";
1031 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
1032 : }
1033 0 : ss << ") {\n";
1034 0 : ss << " #define Epsilon 1.0E-7\n";
1035 0 : ss << " int gid0 = get_global_id(0);\n";
1036 0 : FormulaToken* pSur = vSubArguments[1]->GetFormulaToken();
1037 : assert(pSur);
1038 0 : ss << " double fSchaetzwert = ";
1039 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
1040 0 : ss << " double fEps = 1.0;\n";
1041 0 : ss << " double x = 0.0, xNeu = 0.0, fZaehler = 0.0, fNenner = 0.0;\n";
1042 0 : ss << " double nCount = 0.0;\n";
1043 0 : if (pSur->GetType() == formula::svSingleVectorRef)
1044 : {
1045 : #ifdef ISNAN
1046 : const formula::SingleVectorRefToken* pSVR =
1047 0 : static_cast< const formula::SingleVectorRefToken* >(pSur);
1048 0 : ss << " if (gid0 >= " << pSVR->GetArrayLength() << ")\n";
1049 0 : ss << " fSchaetzwert = 0.1;\n";
1050 0 : ss << " if (isNan(fSchaetzwert))\n";
1051 0 : ss << " x = 0.1;\n";
1052 0 : ss << " else\n";
1053 : #endif
1054 : }
1055 0 : else if (pSur->GetType() == formula::svDouble)
1056 : {
1057 : #ifdef ISNAN
1058 0 : ss << " if (isNan(fSchaetzwert))\n";
1059 0 : ss << " x = 0.1;\n";
1060 0 : ss << " else\n";
1061 : #endif
1062 : }
1063 0 : ss << " x = fSchaetzwert;\n";
1064 0 : ss << " unsigned short nItCount = 0;\n";
1065 0 : ss << " while (fEps > Epsilon && nItCount < 20){\n";
1066 0 : ss << " nCount = 0.0; fZaehler = 0.0; fNenner = 0.0;\n";
1067 0 : ss << " double arg0, arg1;\n";
1068 0 : ss << " int i = 0;\n";
1069 0 : FormulaToken* pCur = vSubArguments[0]->GetFormulaToken();
1070 : assert(pCur);
1071 : const formula::DoubleVectorRefToken* pDVR =
1072 0 : static_cast<const formula::DoubleVectorRefToken* >(pCur);
1073 0 : size_t nCurWindowSize = pDVR->GetRefRowSize();
1074 0 : ss << " for ( ";
1075 0 : if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) {
1076 : #ifdef ISNAN
1077 0 : ss << "i = gid0; i < " << pDVR->GetArrayLength();
1078 0 : ss << " && i < " << nCurWindowSize << " /2*2; i++){\n";
1079 : #else
1080 : ss << "i = gid0; i < " << nCurWindowSize << " /2*2; i++)\n";
1081 : #endif
1082 0 : ss << " arg0 = ";
1083 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
1084 0 : ss << " i++;" << ";\n";
1085 0 : ss << " arg1 = ";
1086 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
1087 : #ifdef ISNAN
1088 0 : ss << " if (!isNan(arg0)){\n";
1089 : #endif
1090 0 : ss << " fZaehler += arg0 / pow(1.0 + x, nCount);\n";
1091 0 : ss << " fNenner+=-1*nCount*arg0/pow(1.0+x,nCount+1.0);\n";
1092 0 : ss << " nCount += 1;\n";
1093 0 : ss << " }\n";
1094 : #ifdef ISNAN
1095 0 : ss << " if (!isNan(arg1)){\n";
1096 : #endif
1097 0 : ss << " fZaehler += arg1 / pow(1.0 + x, nCount);\n";
1098 0 : ss << " fNenner+=-1*nCount*arg1/pow(1.0+x,nCount+1.0);\n";
1099 0 : ss << " nCount += 1;\n";
1100 0 : ss << " }\n";
1101 : #ifdef ISNAN
1102 0 : ss << " }\n";
1103 0 : ss << "if(i < " << pDVR->GetArrayLength();
1104 0 : ss << " && i < " << nCurWindowSize << ") ;{\n";
1105 : #else
1106 : ss << " i < " << nCurWindowSize << "){\n";
1107 : #endif
1108 : }
1109 0 : else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) {
1110 : #ifdef ISNAN
1111 0 : ss << "; i < " << pDVR->GetArrayLength();
1112 0 : ss << " && i < (gid0+" << nCurWindowSize << " )/2*2; i++){\n";
1113 : #else
1114 : ss << "; i < gid0+" << nCurWindowSize << " /2*2; i++)\n";
1115 : #endif
1116 0 : ss << " arg0 = ";
1117 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
1118 : #ifdef ISNAN
1119 0 : ss << " if (!isNan(arg0)){\n";
1120 : #endif
1121 0 : ss << " fZaehler += arg0 / pow(1.0 + x, nCount);\n";
1122 0 : ss << " fNenner+=-1*nCount*arg0/pow(1.0+x,nCount+1.0);\n";
1123 0 : ss << " nCount += 1;\n";
1124 : #ifdef ISNAN
1125 0 : ss << " }\n";
1126 : #endif
1127 0 : ss << " i++;\n";
1128 0 : ss << " arg1 = ";
1129 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
1130 : #ifdef ISNAN
1131 0 : ss << " if (!isNan(arg1)){\n";
1132 : #endif
1133 0 : ss << " fZaehler += arg1 / pow(1.0 + x, nCount);\n";
1134 0 : ss << " fNenner+=-1*nCount*arg1/pow(1.0+x,nCount+1.0);\n";
1135 0 : ss << " nCount+=1;\n";
1136 0 : ss << " }\n";
1137 : #ifdef ISNAN
1138 0 : ss << " }\n";
1139 0 : ss << " if(i < " << pDVR->GetArrayLength();
1140 0 : ss << " && i < gid0+" << nCurWindowSize << "){\n";
1141 : #else
1142 : ss << " i < " << nCurWindowSize << "){\n";
1143 : #endif
1144 : }
1145 0 : else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){
1146 : #ifdef ISNAN
1147 0 : ss << " ; i + gid0 < " << pDVR->GetArrayLength();
1148 0 : ss << " && i < " << nCurWindowSize << " /2*2; i++){\n";
1149 : #else
1150 : ss << "; i < " << nCurWindowSize << " /2*2; i++)\n";
1151 : #endif
1152 0 : ss << " arg0 = ";
1153 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
1154 0 : ss << " i++;" << ";\n";
1155 0 : ss << " arg1 = ";
1156 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
1157 : #ifdef ISNAN
1158 0 : ss << " if (!isNan(arg0)){\n";
1159 : #endif
1160 0 : ss << " fZaehler += arg0 / pow(1.0 + x, nCount);\n";
1161 0 : ss << " fNenner+=-1*nCount*arg0/pow(1.0+x,nCount+1.0);\n";
1162 0 : ss << " nCount += 1;\n";
1163 0 : ss << " }\n";
1164 : #ifdef ISNAN
1165 0 : ss << " if (!isNan(arg1)){\n";
1166 : #endif
1167 0 : ss << " fZaehler += arg1 / pow(1.0 + x, nCount);\n";
1168 0 : ss << " fNenner+=-1*nCount*arg1/pow(1.0+x,nCount+1.0);\n";
1169 0 : ss << " nCount+=1;\n";
1170 0 : ss << " }\n";
1171 : #ifdef ISNAN
1172 0 : ss << " }\n";
1173 0 : ss << " if(i + gid0 < " << pDVR->GetArrayLength() << " &&";
1174 0 : ss << " i < " << nCurWindowSize << "){\n";
1175 : #else
1176 : ss << " i < " << nCurWindowSize << "){\n";
1177 : #endif
1178 :
1179 : } else {
1180 : #ifdef ISNAN
1181 0 : ss << "; i < " << nCurWindowSize << " /2*2; i++){\n";
1182 : #else
1183 : ss << "; i < " << nCurWindowSize << " /2*2; i++)\n";
1184 : #endif
1185 0 : ss << " arg0 = ";
1186 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
1187 0 : ss << " i++;" << ";\n";
1188 0 : ss << " arg1 = ";
1189 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
1190 : #ifdef ISNAN
1191 0 : ss << " if (!isNan(arg0)){\n";
1192 : #endif
1193 0 : ss << " fZaehler += arg0 / pow(1.0 + x, nCount);\n";
1194 0 : ss << " fNenner+=-1*nCount*arg0/pow(1.0+x,nCount+1.0);\n";
1195 0 : ss << " nCount += 1;\n";
1196 0 : ss << " }\n";
1197 : #ifdef ISNAN
1198 0 : ss << " if (!isNan(arg1)){\n";
1199 : #endif
1200 0 : ss << " fZaehler += arg1 / pow(1.0 + x, nCount);\n";
1201 0 : ss << " fNenner+=-1*nCount*arg1/pow(1.0+x,nCount+1.0);\n";
1202 0 : ss << " nCount+=1;\n";
1203 0 : ss << " }\n";
1204 : #ifdef ISNAN
1205 0 : ss << " }\n";
1206 0 : ss << "if(i<" << nCurWindowSize << "){\n";
1207 : #else
1208 : ss << " i < " << nCurWindowSize << "){\n";
1209 : #endif
1210 :
1211 : }
1212 0 : ss << " arg0 = ";
1213 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
1214 : #ifdef ISNAN
1215 0 : ss << " if (isNan(arg0))\n";
1216 0 : ss << " continue;\n";
1217 : #endif
1218 0 : ss << " fZaehler += arg0 / pow(1.0+x, nCount);\n";
1219 0 : ss << " fNenner += -nCount * arg0 / pow(1.0+x,nCount+1.0);\n";
1220 0 : ss << " nCount+=1;\n";
1221 0 : ss << " }\n";
1222 0 : ss << " xNeu = x - fZaehler / fNenner;\n";
1223 0 : ss << " fEps = fabs(xNeu - x);\n";
1224 0 : ss << " x = xNeu;\n";
1225 0 : ss << " nItCount++;\n }\n";
1226 0 : ss << " if (fSchaetzwert == 0.0 && fabs(x) < Epsilon)\n";
1227 0 : ss << " x = 0.0;\n";
1228 0 : ss << " if (fEps < Epsilon)\n";
1229 0 : ss << " return x;\n";
1230 0 : ss << " else\n";
1231 0 : ss << " return (double)523;\n";
1232 0 : ss << "}";
1233 0 : }
1234 :
1235 0 : void XNPV::GenSlidingWindowFunction(
1236 : std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
1237 : {
1238 0 : FormulaToken *pCur = vSubArguments[1]->GetFormulaToken();
1239 : assert(pCur);
1240 : const formula::DoubleVectorRefToken* pCurDVR =
1241 0 : static_cast<const formula::DoubleVectorRefToken *>(pCur);
1242 0 : size_t nCurWindowSize = pCurDVR->GetRefRowSize();
1243 0 : ss << "\ndouble " << sSymName;
1244 0 : ss << "_"<< BinFuncName() <<"( ";
1245 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
1246 : {
1247 0 : if (i)
1248 0 : ss << ",";
1249 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
1250 : }
1251 :
1252 0 : ss << ") {\n\t";
1253 0 : ss << "double result = 0.0;\n\t";
1254 0 : ss << "int gid0 = get_global_id(0);\n\t";
1255 0 : ss << "int i=0;\n\t";
1256 0 : if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) {
1257 0 : ss<< "i=gid0;\n\t";
1258 : }
1259 0 : ss << "double date;\n\t";
1260 0 : ss << "double value;\n\t";
1261 0 : ss << "double rate;\n\t";
1262 0 : ss << "double dateNull;\n\t";
1263 : #ifdef ISNAN
1264 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1265 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
1266 0 : formula::SingleVectorRefToken *>(tmpCur0);
1267 :
1268 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
1269 : const formula::DoubleVectorRefToken*tmpCurDVR1= static_cast<const
1270 0 : formula::DoubleVectorRefToken *>(tmpCur1);
1271 :
1272 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
1273 : const formula::DoubleVectorRefToken*tmpCurDVR2= static_cast<const
1274 0 : formula::DoubleVectorRefToken *>(tmpCur2);
1275 0 : ss<< "int buffer_rate_len = ";
1276 0 : ss<< tmpCurDVR0->GetArrayLength();
1277 0 : ss << ";\n\t";
1278 0 : ss<< "int buffer_value_len = ";
1279 0 : ss<< tmpCurDVR1->GetArrayLength();
1280 0 : ss << ";\n\t";
1281 0 : ss<< "int buffer_date_len = ";
1282 0 : ss<< tmpCurDVR2->GetArrayLength();
1283 0 : ss << ";\n\t";
1284 : #endif
1285 : #ifdef ISNAN
1286 0 : ss<<"if((i+gid0)>=buffer_date_len || isNan(";
1287 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1288 0 : ss<<"))\n\t\t";
1289 0 : ss<<"dateNull = 0;\n\telse \n\t\t";
1290 : #endif
1291 0 : ss<<"dateNull = ";
1292 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1293 0 : ss<<";\n\t";
1294 : #ifdef ISNAN
1295 0 : ss<<"if((i+gid0)>=buffer_rate_len || isNan(";
1296 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1297 0 : ss<<"))\n\t\t";
1298 0 : ss<<"rate = 0;\n\telse \n\t\t";
1299 : #endif
1300 0 : ss<<"rate = ";
1301 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1302 0 : ss<<";\n\t";
1303 0 : ss << "for (int i = ";
1304 0 : if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed())
1305 : {
1306 0 : ss << "gid0; i < "<< nCurWindowSize <<"; i++)\n\t\t";
1307 : }
1308 0 : else if (pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
1309 : {
1310 0 : ss << "0; i < gid0+"<< nCurWindowSize <<"; i++)\n\t\t";
1311 : }
1312 : else
1313 : {
1314 0 : ss << "0; i < "<< nCurWindowSize <<"; i++)\n\t\t";
1315 : }
1316 0 : ss << "{\n\t";
1317 0 : ss << "result += ";
1318 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1319 0 : ss << "/(pow((";
1320 0 : ss<<vSubArguments[0]->GenSlidingWindowDeclRef();
1321 0 : ss <<"+1),(";
1322 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1323 0 : ss << "-dateNull)/365));\n\t";
1324 0 : ss <<"}\n\t";
1325 :
1326 0 : ss << "return result;\n";
1327 0 : ss << "}";
1328 0 : }
1329 :
1330 0 : void PriceMat::BinInlineFun(std::set<std::string>& decls,
1331 : std::set<std::string>& funs)
1332 : {
1333 0 : decls.insert(GetYearFracDecl);decls.insert(GetNullDateDecl);
1334 0 : decls.insert(DateToDaysDecl);decls.insert(DaysToDateDecl);
1335 0 : decls.insert(DaysInMonthDecl);decls.insert(IsLeapYearDecl);
1336 :
1337 0 : funs.insert(GetYearFrac);funs.insert(GetNullDate);
1338 0 : funs.insert(DateToDays);funs.insert(DaysToDate);
1339 0 : funs.insert(DaysInMonth);funs.insert(IsLeapYear);
1340 0 : }
1341 0 : void PriceMat::GenSlidingWindowFunction(
1342 : std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
1343 : {
1344 0 : ss << "\ndouble " << sSymName;
1345 0 : ss << "_"<< BinFuncName() <<"(";
1346 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
1347 : {
1348 0 : if (i)
1349 0 : ss << ",";
1350 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
1351 : }
1352 0 : ss << ") {\n\t";
1353 0 : ss << "int gid0 = get_global_id(0);\n\t";
1354 0 : ss << "double result=0;\n\t";
1355 0 : ss<< "int nNullDate = GetNullDate( );\n\t";
1356 0 : ss <<"int settle;\n\t";
1357 0 : ss <<"int mat;\n\t";
1358 0 : ss <<"int issue;\n\t";
1359 0 : ss <<"double rate;\n\t";
1360 0 : ss <<"double yield;\n\t";
1361 0 : ss <<"int nBase;\n\t";
1362 : #ifdef ISNAN
1363 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1364 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
1365 0 : formula::SingleVectorRefToken *>(tmpCur0);
1366 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
1367 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
1368 0 : formula::SingleVectorRefToken *>(tmpCur1);
1369 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
1370 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
1371 0 : formula::SingleVectorRefToken *>(tmpCur2);
1372 0 : FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
1373 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
1374 0 : formula::SingleVectorRefToken *>(tmpCur3);
1375 0 : FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
1376 : const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
1377 0 : formula::SingleVectorRefToken *>(tmpCur4);
1378 0 : FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
1379 : const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const
1380 0 : formula::SingleVectorRefToken *>(tmpCur5);
1381 :
1382 0 : ss<< "int buffer_settle_len = ";
1383 0 : ss<< tmpCurDVR0->GetArrayLength();
1384 0 : ss << ";\n\t";
1385 0 : ss<< "int buffer_mat_len = ";
1386 0 : ss<< tmpCurDVR1->GetArrayLength();
1387 0 : ss << ";\n\t";
1388 0 : ss<< "int buffer_issue_len = ";
1389 0 : ss<< tmpCurDVR2->GetArrayLength();
1390 0 : ss << ";\n\t";
1391 0 : ss<< "int buffer_rate_len = ";
1392 0 : ss<< tmpCurDVR3->GetArrayLength();
1393 0 : ss << ";\n\t";
1394 0 : ss<< "int buffer_yield_len = ";
1395 0 : ss<< tmpCurDVR4->GetArrayLength();
1396 0 : ss << ";\n\t";
1397 0 : ss<< "int buffer_base_len = ";
1398 0 : ss<< tmpCurDVR5->GetArrayLength();
1399 0 : ss << ";\n\t";
1400 : #endif
1401 : #ifdef ISNAN
1402 0 : ss<<"if(gid0>=buffer_settle_len || isNan(";
1403 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1404 0 : ss<<"))\n\t\t";
1405 0 : ss<<"settle = 0;\n\telse \n\t\t";
1406 : #endif
1407 0 : ss<<"settle = ";
1408 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1409 0 : ss<<";\n\t";
1410 : #ifdef ISNAN
1411 0 : ss<<"if(gid0>=buffer_mat_len || isNan(";
1412 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1413 0 : ss<<"))\n\t\t";
1414 0 : ss<<"mat = 0;\n\telse \n\t\t";
1415 : #endif
1416 0 : ss<<"mat = ";
1417 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1418 0 : ss<<";\n\t";
1419 : #ifdef ISNAN
1420 0 : ss<<"if(gid0>=buffer_issue_len || isNan(";
1421 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1422 0 : ss<<"))\n\t\t";
1423 0 : ss<<"issue = 0;\n\telse \n\t\t";
1424 : #endif
1425 0 : ss<<"issue = ";
1426 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1427 0 : ss<<";\n\t";
1428 : #ifdef ISNAN
1429 0 : ss<<"if(gid0>=buffer_rate_len || isNan(";
1430 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
1431 0 : ss<<"))\n\t\t";
1432 0 : ss<<"rate = 0;\n\telse \n\t\t";
1433 : #endif
1434 0 : ss<<"rate = ";
1435 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
1436 0 : ss<<";\n\t";
1437 : #ifdef ISNAN
1438 0 : ss<<"if(gid0>=buffer_yield_len || isNan(";
1439 0 : ss << vSubArguments[4]->GenSlidingWindowDeclRef();
1440 0 : ss<<"))\n\t\t";
1441 0 : ss<<"yield = 0;\n\telse \n\t\t";
1442 : #endif
1443 0 : ss<<"yield = ";
1444 0 : ss << vSubArguments[4]->GenSlidingWindowDeclRef();
1445 0 : ss<<";\n\t";
1446 : #ifdef ISNAN
1447 0 : ss<<"if(gid0>=buffer_base_len || isNan(";
1448 0 : ss << vSubArguments[5]->GenSlidingWindowDeclRef();
1449 0 : ss<<"))\n\t\t";
1450 0 : ss<<"nBase = 0;\n\telse \n\t\t";
1451 : #endif
1452 0 : ss<<"nBase = ";
1453 0 : ss << vSubArguments[5]->GenSlidingWindowDeclRef();
1454 0 : ss<<";\n\t";
1455 0 : ss<< "double fIssMat = GetYearFrac( nNullDate, issue, mat, nBase);\n";
1456 0 : ss<<"double fIssSet = GetYearFrac( nNullDate, issue, settle,nBase);\n";
1457 0 : ss<<"double fSetMat = GetYearFrac( nNullDate, settle, mat, nBase);\n";
1458 0 : ss<<"result = 1.0 + fIssMat * rate;\n\t";
1459 0 : ss<<"result /= 1.0 + fSetMat * yield;\n\t";
1460 0 : ss<<"result -= fIssSet * rate;\n\t";
1461 0 : ss<<"result*= 100.0;\n\t";
1462 0 : ss<<"return result;\n\t";
1463 0 : ss<<"}\n";
1464 0 : }
1465 :
1466 0 : void OpSYD::GenSlidingWindowFunction(std::stringstream &ss,
1467 : const std::string &sSymName, SubArguments &vSubArguments)
1468 : {
1469 0 : ss << "\ndouble " << sSymName;
1470 0 : ss << "_"<< BinFuncName() <<"(";
1471 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
1472 : {
1473 0 : if (i)
1474 0 : ss << ",";
1475 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
1476 : }
1477 0 : ss << ") {\n";
1478 0 : ss << " int gid0 = get_global_id(0);\n";
1479 0 : ss << " double result=0;\n";
1480 0 : ss << " double cost;\n";
1481 0 : ss << " double salvage;\n";
1482 0 : ss << " double life;\n";
1483 0 : ss << " double period;\n";
1484 : #ifdef ISNAN
1485 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1486 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
1487 0 : formula::SingleVectorRefToken *>(tmpCur0);
1488 :
1489 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
1490 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
1491 0 : formula::SingleVectorRefToken *>(tmpCur1);
1492 :
1493 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
1494 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
1495 0 : formula::SingleVectorRefToken *>(tmpCur2);
1496 :
1497 0 : FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
1498 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
1499 0 : formula::SingleVectorRefToken *>(tmpCur3);
1500 :
1501 0 : ss << " int buffer_cost_len = ";
1502 0 : ss << tmpCurDVR0->GetArrayLength();
1503 0 : ss << ";\n";
1504 :
1505 0 : ss << " int buffer_salvage_len = ";
1506 0 : ss << tmpCurDVR1->GetArrayLength();
1507 0 : ss << ";\n";
1508 :
1509 0 : ss << " int buffer_life_len = ";
1510 0 : ss << tmpCurDVR2->GetArrayLength();
1511 0 : ss << ";\n";
1512 0 : ss << " int buffer_period_len = ";
1513 0 : ss << tmpCurDVR3->GetArrayLength();
1514 0 : ss << ";\n";
1515 : #endif
1516 :
1517 : #ifdef ISNAN
1518 0 : ss <<" if(gid0>=buffer_cost_len || isNan(";
1519 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1520 0 : ss <<"))\n";
1521 0 : ss <<" cost = 0;\n\telse \n";
1522 : #endif
1523 0 : ss <<" cost = ";
1524 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1525 0 : ss <<";\n";
1526 : #ifdef ISNAN
1527 0 : ss <<" if(gid0>=buffer_salvage_len || isNan(";
1528 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1529 0 : ss <<"))\n";
1530 0 : ss <<" salvage = 0;\n\telse \n";
1531 : #endif
1532 0 : ss <<" salvage = ";
1533 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1534 0 : ss <<";\n";
1535 : #ifdef ISNAN
1536 0 : ss <<" if(gid0>=buffer_life_len || isNan(";
1537 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1538 0 : ss <<"))\n";
1539 0 : ss <<" life = 0;\n\telse \n";
1540 : #endif
1541 0 : ss <<" life = ";
1542 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1543 0 : ss <<";\n";
1544 : #ifdef ISNAN
1545 0 : ss <<" if(gid0>=buffer_period_len || isNan(";
1546 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
1547 0 : ss <<"))\n";
1548 0 : ss <<" period = 0;\n\telse \n";
1549 : #endif
1550 0 : ss <<" period = ";
1551 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
1552 0 : ss <<";\n";
1553 0 : ss <<" double tmpvalue = ((life*(life+1))*pow(2.0,-1));\n";
1554 0 : ss <<" result = ((cost-salvage)*(life-period+1)";
1555 0 : ss << "*pow(tmpvalue,-1));\n";
1556 0 : ss <<" return result;\n";
1557 0 : ss <<"}\n";
1558 0 : }
1559 :
1560 0 : void MIRR::GenSlidingWindowFunction(
1561 : std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
1562 : {
1563 0 : FormulaToken* pCur = vSubArguments[0]->GetFormulaToken();
1564 : assert(pCur);
1565 : const formula::DoubleVectorRefToken* pCurDVR =
1566 0 : static_cast<const formula::DoubleVectorRefToken *>(pCur);
1567 0 : size_t nCurWindowSize = pCurDVR->GetRefRowSize();
1568 0 : FormulaToken* pCur1 = vSubArguments[1]->GetFormulaToken();
1569 : assert(pCur1);
1570 : const formula::SingleVectorRefToken* pSVR1 =
1571 0 : static_cast< const formula::SingleVectorRefToken* >(pCur1);
1572 : assert(pSVR1);
1573 0 : FormulaToken* pCur2 = vSubArguments[2]->GetFormulaToken();
1574 : assert(pCur2);
1575 : const formula::SingleVectorRefToken* pSVR2 =
1576 0 : static_cast< const formula::SingleVectorRefToken* >(pCur2);
1577 : assert(pSVR2);
1578 :
1579 0 : ss << "\ndouble " << sSymName;
1580 0 : ss << "_"<< BinFuncName() <<"(";
1581 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
1582 : {
1583 0 : if (i)
1584 0 : ss << ",";
1585 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
1586 : }
1587 0 : ss << ") {\n\t";
1588 0 : ss << "double tmp = " << GetBottom() <<";\n\t";
1589 0 : ss << "int gid0 = get_global_id(0);\n\t";
1590 0 : ss << "double arg0, arg1, arg2;\n\t";
1591 0 : ss << "arg1 = " << vSubArguments[1]->GenSlidingWindowDeclRef();
1592 0 : ss << ";\n\t";
1593 0 : ss << "arg2 = " << vSubArguments[2]->GenSlidingWindowDeclRef();
1594 0 : ss << ";\n\t";
1595 0 : ss << "int argLen1 = " << pSVR1->GetArrayLength() << ";\n\t";
1596 0 : ss << "int argLen2 = " << pSVR2->GetArrayLength() << ";\n\t";
1597 : #ifdef ISNAN
1598 0 : ss << "if (gid0 >= argLen1)\n\t\t";
1599 0 : ss << "arg1 = 0.0;\n\t";
1600 0 : ss << "if (gid0 >= argLen2)\n\t\t";
1601 0 : ss << "arg2 = 0.0;\n\t";
1602 0 : ss << "if (isNan(arg1))\n\t\t";
1603 0 : ss << "arg1 = 0.0;\n\t";
1604 0 : ss << "if (isNan(arg2))\n\t\t";
1605 0 : ss << "arg2 = 0.0;\n\t";
1606 : #endif
1607 0 : ss << "double invest = arg1 + 1.0;\n\t";
1608 0 : ss << "double reinvest = arg2 + 1.0;\n\t";
1609 0 : ss << "double NPV_invest = 0.0;\n\t";
1610 0 : ss << "double Pow_invest = 1.0;\n\t";
1611 0 : ss << "double NPV_reinvest = 0.0;\n\t";
1612 0 : ss << "double Pow_reinvest = 1.0;\n\t";
1613 0 : ss << "int nCount = 0;\n\t";
1614 0 : ss << "int arrayLength = " << pCurDVR->GetArrayLength() << ";\n\t";
1615 : #ifdef ISNAN
1616 0 : ss << "for (int i = 0; i + gid0 < arrayLength &&";
1617 0 : ss << " i < " << nCurWindowSize << "; i++){\n\t\t";
1618 : #else
1619 : ss << "for (int i = 0; i < " << nCurWindowSize << "; i++){\n\t\t";
1620 : #endif
1621 0 : ss << "arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
1622 0 : ss << ";\n\t\t";
1623 : #ifdef ISNAN
1624 0 : ss << "if (isNan(arg0))\n\t\t\t";
1625 0 : ss << "continue;\n\t\t";
1626 : #endif
1627 0 : ss << "if (arg0 > 0.0)\n\t\t\t";
1628 0 : ss << "NPV_reinvest += arg0 * Pow_reinvest;\n\t\t";
1629 0 : ss << "else if (arg0 < 0.0)\n\t\t\t";
1630 0 : ss << "NPV_invest += arg0 * Pow_invest;\n\t\t";
1631 0 : ss << "Pow_reinvest /= reinvest;\n\t\t";
1632 0 : ss << "Pow_invest /= invest;\n\t\t";
1633 0 : ss << "nCount++;\n\t";
1634 0 : ss << "}\n\t";
1635 0 : ss << "tmp = ";
1636 0 : ss << "-NPV_reinvest /NPV_invest * pow(reinvest,(double)nCount-1);\n\t";
1637 0 : ss << "tmp = pow(tmp, 1.0 / (nCount - 1)) - 1.0;\n\t";
1638 0 : ss << "return (double)tmp;\n";
1639 0 : ss << "}";
1640 0 : }
1641 :
1642 0 : void OpEffective::GenSlidingWindowFunction(std::stringstream& ss,
1643 : const std::string &sSymName, SubArguments& vSubArguments)
1644 : {
1645 0 : ss << "\ndouble " << sSymName;
1646 0 : ss << "_" << BinFuncName() << "(";
1647 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
1648 : {
1649 0 : if (i)
1650 0 : ss << ",";
1651 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
1652 : }
1653 0 : ss << ") {\n";
1654 0 : ss << " double tmp = " << GetBottom() <<";\n";
1655 0 : ss << " int gid0 = get_global_id(0);\n\t";
1656 0 : ss << " double arg0 = " << GetBottom() << ";\n";
1657 0 : ss << " double arg1 = " << GetBottom() << ";\n";
1658 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
1659 : {
1660 0 : FormulaToken* pCur = vSubArguments[i]->GetFormulaToken();
1661 : assert(pCur);
1662 0 : if (pCur->GetType() == formula::svSingleVectorRef)
1663 : {
1664 : #ifdef ISNAN
1665 : const formula::SingleVectorRefToken* pSVR =
1666 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
1667 0 : ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n";
1668 : #endif
1669 : }
1670 0 : else if (pCur->GetType() == formula::svDouble)
1671 : {
1672 : #ifdef ISNAN
1673 0 : ss << " {\n";
1674 : #endif
1675 : }
1676 : #ifdef ISNAN
1677 0 : if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
1678 : {
1679 0 : ss << " if (isNan(";
1680 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef();
1681 0 : ss << "))\n";
1682 0 : ss << " arg" << i << " = 0;\n";
1683 0 : ss << " else\n";
1684 0 : ss << " arg" << i << " = ";
1685 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
1686 0 : ss << " }\n";
1687 : }
1688 : else
1689 : {
1690 0 : ss << " arg" << i << " = ";
1691 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
1692 : }
1693 : #else
1694 : ss << " arg" << i;
1695 : ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
1696 : #endif
1697 : }
1698 0 : ss << " tmp = pow(1.0 + arg0 * pow(arg1, -1), arg1)-1.0;\n";
1699 0 : ss << " return tmp;\n";
1700 0 : ss << "}";
1701 0 : }
1702 :
1703 0 : void OpTbilleq::BinInlineFun(std::set<std::string>& decls,
1704 : std::set<std::string>& funs)
1705 : {
1706 0 : decls.insert(GetDiffDate360_Decl);decls.insert(GetDiffDate360Decl);
1707 0 : decls.insert(DateToDaysDecl);decls.insert(DaysToDate_LocalBarrierDecl);
1708 0 : decls.insert(DaysInMonthDecl);decls.insert(GetNullDateDecl);
1709 0 : decls.insert(IsLeapYearDecl);
1710 0 : funs.insert(GetDiffDate360_);funs.insert(GetDiffDate360);
1711 0 : funs.insert(DateToDays);funs.insert(DaysToDate_LocalBarrier);
1712 0 : funs.insert(DaysInMonth);funs.insert(GetNullDate);
1713 0 : funs.insert(IsLeapYear);
1714 0 : }
1715 0 : void OpTbilleq::GenSlidingWindowFunction(
1716 : std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
1717 : {
1718 0 : ss << "\ndouble " << sSymName;
1719 0 : ss << "_"<< BinFuncName() <<"(";
1720 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
1721 : {
1722 0 : if (i)
1723 0 : ss << ",";
1724 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
1725 : }
1726 0 : ss << ") {\n\t";
1727 0 : ss << " int gid0 = get_global_id(0);\n";
1728 0 : ss << "double tmp = 0;\n\t";
1729 0 : ss << "double tmp000;\n\t";
1730 0 : ss << "double tmp001;\n\t";
1731 0 : ss << "double tmp002;\n\t";
1732 :
1733 : #ifdef ISNAN
1734 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1735 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
1736 0 : formula::SingleVectorRefToken *>(tmpCur0);
1737 :
1738 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
1739 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
1740 0 : formula::SingleVectorRefToken *>(tmpCur1);
1741 :
1742 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
1743 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
1744 0 : formula::SingleVectorRefToken *>(tmpCur2);
1745 :
1746 0 : ss<< "int buffer_tmp000_len = ";
1747 0 : ss<< tmpCurDVR0->GetArrayLength();
1748 0 : ss << ";\n\t";
1749 :
1750 0 : ss<< "int buffer_tmp001_len = ";
1751 0 : ss<< tmpCurDVR1->GetArrayLength();
1752 0 : ss << ";\n\t";
1753 :
1754 0 : ss<< "int buffer_tmp002_len = ";
1755 0 : ss<< tmpCurDVR2->GetArrayLength();
1756 0 : ss << ";\n\t";
1757 : #endif
1758 :
1759 : #ifdef ISNAN
1760 0 : ss<<"if(gid0>=buffer_tmp000_len || isNan(";
1761 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1762 0 : ss<<"))\n\t\t";
1763 0 : ss<<"tmp000 = 0;\n\telse \n\t\t";
1764 : #endif
1765 0 : ss<<"tmp000 = ";
1766 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
1767 0 : ss<<";\n\t";
1768 :
1769 : #ifdef ISNAN
1770 0 : ss<<"if(gid0>=buffer_tmp001_len || isNan(";
1771 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1772 0 : ss<<"))\n\t\t";
1773 0 : ss<<"tmp001 = 0;\n\telse \n\t\t";
1774 : #endif
1775 0 : ss<<"tmp001 = ";
1776 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
1777 0 : ss<<";\n\t";
1778 :
1779 : #ifdef ISNAN
1780 0 : ss<<"if(gid0>=buffer_tmp002_len || isNan(";
1781 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1782 0 : ss<<"))\n\t\t";
1783 0 : ss<<"tmp002 = 0;\n\telse \n\t\t";
1784 : #endif
1785 0 : ss<<"tmp002 = ";
1786 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
1787 0 : ss<<";\n\t";
1788 :
1789 0 : ss<<"tmp001+=1.0;\n";
1790 0 : ss<<"int nDiff =GetDiffDate360(GetNullDate(),tmp000,tmp001,true);\n";
1791 0 : ss<<"tmp =( 365 * tmp002 ) / ( 360 - ( tmp002 * ( nDiff ) ) );\n";
1792 0 : ss << "return tmp;\n";
1793 0 : ss << "}";
1794 0 : }
1795 0 : void OpCumprinc::BinInlineFun(std::set<std::string>& decls,
1796 : std::set<std::string>& funs)
1797 : {
1798 0 : decls.insert(GetRmz_newDecl); decls.insert(GetZw_newDecl);
1799 0 : funs.insert(GetRmz_new);funs.insert(GetZw_new);
1800 0 : }
1801 0 : void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss,
1802 : const std::string &sSymName, SubArguments &vSubArguments)
1803 : {
1804 0 : ss << "\ndouble " << sSymName;
1805 0 : ss << "_"<< BinFuncName() <<"(";
1806 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
1807 : {
1808 0 : if (i)
1809 0 : ss << ",";
1810 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
1811 : }
1812 0 : ss << ") {\n";
1813 0 : ss << " double tmp = " << GetBottom() <<";\n";
1814 0 : ss << " int gid0 = get_global_id(0);\n";
1815 0 : ss << " double fRate,fVal;\n";
1816 0 : ss << " int nStartPer,nEndPer,nNumPeriods,nPayType;\n";
1817 : #ifdef ISNAN
1818 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
1819 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
1820 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
1821 0 : FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
1822 0 : FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
1823 0 : FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
1824 : #endif
1825 : #ifdef ISNAN
1826 0 : if(tmpCur0->GetType() == formula::svSingleVectorRef)
1827 : {
1828 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
1829 0 : formula::SingleVectorRefToken *>(tmpCur0);
1830 0 : ss <<" if(gid0 >= "<<tmpCurDVR0->GetArrayLength()<<" || isNan(";
1831 0 : ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
1832 0 : ss <<"))\n";
1833 0 : ss <<" fRate = 0;\n else\n";
1834 : }
1835 : #endif
1836 0 : ss <<" fRate = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
1837 0 : ss <<";\n";
1838 : #ifdef ISNAN
1839 0 : if(tmpCur1->GetType() == formula::svSingleVectorRef)
1840 : {
1841 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
1842 0 : formula::SingleVectorRefToken *>(tmpCur1);
1843 0 : ss <<" if(gid0 >= "<<tmpCurDVR1->GetArrayLength()<<" || isNan(";
1844 0 : ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
1845 0 : ss <<"))\n";
1846 0 : ss <<" nNumPeriods = 0;\n else\n";
1847 : }
1848 : #endif
1849 0 : ss <<" nNumPeriods = (int)";
1850 0 : ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
1851 0 : ss <<";\n";
1852 : #ifdef ISNAN
1853 0 : if(tmpCur2->GetType() == formula::svSingleVectorRef)
1854 : {
1855 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
1856 0 : formula::SingleVectorRefToken *>(tmpCur2);
1857 0 : ss <<" if(gid0 >= "<<tmpCurDVR2->GetArrayLength()<<" || isNan(";
1858 0 : ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
1859 0 : ss <<"))\n";
1860 0 : ss <<" fVal = 0;\n else\n";
1861 : }
1862 : #endif
1863 0 : ss <<" fVal = "<<vSubArguments[2]->GenSlidingWindowDeclRef();
1864 0 : ss <<";\n";
1865 : #ifdef ISNAN
1866 0 : if(tmpCur3->GetType() == formula::svSingleVectorRef)
1867 : {
1868 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
1869 0 : formula::SingleVectorRefToken *>(tmpCur3);
1870 0 : ss <<" if(gid0 >= "<<tmpCurDVR3->GetArrayLength()<<" || isNan(";
1871 0 : ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
1872 0 : ss <<"))\n";
1873 0 : ss <<" nStartPer = 0;\n else\n";
1874 : }
1875 : #endif
1876 0 : ss <<" nStartPer = (int)";
1877 0 : ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
1878 0 : ss <<";\n";
1879 : #ifdef ISNAN
1880 0 : if(tmpCur4->GetType() == formula::svSingleVectorRef)
1881 : {
1882 : const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
1883 0 : formula::SingleVectorRefToken *>(tmpCur4);
1884 0 : ss <<" if(gid0 >= "<<tmpCurDVR4->GetArrayLength()<<" || isNan(";
1885 0 : ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
1886 0 : ss <<"))\n";
1887 0 : ss <<" nEndPer = 0;\n else\n";
1888 : }
1889 : #endif
1890 0 : ss <<" nEndPer = (int)";
1891 0 : ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
1892 0 : ss <<";\n";
1893 :
1894 : #ifdef ISNAN
1895 0 : if(tmpCur5->GetType() == formula::svSingleVectorRef)
1896 : {
1897 : const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const
1898 0 : formula::SingleVectorRefToken *>(tmpCur5);
1899 0 : ss <<" if(gid0 >= "<<tmpCurDVR5->GetArrayLength()<<" || isNan(";
1900 0 : ss <<vSubArguments[5]->GenSlidingWindowDeclRef();
1901 0 : ss <<"))\n";
1902 0 : ss <<" nPayType = 0;\n else\n";
1903 : }
1904 : #endif
1905 0 : ss <<" nPayType = (int)";
1906 0 : ss <<vSubArguments[5]->GenSlidingWindowDeclRef();
1907 0 : ss <<";\n";
1908 0 : ss <<" double fRmz;\n";
1909 0 : ss <<" fRmz = GetRmz_new( fRate, nNumPeriods,fVal,0.0,nPayType );\n";
1910 0 : ss <<" if(nStartPer == 1)\n";
1911 0 : ss <<" {\n";
1912 0 : ss <<" if( nPayType <= 0 )\n";
1913 0 : ss <<" tmp = fRmz + fVal * fRate;\n";
1914 0 : ss <<" else\n";
1915 0 : ss <<" tmp = fRmz;\n";
1916 0 : ss <<" nStartPer=nStartPer+1;\n";
1917 0 : ss <<" }\n";
1918 0 : ss <<" for( int i = nStartPer ; i <= nEndPer ; i++ )\n";
1919 0 : ss <<" {\n";
1920 0 : ss <<" if( nPayType > 0 )\n";
1921 0 : ss <<" tmp += fRmz - ( GetZw_new( fRate,i - 2,";
1922 0 : ss <<"fRmz,fVal,1)- fRmz ) * fRate;\n";
1923 0 : ss <<" else\n";
1924 0 : ss <<" tmp += fRmz - GetZw_new( fRate, i - 1,";
1925 0 : ss <<"fRmz,fVal,0 ) * fRate;\n";
1926 0 : ss <<" }\n";
1927 0 : ss <<" return tmp;\n";
1928 0 : ss <<"}";
1929 0 : }
1930 0 : void OpAccrint::BinInlineFun(std::set<std::string>& decls,
1931 : std::set<std::string>& funs)
1932 : {
1933 0 : decls.insert(IsLeapYearDecl); decls.insert(DaysInMonthDecl);
1934 0 : decls.insert(DaysToDateDecl); decls.insert(DateToDaysDecl);
1935 0 : decls.insert(GetNullDateDecl); decls.insert(GetDiffDateDecl);
1936 0 : funs.insert(IsLeapYear);funs.insert(DaysInMonth);
1937 0 : funs.insert(DaysToDate);funs.insert(DateToDays);
1938 0 : funs.insert(GetNullDate);funs.insert(GetDiffDate);
1939 0 : }
1940 0 : void OpAccrint::GenSlidingWindowFunction(
1941 : std::stringstream &ss, const std::string &sSymName,
1942 : SubArguments &vSubArguments)
1943 : {
1944 0 : ss << "\ndouble " << sSymName;
1945 0 : ss << "_"<< BinFuncName() <<"(";
1946 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
1947 : {
1948 0 : if (i)
1949 0 : ss << ",";
1950 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
1951 : }
1952 0 : ss << ") {\n";
1953 0 : ss << " int gid0 = get_global_id(0);\n";
1954 0 : ss << " double tmp = 0;\n";
1955 0 : ss << " int nStartDate,nEndDate,mode,freq;\n";
1956 0 : ss << " int nDays1stYear=0;\n";
1957 0 : ss << " double fVal,fRate;\n";
1958 : #ifdef ISNAN
1959 0 : FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
1960 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
1961 0 : formula::SingleVectorRefToken *>(tmpCur0);
1962 0 : FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
1963 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
1964 0 : formula::SingleVectorRefToken *>(tmpCur2);
1965 0 : FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
1966 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
1967 0 : formula::SingleVectorRefToken *>(tmpCur3);
1968 0 : FormulaToken* tmpCur4 = vSubArguments[4]->GetFormulaToken();
1969 : const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
1970 0 : formula::SingleVectorRefToken *>(tmpCur4);
1971 0 : FormulaToken* tmpCur5 = vSubArguments[5]->GetFormulaToken();
1972 : const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const
1973 0 : formula::SingleVectorRefToken *>(tmpCur5);
1974 0 : FormulaToken* tmpCur6 = vSubArguments[6]->GetFormulaToken();
1975 : const formula::SingleVectorRefToken*tmpCurDVR6= static_cast<const
1976 0 : formula::SingleVectorRefToken *>(tmpCur6);
1977 0 : ss<< " int buffer_nIssue_len = ";
1978 0 : ss<< tmpCurDVR0->GetArrayLength();
1979 0 : ss<< ";\n";
1980 0 : ss<< " int buffer_nSettle_len = ";
1981 0 : ss<< tmpCurDVR2->GetArrayLength();
1982 0 : ss<< ";\n";
1983 0 : ss<< " int buffer_fRate_len = ";
1984 0 : ss<< tmpCurDVR3->GetArrayLength();
1985 0 : ss<< ";\n";
1986 0 : ss<< " int buffer_fVal_len = ";
1987 0 : ss<< tmpCurDVR4->GetArrayLength();
1988 0 : ss<< ";\n";
1989 0 : ss<< " int buffer_nFreq_len = ";
1990 0 : ss<< tmpCurDVR5->GetArrayLength();
1991 0 : ss<< ";\n";
1992 0 : ss<< " int buffer_nMode_len = ";
1993 0 : ss<< tmpCurDVR6->GetArrayLength();
1994 0 : ss << ";\n";
1995 : #endif
1996 : #ifdef ISNAN
1997 0 : ss<<" if(gid0 >= buffer_nIssue_len || isNan(";
1998 0 : ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
1999 0 : ss <<"))\n";
2000 0 : ss <<" nStartDate = 0;\n else\n";
2001 : #endif
2002 0 : ss <<" nStartDate=(int)";
2003 0 : ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
2004 0 : ss <<";\n";
2005 : #ifdef ISNAN
2006 0 : ss <<" if(gid0 >= buffer_nSettle_len || isNan(";
2007 0 : ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
2008 0 : ss <<"))\n";
2009 0 : ss <<" nEndDate = 0;\n else\n";
2010 : #endif
2011 0 : ss <<" nEndDate=(int)";
2012 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
2013 0 : ss << ";\n";
2014 : #ifdef ISNAN
2015 0 : ss <<" if(gid0 >= buffer_fRate_len || isNan(";
2016 0 : ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
2017 0 : ss <<"))\n";
2018 0 : ss <<" fRate = 0;\n else\n";
2019 : #endif
2020 0 : ss <<" fRate=";
2021 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
2022 0 : ss <<";\n";
2023 : #ifdef ISNAN
2024 0 : ss <<" if(gid0 >= buffer_fVal_len || isNan(";
2025 0 : ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
2026 0 : ss <<"))\n";
2027 0 : ss <<" fVal = 0;\n else\n";
2028 : #endif
2029 0 : ss <<" fVal=";
2030 0 : ss << vSubArguments[4]->GenSlidingWindowDeclRef();
2031 0 : ss <<";\n";
2032 : #ifdef ISNAN
2033 0 : ss <<" if(gid0 >= buffer_nFreq_len || isNan(";
2034 0 : ss <<vSubArguments[5]->GenSlidingWindowDeclRef();
2035 0 : ss <<"))\n";
2036 0 : ss <<" freq = 0;\n else\n";
2037 : #endif
2038 0 : ss <<" freq= (int)";
2039 0 : ss << vSubArguments[5]->GenSlidingWindowDeclRef();
2040 0 : ss <<";\n";
2041 : #ifdef ISNAN
2042 0 : ss <<" if(gid0 >= buffer_nMode_len || isNan(";
2043 0 : ss <<vSubArguments[6]->GenSlidingWindowDeclRef();
2044 0 : ss <<"))\n";
2045 0 : ss <<" mode = 0;\n else\n";
2046 : #endif
2047 0 : ss <<" mode = (int)";
2048 0 : ss << vSubArguments[6]->GenSlidingWindowDeclRef();
2049 0 : ss <<";\n";
2050 0 : ss <<" int nNullDate=GetNullDate();\n";
2051 0 : ss <<" int nTotalDays = GetDiffDate(nNullDate,nStartDate,";
2052 0 : ss <<"nEndDate, mode,&nDays1stYear);\n";
2053 0 : ss <<" tmp = fVal*fRate*convert_double(nTotalDays)";
2054 0 : ss <<"/convert_double(nDays1stYear);\n";
2055 0 : ss <<" return tmp;\n";
2056 0 : ss <<"}";
2057 0 : }
2058 :
2059 0 : void OpAccrintm::BinInlineFun(std::set<std::string>& decls,
2060 : std::set<std::string>& funs)
2061 : {
2062 0 : decls.insert(IsLeapYearDecl); decls.insert(DaysInMonthDecl);
2063 0 : decls.insert(DaysToDateDecl); decls.insert(DateToDaysDecl);
2064 0 : decls.insert(GetNullDateDecl); decls.insert(GetDiffDateDecl);
2065 0 : funs.insert(IsLeapYear);funs.insert(DaysInMonth);
2066 0 : funs.insert(DaysToDate);funs.insert(DateToDays);
2067 0 : funs.insert(GetNullDate);funs.insert(GetDiffDate);
2068 0 : }
2069 0 : void OpAccrintm::GenSlidingWindowFunction(
2070 : std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
2071 : {
2072 0 : ss << "\ndouble " << sSymName;
2073 0 : ss << "_"<< BinFuncName() <<"(";
2074 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
2075 : {
2076 0 : if (i)
2077 0 : ss << ",";
2078 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
2079 : }
2080 0 : ss << ") {\n\t";
2081 0 : ss << "int gid0 = get_global_id(0);\n\t";
2082 0 : ss << "double tmp = " << GetBottom() <<";\n\t";
2083 0 : ss << "int nStartDate,nEndDate,mode;\n\t";
2084 0 : ss << "double fRate,fVal;\n\t";
2085 : #ifdef ISNAN
2086 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
2087 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
2088 0 : formula::SingleVectorRefToken *>(tmpCur0);
2089 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
2090 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
2091 0 : formula::SingleVectorRefToken *>(tmpCur1);
2092 :
2093 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
2094 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
2095 0 : formula::SingleVectorRefToken *>(tmpCur2);
2096 :
2097 0 : FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
2098 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
2099 0 : formula::SingleVectorRefToken *>(tmpCur3);
2100 :
2101 0 : FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
2102 : const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
2103 0 : formula::SingleVectorRefToken *>(tmpCur4);
2104 0 : ss<< "int buffer_nIssue_len = ";
2105 0 : ss<< tmpCurDVR0->GetArrayLength();
2106 0 : ss << ";\n\t";
2107 :
2108 0 : ss<< "int buffer_nSettle_len = ";
2109 0 : ss<< tmpCurDVR1->GetArrayLength();
2110 0 : ss << ";\n\t";
2111 :
2112 0 : ss<< "int buffer_fRate_len = ";
2113 0 : ss<< tmpCurDVR2->GetArrayLength();
2114 0 : ss << ";\n\t";
2115 :
2116 0 : ss<< "int buffer_fVal_len = ";
2117 0 : ss<< tmpCurDVR3->GetArrayLength();
2118 0 : ss << ";\n\t";
2119 :
2120 0 : ss<< "int buffer_nMode_len = ";
2121 0 : ss<< tmpCurDVR4->GetArrayLength();
2122 0 : ss << ";\n\t";
2123 : #endif
2124 : #ifdef ISNAN
2125 0 : ss <<"if(gid0 >= buffer_nIssue_len || isNan(";
2126 0 : ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
2127 0 : ss <<"))\n\t\t";
2128 0 : ss <<"nStartDate = 0;\n\telse\n\t\t";
2129 : #endif
2130 0 : ss << "nStartDate=(int)";
2131 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2132 0 : ss <<";\n\t";
2133 : #ifdef ISNAN
2134 0 : ss <<"if(gid0 >= buffer_nSettle_len || isNan(";
2135 0 : ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
2136 0 : ss <<"))\n\t\t";
2137 0 : ss <<"nEndDate = 0;\n\telse\n\t\t";
2138 : #endif
2139 0 : ss << "nEndDate=(int)";
2140 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
2141 0 : ss << ";\n\t";
2142 :
2143 : #ifdef ISNAN
2144 0 : ss <<"if(gid0 >= buffer_fRate_len || isNan(";
2145 0 : ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
2146 0 : ss <<"))\n\t\t";
2147 0 : ss <<"fRate = 0;\n\telse\n\t\t";
2148 : #endif
2149 0 : ss << "fRate=";
2150 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
2151 0 : ss <<";\n\t";
2152 : #ifdef ISNAN
2153 0 : ss <<"if(gid0 >= buffer_fVal_len || isNan(";
2154 0 : ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
2155 0 : ss <<"))\n\t\t";
2156 0 : ss <<"fVal = 0;\n\telse\n\t\t";
2157 : #endif
2158 0 : ss << "fVal=";
2159 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
2160 0 : ss << ";\n\t";
2161 : #ifdef ISNAN
2162 0 : ss <<"if(gid0 >= buffer_nMode_len || isNan(";
2163 0 : ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
2164 0 : ss <<"))\n\t\t";
2165 0 : ss <<"mode = 0;\n\telse\n\t\t";
2166 : #endif
2167 0 : ss << "mode = (int)";
2168 0 : ss << vSubArguments[4]->GenSlidingWindowDeclRef();
2169 0 : ss << ";\n\t";
2170 0 : ss <<"int nDays1stYear=0;\n\t";
2171 0 : ss <<"int nNullDate=GetNullDate();\n\t";
2172 0 : ss <<"int nTotalDays = GetDiffDate(nNullDate,nStartDate,";
2173 0 : ss <<"nEndDate, mode,&nDays1stYear);\n\t";
2174 0 : ss <<"tmp = fVal*fRate*convert_double(nTotalDays)";
2175 0 : ss <<"/convert_double(nDays1stYear);\n\t";
2176 0 : ss << "return tmp;\n";
2177 0 : ss << "}";
2178 0 : }
2179 :
2180 0 : void OpYield::BinInlineFun(std::set<std::string>& decls,
2181 : std::set<std::string>& funs)
2182 : {
2183 0 : decls.insert(getYield_Decl);decls.insert(getPrice_Decl);
2184 0 : decls.insert(coupnumDecl);decls.insert(coupdaysncDecl);
2185 0 : decls.insert(coupdaybsDecl);decls.insert(coupdaysDecl);
2186 0 : decls.insert(lcl_GetcoupnumDecl);decls.insert(lcl_GetcoupdaysDecl);
2187 0 : decls.insert(lcl_GetcoupdaybsDecl);decls.insert(getDiffDecl);
2188 0 : decls.insert(getDaysInYearRangeDecl);decls.insert(GetDaysInYearDecl);
2189 0 : decls.insert(GetDaysInYearsDecl);decls.insert(getDaysInMonthRangeDecl);
2190 0 : decls.insert(addMonthsDecl);decls.insert(ScaDateDecl);
2191 0 : decls.insert(GetNullDateDecl);decls.insert(DateToDaysDecl);
2192 0 : decls.insert(DaysToDateDecl);decls.insert(DaysInMonthDecl);
2193 0 : decls.insert(IsLeapYearDecl);
2194 :
2195 0 : funs.insert(getYield_);funs.insert(getPrice_);
2196 0 : funs.insert(coupnum);funs.insert(coupdaysnc);
2197 0 : funs.insert(coupdaybs);funs.insert(coupdays);
2198 0 : funs.insert(lcl_Getcoupnum);funs.insert(lcl_Getcoupdays);
2199 0 : funs.insert(lcl_Getcoupdaybs);funs.insert(getDiff);
2200 0 : funs.insert(getDaysInYearRange);funs.insert(GetDaysInYear);
2201 0 : funs.insert(GetDaysInYears);funs.insert(getDaysInMonthRange);
2202 0 : funs.insert(addMonths);funs.insert(ScaDate);
2203 0 : funs.insert(GetNullDate);funs.insert(DateToDays);
2204 0 : funs.insert(DaysToDate);funs.insert(DaysInMonth);
2205 0 : funs.insert(IsLeapYear);
2206 0 : }
2207 :
2208 :
2209 0 : void OpYield::GenSlidingWindowFunction(
2210 : std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
2211 : {
2212 0 : ss << "\ndouble " << sSymName;
2213 0 : ss << "_"<< BinFuncName() <<"(";
2214 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
2215 : {
2216 0 : if (i)
2217 0 : ss << ",";
2218 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
2219 : }
2220 0 : ss << ") {\n\t";
2221 0 : ss << "double tmp = " <<"0"<<";\n\t";
2222 0 : ss << "int gid0 = get_global_id(0);\n\t";
2223 0 : ss << "double tmp000;\n\t";
2224 0 : ss << "double tmp001;\n\t";
2225 0 : ss << "double tmp002;\n\t";
2226 0 : ss << "double tmp003;\n\t";
2227 0 : ss << "double tmp004;\n\t";
2228 0 : ss << "double tmp005;\n\t";
2229 0 : ss << "double tmp006;\n\t";
2230 :
2231 :
2232 : #ifdef ISNAN
2233 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
2234 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
2235 0 : formula::SingleVectorRefToken *>(tmpCur0);
2236 :
2237 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
2238 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
2239 0 : formula::SingleVectorRefToken *>(tmpCur1);
2240 :
2241 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
2242 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
2243 0 : formula::SingleVectorRefToken *>(tmpCur2);
2244 :
2245 0 : FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
2246 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
2247 0 : formula::SingleVectorRefToken *>(tmpCur3);
2248 :
2249 0 : FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
2250 : const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
2251 0 : formula::SingleVectorRefToken *>(tmpCur4);
2252 :
2253 0 : FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
2254 : const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const
2255 0 : formula::SingleVectorRefToken *>(tmpCur5);
2256 :
2257 0 : FormulaToken *tmpCur6 = vSubArguments[6]->GetFormulaToken();
2258 : const formula::SingleVectorRefToken*tmpCurDVR6= static_cast<const
2259 0 : formula::SingleVectorRefToken *>(tmpCur6);
2260 :
2261 0 : ss<< "int buffer_tmp000_len = ";
2262 0 : ss<< tmpCurDVR0->GetArrayLength();
2263 0 : ss << ";\n\t";
2264 :
2265 0 : ss<< "int buffer_tmp001_len = ";
2266 0 : ss<< tmpCurDVR1->GetArrayLength();
2267 0 : ss << ";\n\t";
2268 :
2269 0 : ss<< "int buffer_tmp002_len = ";
2270 0 : ss<< tmpCurDVR2->GetArrayLength();
2271 0 : ss << ";\n\t";
2272 :
2273 0 : ss<< "int buffer_tmp003_len = ";
2274 0 : ss<< tmpCurDVR3->GetArrayLength();
2275 0 : ss << ";\n\t";
2276 :
2277 0 : ss<< "int buffer_tmp004_len = ";
2278 0 : ss<< tmpCurDVR4->GetArrayLength();
2279 0 : ss << ";\n\t";
2280 :
2281 0 : ss<< "int buffer_tmp005_len = ";
2282 0 : ss<< tmpCurDVR5->GetArrayLength();
2283 0 : ss << ";\n\t";
2284 :
2285 0 : ss<< "int buffer_tmp006_len = ";
2286 0 : ss<< tmpCurDVR6->GetArrayLength();
2287 0 : ss << ";\n\t";
2288 : #endif
2289 :
2290 : #ifdef ISNAN
2291 0 : ss<<"if(gid0>=buffer_tmp000_len || isNan(";
2292 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2293 0 : ss<<"))\n\t\t";
2294 0 : ss<<"tmp000 = 0;\n\telse \n\t\t";
2295 : #endif
2296 0 : ss<<"tmp000 = ";
2297 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2298 0 : ss<<";\n\t";
2299 :
2300 : #ifdef ISNAN
2301 0 : ss<<"if(gid0>=buffer_tmp001_len || isNan(";
2302 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
2303 0 : ss<<"))\n\t\t";
2304 0 : ss<<"tmp001 = 0;\n\telse \n\t\t";
2305 : #endif
2306 0 : ss<<"tmp001 = ";
2307 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
2308 0 : ss<<";\n\t";
2309 :
2310 : #ifdef ISNAN
2311 0 : ss<<"if(gid0>=buffer_tmp002_len || isNan(";
2312 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
2313 0 : ss<<"))\n\t\t";
2314 0 : ss<<"tmp002 = 0;\n\telse \n\t\t";
2315 : #endif
2316 0 : ss<<"tmp002 = ";
2317 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
2318 0 : ss<<";\n\t";
2319 :
2320 : #ifdef ISNAN
2321 0 : ss<<"if(gid0>=buffer_tmp003_len || isNan(";
2322 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
2323 0 : ss<<"))\n\t\t";
2324 0 : ss<<"tmp003 = 0;\n\telse \n\t\t";
2325 : #endif
2326 0 : ss<<"tmp003 = ";
2327 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
2328 0 : ss<<";\n\t";
2329 :
2330 : #ifdef ISNAN
2331 0 : ss<<"if(gid0>=buffer_tmp004_len || isNan(";
2332 0 : ss << vSubArguments[4]->GenSlidingWindowDeclRef();
2333 0 : ss<<"))\n\t\t";
2334 0 : ss<<"tmp004 = 0;\n\telse \n\t\t";
2335 : #endif
2336 0 : ss<<"tmp004 = ";
2337 0 : ss << vSubArguments[4]->GenSlidingWindowDeclRef();
2338 0 : ss<<";\n\t";
2339 :
2340 : #ifdef ISNAN
2341 0 : ss<<"if(gid0>=buffer_tmp005_len || isNan(";
2342 0 : ss << vSubArguments[5]->GenSlidingWindowDeclRef();
2343 0 : ss<<"))\n\t\t";
2344 0 : ss<<"tmp005 = 0;\n\telse \n\t\t";
2345 : #endif
2346 0 : ss<<"tmp005 = ";
2347 0 : ss << vSubArguments[5]->GenSlidingWindowDeclRef();
2348 0 : ss<<";\n\t";
2349 :
2350 : #ifdef ISNAN
2351 0 : ss<<"if(gid0>=buffer_tmp006_len || isNan(";
2352 0 : ss << vSubArguments[6]->GenSlidingWindowDeclRef();
2353 0 : ss<<"))\n\t\t";
2354 0 : ss<<"tmp006 = 0;\n\telse \n\t\t";
2355 : #endif
2356 0 : ss<<"tmp006 = ";
2357 0 : ss << vSubArguments[6]->GenSlidingWindowDeclRef();
2358 0 : ss<<";\n\t";
2359 :
2360 0 : ss << "tmp = getYield_(";
2361 0 : ss << "GetNullDate(),tmp000,tmp001,tmp002,tmp003,tmp004,tmp005,tmp006);\n\t ";
2362 0 : ss << "return tmp;\n";
2363 0 : ss << "}";
2364 0 : }
2365 :
2366 0 : void OpSLN::GenSlidingWindowFunction(std::stringstream &ss,
2367 : const std::string &sSymName, SubArguments &vSubArguments)
2368 : {
2369 0 : ss << "\ndouble " << sSymName;
2370 0 : ss << "_"<< BinFuncName() <<"(";
2371 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
2372 : {
2373 0 : if (i)
2374 0 : ss << ",";
2375 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
2376 : }
2377 0 : ss << ") {\n";
2378 0 : ss << " double tmp = " <<"0"<<";\n";
2379 0 : ss << " int gid0 = get_global_id(0);\n";
2380 0 : ss << " double wert;\n";
2381 0 : ss << " double rest;\n";
2382 0 : ss << " double dauer;\n";
2383 :
2384 : #ifdef ISNAN
2385 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
2386 : const formula::SingleVectorRefToken*tmpCurDVR0=
2387 0 : static_cast<const formula::SingleVectorRefToken *>(tmpCur0);
2388 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
2389 : const formula::SingleVectorRefToken*tmpCurDVR1=
2390 0 : static_cast<const formula::SingleVectorRefToken *>(tmpCur1);
2391 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
2392 : const formula::SingleVectorRefToken*tmpCurDVR2=
2393 0 : static_cast<const formula::SingleVectorRefToken *>(tmpCur2);
2394 0 : ss<< " int buffer_wert_len = ";
2395 0 : ss<< tmpCurDVR0->GetArrayLength();
2396 0 : ss << ";\n";
2397 0 : ss<< " int buffer_rest_len = ";
2398 0 : ss<< tmpCurDVR1->GetArrayLength();
2399 0 : ss << ";\n";
2400 0 : ss<< " int buffer_dauer_len = ";
2401 0 : ss<< tmpCurDVR2->GetArrayLength();
2402 0 : ss << ";\n";
2403 : #endif
2404 : #ifdef ISNAN
2405 0 : ss<<" if(gid0>=buffer_wert_len || isNan(";
2406 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2407 0 : ss<<"))\n";
2408 0 : ss<<" wert = 0;\n\telse \n";
2409 : #endif
2410 0 : ss<<" wert = ";
2411 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2412 0 : ss<<";\n";
2413 : #ifdef ISNAN
2414 0 : ss<<" if(gid0>=buffer_rest_len || isNan(";
2415 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
2416 0 : ss<<"))\n";
2417 0 : ss<<" rest = 0;\n\telse \n";
2418 : #endif
2419 0 : ss<<" rest = ";
2420 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
2421 0 : ss<<";\n";
2422 : #ifdef ISNAN
2423 0 : ss<<" if(gid0>=buffer_dauer_len || isNan(";
2424 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
2425 0 : ss<<"))\n";
2426 0 : ss<<" dauer = 0;\n\telse \n";
2427 : #endif
2428 0 : ss<<" dauer = ";
2429 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
2430 0 : ss<<";\n";
2431 0 : ss << " tmp = (wert-rest)*pow(dauer,-1);\n";
2432 0 : ss << " return tmp;\n";
2433 0 : ss << "}";
2434 0 : }
2435 :
2436 0 : void OpYieldmat::BinInlineFun(std::set<std::string>& decls,
2437 : std::set<std::string>& funs)
2438 : {
2439 0 : decls.insert(GetYearFrac_newDecl);decls.insert(GetNullDateDecl);
2440 0 : decls.insert(DateToDaysDecl);decls.insert(DaysToDate_newDecl);
2441 0 : decls.insert(DaysInMonthDecl);decls.insert(IsLeapYearDecl);
2442 0 : decls.insert(GetYieldmatDecl);
2443 :
2444 0 : funs.insert(GetYearFrac_new);funs.insert(GetNullDate);
2445 0 : funs.insert(DateToDays);funs.insert(DaysToDate_new);
2446 0 : funs.insert(DaysInMonth);funs.insert(IsLeapYear);
2447 0 : funs.insert(GetYieldmat);
2448 0 : }
2449 :
2450 0 : void OpYieldmat::GenSlidingWindowFunction(
2451 : std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
2452 : {
2453 0 : ss << "\ndouble " << sSymName;
2454 0 : ss << "_"<< BinFuncName() <<"(";
2455 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
2456 : {
2457 0 : if (i)
2458 0 : ss << ",";
2459 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
2460 : }
2461 0 : ss << ") {\n\t";
2462 0 : ss << "double tmp = " <<"0"<<";\n\t";
2463 0 : ss << "int gid0 = get_global_id(0);\n\t";
2464 0 : ss << "double tmp000;\n\t";
2465 0 : ss << "double tmp001;\n\t";
2466 0 : ss << "double tmp002;\n\t";
2467 0 : ss << "double tmp003;\n\t";
2468 0 : ss << "double tmp004;\n\t";
2469 0 : ss << "double tmp005;\n\t";
2470 :
2471 : #ifdef ISNAN
2472 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
2473 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
2474 0 : formula::SingleVectorRefToken *>(tmpCur0);
2475 :
2476 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
2477 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
2478 0 : formula::SingleVectorRefToken *>(tmpCur1);
2479 :
2480 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
2481 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
2482 0 : formula::SingleVectorRefToken *>(tmpCur2);
2483 :
2484 0 : FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
2485 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
2486 0 : formula::SingleVectorRefToken *>(tmpCur3);
2487 :
2488 0 : FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
2489 : const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
2490 0 : formula::SingleVectorRefToken *>(tmpCur4);
2491 :
2492 0 : FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
2493 : const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const
2494 0 : formula::SingleVectorRefToken *>(tmpCur5);
2495 :
2496 0 : ss<< "int buffer_tmp000_len = ";
2497 0 : ss<< tmpCurDVR0->GetArrayLength();
2498 0 : ss << ";\n\t";
2499 :
2500 0 : ss<< "int buffer_tmp001_len = ";
2501 0 : ss<< tmpCurDVR1->GetArrayLength();
2502 0 : ss << ";\n\t";
2503 :
2504 0 : ss<< "int buffer_tmp002_len = ";
2505 0 : ss<< tmpCurDVR2->GetArrayLength();
2506 0 : ss << ";\n\t";
2507 :
2508 0 : ss<< "int buffer_tmp003_len = ";
2509 0 : ss<< tmpCurDVR3->GetArrayLength();
2510 0 : ss << ";\n\t";
2511 :
2512 0 : ss<< "int buffer_tmp004_len = ";
2513 0 : ss<< tmpCurDVR4->GetArrayLength();
2514 0 : ss << ";\n\t";
2515 :
2516 0 : ss<< "int buffer_tmp005_len = ";
2517 0 : ss<< tmpCurDVR5->GetArrayLength();
2518 0 : ss << ";\n\t";
2519 :
2520 : #endif
2521 :
2522 : #ifdef ISNAN
2523 0 : ss<<"if(gid0>=buffer_tmp000_len || isNan(";
2524 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2525 0 : ss<<"))\n\t\t";
2526 0 : ss<<"tmp000 = 0;\n\telse \n\t\t";
2527 : #endif
2528 0 : ss<<"tmp000 = ";
2529 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
2530 0 : ss<<";\n\t";
2531 :
2532 : #ifdef ISNAN
2533 0 : ss<<"if(gid0>=buffer_tmp001_len || isNan(";
2534 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
2535 0 : ss<<"))\n\t\t";
2536 0 : ss<<"tmp001 = 0;\n\telse \n\t\t";
2537 : #endif
2538 0 : ss<<"tmp001 = ";
2539 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
2540 0 : ss<<";\n\t";
2541 :
2542 : #ifdef ISNAN
2543 0 : ss<<"if(gid0>=buffer_tmp002_len || isNan(";
2544 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
2545 0 : ss<<"))\n\t\t";
2546 0 : ss<<"tmp002 = 0;\n\telse \n\t\t";
2547 : #endif
2548 0 : ss<<"tmp002 = ";
2549 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
2550 0 : ss<<";\n\t";
2551 :
2552 : #ifdef ISNAN
2553 0 : ss<<"if(gid0>=buffer_tmp003_len || isNan(";
2554 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
2555 0 : ss<<"))\n\t\t";
2556 0 : ss<<"tmp003 = 0;\n\telse \n\t\t";
2557 : #endif
2558 0 : ss<<"tmp003 = ";
2559 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
2560 0 : ss<<";\n\t";
2561 :
2562 : #ifdef ISNAN
2563 0 : ss<<"if(gid0>=buffer_tmp004_len || isNan(";
2564 0 : ss << vSubArguments[4]->GenSlidingWindowDeclRef();
2565 0 : ss<<"))\n\t\t";
2566 0 : ss<<"tmp004 = 0;\n\telse \n\t\t";
2567 : #endif
2568 0 : ss<<"tmp004 = ";
2569 0 : ss << vSubArguments[4]->GenSlidingWindowDeclRef();
2570 0 : ss<<";\n\t";
2571 :
2572 : #ifdef ISNAN
2573 0 : ss<<"if(gid0>=buffer_tmp005_len || isNan(";
2574 0 : ss << vSubArguments[5]->GenSlidingWindowDeclRef();
2575 0 : ss<<"))\n\t\t";
2576 0 : ss<<"tmp005 = 0;\n\telse \n\t\t";
2577 : #endif
2578 0 : ss<<"tmp005 = ";
2579 0 : ss << vSubArguments[5]->GenSlidingWindowDeclRef();
2580 0 : ss<<";\n\t";
2581 :
2582 0 : ss << "tmp = GetYieldmat(";
2583 0 : ss<<"GetNullDate(),tmp000,tmp001,tmp002,tmp003,tmp004,tmp005);\n\t";
2584 0 : ss << "return tmp;\n";
2585 0 : ss << "}";
2586 0 : }
2587 :
2588 0 : void OpPMT::GenSlidingWindowFunction(std::stringstream &ss,
2589 : const std::string &sSymName, SubArguments &vSubArguments)
2590 : {
2591 0 : ss << "\ndouble " << sSymName;
2592 0 : ss << "_"<< BinFuncName() <<"(";
2593 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
2594 : {
2595 0 : if (i)
2596 0 : ss << ", ";
2597 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
2598 : }
2599 0 : ss<<") {\n";
2600 0 : ss<<" double tmp = 0;\n";
2601 0 : ss<<" double temp=0.0;\n";
2602 0 : ss<<" int gid0 = get_global_id(0);\n";
2603 0 : ss<<" double tmp0=0,tmp1=0,tmp2=0;\n";
2604 0 : ss<<" double tmp3=0,tmp4=0;\n";
2605 0 : size_t i = vSubArguments.size();
2606 0 : ss <<"\n ";
2607 : //while (i-- > 1)
2608 0 : for (i = 0; i < vSubArguments.size(); i++)
2609 : {
2610 0 : FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
2611 : assert(pCur);
2612 0 : if (pCur->GetType() == formula::svSingleVectorRef)
2613 : {
2614 : #ifdef ISNAN
2615 : const formula::SingleVectorRefToken* pSVR =
2616 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
2617 0 : ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n";
2618 : #else
2619 : #endif
2620 : }
2621 0 : else if (pCur->GetType() == formula::svDouble)
2622 : {
2623 : #ifdef ISNAN
2624 0 : ss << "{\n";
2625 : #endif
2626 : }
2627 : else
2628 : {
2629 : #ifdef ISNAN
2630 : #endif
2631 : }
2632 : #ifdef ISNAN
2633 0 : if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
2634 : {
2635 0 : ss <<" temp="<<vSubArguments[i]->GenSlidingWindowDeclRef();
2636 0 : ss <<";\n";
2637 0 : ss <<" if (isNan(temp))\n";
2638 0 : ss <<" tmp"<<i<<"= 0;\n";
2639 0 : ss <<" else\n";
2640 0 : ss <<" tmp"<<i<<"=temp;\n";
2641 0 : ss <<" }\n";
2642 : }
2643 : else
2644 : {
2645 0 : ss <<" tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(
2646 0 : );
2647 0 : ss <<";\n";
2648 : }
2649 : #else
2650 : ss <<" tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
2651 : ss <<";\n";
2652 :
2653 : #endif
2654 : }
2655 0 : ss<<" if(tmp0==0.0)\n";
2656 0 : ss<<" return -(tmp2+tmp3)/tmp1;\n";
2657 0 : ss<<" tmp-=tmp3;\n";
2658 0 : ss<<" tmp=tmp-tmp2*pow(1.0+tmp0,tmp1);\n";
2659 0 : ss<<" tmp=tmp*pow(( (1.0+tmp0*tmp4)* ";
2660 0 : ss<<"( (pow(1.0+tmp0,tmp1)-1.0)/tmp0)),-1);\n";
2661 0 : ss<<" return tmp;\n";
2662 0 : ss<<"}";
2663 0 : }
2664 :
2665 0 : void OpNPV::GenSlidingWindowFunction(std::stringstream &ss,
2666 : const std::string &sSymName, SubArguments &vSubArguments)
2667 : {
2668 0 : ss << "\ndouble " << sSymName;
2669 0 : ss << "_"<< BinFuncName() <<"(";
2670 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
2671 : {
2672 0 : if (i)
2673 0 : ss << ", ";
2674 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
2675 : }
2676 0 : ss << ") {\n";
2677 0 : ss << " double tmp = 0.0;\n";
2678 0 : ss << " int gid0 = get_global_id(0);\n";
2679 0 : ss << " int nCount = 1;\n";
2680 0 : ss << " double arg0=";
2681 0 : ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
2682 0 : ss <<";\n";
2683 : //while (i-- > 1)
2684 0 : for (size_t i = 1; i < vSubArguments.size(); i++)
2685 : {
2686 0 : FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
2687 : assert(pCur);
2688 0 : if (pCur->GetType() == formula::svDoubleVectorRef)
2689 : {
2690 : const formula::DoubleVectorRefToken* pDVR =
2691 0 : static_cast<const formula::DoubleVectorRefToken *>(pCur);
2692 0 : size_t nCurWindowSize = pDVR->GetRefRowSize();
2693 0 : ss << " for (int i = ";
2694 0 : if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) {
2695 : #ifdef ISNAN
2696 0 : ss << "gid0; i < " << pDVR->GetArrayLength();
2697 0 : ss << " && i < " << nCurWindowSize << "; i++){\n";
2698 : #else
2699 : ss << "gid0; i < "<< nCurWindowSize << "; i++)\n";
2700 : #endif
2701 0 : } else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) {
2702 : #ifdef ISNAN
2703 0 : ss << "0; i < " << pDVR->GetArrayLength();
2704 0 : ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n";
2705 : #else
2706 : ss << "0; i < gid0+"<< nCurWindowSize << "; i++)\n";
2707 : #endif
2708 0 : } else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){
2709 : #ifdef ISNAN
2710 0 : ss << "0; i + gid0 < " << pDVR->GetArrayLength();
2711 0 : ss << " && i < "<< nCurWindowSize << "; i++){\n";
2712 : #else
2713 : ss << "0; i < "<< nCurWindowSize << "; i++)\n";
2714 : #endif
2715 : }
2716 : else {
2717 : #ifdef ISNAN
2718 0 : ss << "0; i < "<< nCurWindowSize << "; i++){\n";
2719 : #else
2720 : ss << "0; i < "<< nCurWindowSize << "; i++)\n";
2721 : #endif
2722 : }
2723 : }
2724 0 : else if (pCur->GetType() == formula::svSingleVectorRef)
2725 : {
2726 : #ifdef ISNAN
2727 : const formula::SingleVectorRefToken* pSVR =
2728 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
2729 0 : ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n";
2730 : #else
2731 : #endif
2732 : }
2733 0 : else if (pCur->GetType() == formula::svDouble)
2734 : {
2735 : #ifdef ISNAN
2736 0 : ss << "{\n";
2737 : #endif
2738 : }
2739 : else
2740 : {
2741 : #ifdef ISNAN
2742 0 : ss << "nCount += 1;\n";
2743 : #endif
2744 : }
2745 : #ifdef ISNAN
2746 0 : if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
2747 : {
2748 0 : ss << " double temp=";
2749 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef();
2750 0 : ss << ";\n";
2751 0 : ss << " double temp1=1.0;";
2752 0 : ss << " if (isNan(temp)){\n";
2753 0 : ss << " tmp += 0;}\n";
2754 0 : ss << " else{\n";
2755 0 : ss << " for(int i=1;i<nCount;i+=2)\n";
2756 0 : ss << " temp1*=pow(1.0f+ arg0 ,2);\n";
2757 0 : ss << " if(nCount%2)\n";
2758 0 : ss << " temp1*=1.0f+ arg0;\n";
2759 0 : ss << " tmp +=temp/ temp1;\n";
2760 0 : ss << " nCount += 1;\n";
2761 0 : ss << " }\n";
2762 0 : ss << " }\n";
2763 : }
2764 : else
2765 : {
2766 0 : ss << " double temp=";
2767 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef();
2768 0 : ss << ";\n";
2769 0 : ss << " double temp1=1.0;";
2770 0 : ss << " for(int i=1;i<nCount;i+=2)";
2771 0 : ss << " temp1*=pow(1.0f+ arg0 ,2);\n";
2772 0 : ss << " if(nCount%2)";
2773 0 : ss << " temp1*=1.0f+ arg0;\n";
2774 0 : ss << " tmp +=temp/ temp1;\n";
2775 0 : ss << " nCount += 1;\n";
2776 : }
2777 : #else
2778 : ss << "tmp +="<<vSubArguments[i]->GenSlidingWindowDeclRef();
2779 : ss <<" / pow(1.0f+ arg0 ,";
2780 : ss <<" (double)nCount );\n";
2781 : ss << " nCount += 1;\n";
2782 : #endif
2783 : }
2784 0 : ss << " return tmp;\n";
2785 0 : ss << "}";
2786 0 : }
2787 :
2788 0 : void OpPrice::BinInlineFun(std::set<std::string>& decls,
2789 : std::set<std::string>& funs)
2790 : {
2791 0 : decls.insert(getPrice_new_Decl);
2792 0 : decls.insert(IsLeapYearDecl);decls.insert(DaysInMonthDecl);
2793 0 : decls.insert(DaysToDateDecl);
2794 0 : decls.insert(DateToDaysDecl);
2795 0 : decls.insert(ScaDateDecl);
2796 0 : decls.insert(setDayDecl);decls.insert(checklessthanDecl);
2797 0 : decls.insert(addMonthsDecl);decls.insert(lcl_Getcoupnum_newDecl);
2798 0 : decls.insert(coupnum_newDecl);
2799 0 : decls.insert(DateToDays_newDecl);
2800 0 : decls.insert(getDaysInMonthRangeDecl);
2801 0 : decls.insert(GetDaysInYearsDecl); decls.insert(GetDaysInYearDecl);
2802 0 : decls.insert(getDaysInYearRangeDecl); decls.insert(getDiffDecl);
2803 0 : decls.insert(coupdaybs_newDecl);
2804 0 : decls.insert(lcl_Getcoupdays_newDecl);
2805 0 : decls.insert(lcl_Getcoupdaybs_newDecl);
2806 0 : decls.insert(coupdays_newDecl);
2807 0 : decls.insert(coupdaysnc_newDecl);
2808 0 : funs.insert(IsLeapYear);funs.insert(DaysInMonth_new);
2809 0 : funs.insert(DaysToDate);funs.insert(DateToDays_new);
2810 0 : funs.insert(DateToDays);
2811 0 : funs.insert(ScaDate);
2812 0 : funs.insert(addMonths);funs.insert(getDaysInMonthRange);
2813 0 : funs.insert(GetDaysInYears);funs.insert(GetDaysInYear);
2814 0 : funs.insert(getDaysInYearRange);funs.insert(getDiff);
2815 0 : funs.insert(setDay);funs.insert(checklessthan);
2816 0 : funs.insert(lcl_Getcoupdaybs_new);
2817 0 : funs.insert(coupdaybs_new);
2818 0 : funs.insert(lcl_Getcoupdays_new);
2819 0 : funs.insert(coupdaysnc_new);
2820 0 : funs.insert(coupdays_new);
2821 0 : funs.insert(setDay);funs.insert(checklessthan);
2822 0 : funs.insert(lcl_Getcoupnum_new);
2823 0 : funs.insert(coupnum_new);funs.insert(getPrice_new);
2824 0 : }
2825 0 : void OpPrice::GenSlidingWindowFunction(std::stringstream &ss,
2826 : const std::string &sSymName, SubArguments &vSubArguments)
2827 : {
2828 0 : ss << "\ndouble " << sSymName;
2829 0 : ss << "_"<< BinFuncName() <<"(";
2830 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
2831 : {
2832 0 : if (i)
2833 0 : ss << ", ";
2834 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
2835 : }
2836 0 : ss<<") {\n";
2837 0 : ss<<" double tmp = 0;\n";
2838 0 : ss<<" int gid0 = get_global_id(0);\n";
2839 0 : ss<<" double tmp0=0;\n";
2840 0 : ss<<" double tmp1=0;\n";
2841 0 : ss<<" double tmp2=0;\n";
2842 0 : ss<<" double tmp3=0;\n";
2843 0 : ss<<" double tmp4=0,tmp5=0;\n";
2844 0 : ss<<" double tmp6=0;\n";
2845 0 : ss<<"\n";
2846 0 : for (size_t i = 0; i < vSubArguments.size(); i++)
2847 : {
2848 0 : FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
2849 : assert(pCur);
2850 0 : if (pCur->GetType() == formula::svSingleVectorRef)
2851 : {
2852 : #ifdef ISNAN
2853 : const formula::SingleVectorRefToken* pSVR =
2854 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
2855 0 : ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n";
2856 : #else
2857 : #endif
2858 : }
2859 0 : else if (pCur->GetType() == formula::svDouble)
2860 : {
2861 : #ifdef ISNAN
2862 0 : ss << "{\n";
2863 : #endif
2864 : }
2865 : else
2866 : {
2867 : #ifdef ISNAN
2868 : #endif
2869 : }
2870 : #ifdef ISNAN
2871 0 : if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
2872 : {
2873 0 : ss << " if (isNan(";
2874 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef();
2875 0 : ss << "))\n";
2876 0 : ss << " tmp"<<i<<"= 0;\n";
2877 0 : ss << " else\n";
2878 0 : ss << " tmp"<<i<<"=";
2879 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef();
2880 0 : ss << ";\n }\n";
2881 : }
2882 : else
2883 : {
2884 0 : ss << " tmp"<<i<<"=";
2885 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef();
2886 0 : ss <<";\n";
2887 : }
2888 : #else
2889 : ss << " tmp"<<i<<"=";
2890 : ss<<vSubArguments[i]->GenSlidingWindowDeclRef();
2891 : ss <<";\n";
2892 : #endif
2893 : }
2894 0 : ss << " tmp = getPrice_(tmp0,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);\n";
2895 0 : ss << " return tmp;\n";
2896 0 : ss << "}";
2897 0 : }
2898 :
2899 0 : void OpOddlprice::BinInlineFun(std::set<std::string>& decls,
2900 : std::set<std::string>& funs)
2901 : {
2902 0 : decls.insert(GetOddlpriceDecl);decls.insert(GetDiffDateDecl);
2903 0 : decls.insert(GetYearDiffDecl);decls.insert(IsLeapYearDecl);
2904 0 : decls.insert(GetNullDateDecl);decls.insert(DateToDaysDecl);
2905 0 : decls.insert(DaysToDateDecl);decls.insert(DaysInMonthDecl);
2906 0 : decls.insert(GetYearFracDecl);
2907 0 : funs.insert(GetOddlprice);funs.insert(GetDiffDate);
2908 0 : funs.insert(GetYearDiff);funs.insert(IsLeapYear);
2909 0 : funs.insert(GetNullDate);funs.insert(DaysInMonth);
2910 0 : funs.insert(DaysToDate);funs.insert(DateToDays);
2911 0 : funs.insert(GetYearFrac);
2912 0 : }
2913 0 : void OpOddlprice::GenSlidingWindowFunction(std::stringstream &ss,
2914 : const std::string &sSymName, SubArguments &vSubArguments)
2915 : {
2916 0 : ss << "\ndouble " << sSymName;
2917 0 : ss << "_"<< BinFuncName() <<"(";
2918 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
2919 : {
2920 0 : if (i)
2921 0 : ss << ", ";
2922 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
2923 : }
2924 0 : ss <<") {\n";
2925 0 : ss <<" double tmp = 0;\n";
2926 0 : ss <<" int gid0 = get_global_id(0);\n";
2927 0 : ss <<" double tmp0=0;\n";
2928 0 : ss <<" double tmp1=0;\n";
2929 0 : ss <<" double tmp2=0;\n";
2930 0 : ss <<" double tmp3=0;\n";
2931 0 : ss <<" double tmp4=0;\n";
2932 0 : ss <<" double tmp5=0;\n";
2933 0 : ss <<" double tmp6=0;\n";
2934 0 : ss <<" double tmp7=0;\n";
2935 0 : size_t nItems = 0;
2936 0 : ss <<" \n";
2937 0 : for (size_t i = 0; i < vSubArguments.size(); i++)
2938 : {
2939 0 : FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
2940 : assert(pCur);
2941 0 : if (pCur->GetType() == formula::svDoubleVectorRef)
2942 : {
2943 : const formula::DoubleVectorRefToken* pDVR =
2944 0 : static_cast<const formula::DoubleVectorRefToken *>(pCur);
2945 0 : size_t nCurWindowSize = pDVR->GetRefRowSize();
2946 0 : ss << " for (int i = ";
2947 0 : if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) {
2948 : #ifdef ISNAN
2949 0 : ss << "gid0; i < " << pDVR->GetArrayLength();
2950 0 : ss << " && i < " << nCurWindowSize << "; i++){\n";
2951 : #else
2952 : ss << "gid0; i < "<< nCurWindowSize << "; i++)\n";
2953 : #endif
2954 0 : } else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) {
2955 : #ifdef ISNAN
2956 0 : ss << "0; i < " << pDVR->GetArrayLength();
2957 0 : ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n";
2958 : #else
2959 : ss << "0; i < gid0+"<< nCurWindowSize << "; i++)\n";
2960 : #endif
2961 0 : } else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){
2962 : #ifdef ISNAN
2963 0 : ss << "0; i + gid0 < " << pDVR->GetArrayLength();
2964 0 : ss << " && i < "<< nCurWindowSize << "; i++){\n";
2965 : #else
2966 : ss << "0; i < "<< nCurWindowSize << "; i++)\n";
2967 : #endif
2968 : }
2969 : else {
2970 : #ifdef ISNAN
2971 0 : ss << "0; i < "<< nCurWindowSize << "; i++){\n";
2972 : #else
2973 : ss << "0; i < "<< nCurWindowSize << "; i++)\n";
2974 : #endif
2975 : }
2976 0 : nItems += nCurWindowSize;
2977 : }
2978 0 : else if (pCur->GetType() == formula::svSingleVectorRef)
2979 : {
2980 : #ifdef ISNAN
2981 : const formula::SingleVectorRefToken* pSVR =
2982 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
2983 0 : ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n";
2984 : #else
2985 : nItems += 1;
2986 : #endif
2987 : }
2988 0 : else if (pCur->GetType() == formula::svDouble)
2989 : {
2990 : #ifdef ISNAN
2991 0 : ss << "{\n";
2992 : #endif
2993 0 : nItems += 1;
2994 : }
2995 : else
2996 : {
2997 : #ifdef ISNAN
2998 : #endif
2999 0 : nItems += 1;
3000 : }
3001 : #ifdef ISNAN
3002 0 : if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
3003 : {
3004 0 : ss << " if (isNan(";
3005 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef();
3006 0 : ss << "))\n";
3007 0 : ss << " tmp"<<i<<"= 0;\n";
3008 0 : ss << " else\n";
3009 0 : ss << " tmp"<<i<<"=";
3010 0 : ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
3011 0 : ss << ";\n";
3012 0 : ss <<" }\n";
3013 : }
3014 : else
3015 : {
3016 0 : ss << " tmp"<<i<<"=";
3017 0 : ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
3018 0 : ss <<";\n";
3019 : }
3020 : #else
3021 : ss << " tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
3022 : ss <<";\n";
3023 : #endif
3024 : }
3025 0 : ss <<" int nNullDate = GetNullDate();\n";
3026 0 : ss <<" tmp = GetOddlprice(nNullDate,tmp0,tmp1,";
3027 0 : ss <<"tmp2,tmp3,tmp4,tmp5,tmp6,tmp7);\n";
3028 0 : ss <<" return tmp;\n";
3029 0 : ss <<"}";
3030 0 : }
3031 0 : void OpOddlyield::BinInlineFun(std::set<std::string>& decls,
3032 : std::set<std::string>& funs)
3033 : {
3034 0 : decls.insert(GetDiffDateDecl);decls.insert(DaysToDateDecl);
3035 0 : decls.insert(GetYearDiffDecl);decls.insert(IsLeapYearDecl);
3036 0 : decls.insert(GetNullDateDecl);decls.insert(DateToDaysDecl);
3037 0 : decls.insert(DaysInMonthDecl);
3038 0 : decls.insert(GetYearFracDecl);decls.insert(GetOddlyieldDecl);
3039 0 : funs.insert(GetDiffDate);funs.insert(DaysToDate);
3040 0 : funs.insert(GetYearDiff);funs.insert(IsLeapYear);
3041 0 : funs.insert(GetNullDate);funs.insert(DaysInMonth);
3042 0 : funs.insert(DateToDays);
3043 0 : funs.insert(GetYearFrac);funs.insert(GetOddlyield);
3044 0 : }
3045 0 : void OpOddlyield::GenSlidingWindowFunction(std::stringstream &ss,
3046 : const std::string &sSymName, SubArguments &vSubArguments)
3047 : {
3048 0 : ss << "\ndouble " << sSymName;
3049 0 : ss << "_"<< BinFuncName() <<"(";
3050 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
3051 : {
3052 0 : if (i)
3053 0 : ss << ", ";
3054 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
3055 : }
3056 0 : ss <<") {\n";
3057 0 : ss <<" double tmp = 0;\n";
3058 0 : ss <<" int gid0 = get_global_id(0);\n";
3059 0 : ss <<" double tmp0=0;\n";
3060 0 : ss <<" double tmp1=0;\n";
3061 0 : ss <<" double tmp2=0;\n";
3062 0 : ss <<" double tmp3=0;\n";
3063 0 : ss <<" double tmp4=0;\n";
3064 0 : ss <<" double tmp5=0;\n";
3065 0 : ss <<" double tmp6=0;\n";
3066 0 : ss <<" double tmp7=0;\n";
3067 0 : size_t nItems = 0;
3068 0 : ss <<" \n";
3069 0 : for (size_t i = 0; i < vSubArguments.size(); i++)
3070 : {
3071 0 : FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
3072 : assert(pCur);
3073 0 : if (pCur->GetType() == formula::svDoubleVectorRef)
3074 : {
3075 : const formula::DoubleVectorRefToken* pDVR =
3076 0 : static_cast<const formula::DoubleVectorRefToken *>(pCur);
3077 0 : size_t nCurWindowSize = pDVR->GetRefRowSize();
3078 0 : ss << " for (int i = ";
3079 0 : if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) {
3080 : #ifdef ISNAN
3081 0 : ss << "gid0; i < " << pDVR->GetArrayLength();
3082 0 : ss << " && i < " << nCurWindowSize << "; i++){\n";
3083 : #else
3084 : ss << "gid0; i < "<< nCurWindowSize << "; i++)\n";
3085 : #endif
3086 0 : } else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) {
3087 : #ifdef ISNAN
3088 0 : ss << "0; i < " << pDVR->GetArrayLength();
3089 0 : ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n";
3090 : #else
3091 : ss << "0; i < gid0+"<< nCurWindowSize << "; i++)\n";
3092 : #endif
3093 0 : } else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){
3094 : #ifdef ISNAN
3095 0 : ss << "0; i + gid0 < " << pDVR->GetArrayLength();
3096 0 : ss << " && i < "<< nCurWindowSize << "; i++){\n";
3097 : #else
3098 : ss << "0; i < "<< nCurWindowSize << "; i++)\n";
3099 : #endif
3100 : }
3101 : else {
3102 : #ifdef ISNAN
3103 0 : ss << "0; i < "<< nCurWindowSize << "; i++){\n";
3104 : #else
3105 : ss << "0; i < "<< nCurWindowSize << "; i++)\n";
3106 : #endif
3107 : }
3108 0 : nItems += nCurWindowSize;
3109 : }
3110 0 : else if (pCur->GetType() == formula::svSingleVectorRef)
3111 : {
3112 : #ifdef ISNAN
3113 : const formula::SingleVectorRefToken* pSVR =
3114 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
3115 0 : ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n";
3116 : #else
3117 : nItems += 1;
3118 : #endif
3119 : }
3120 0 : else if (pCur->GetType() == formula::svDouble)
3121 : {
3122 : #ifdef ISNAN
3123 0 : ss << "{\n";
3124 : #endif
3125 0 : nItems += 1;
3126 : }
3127 : else
3128 : {
3129 : #ifdef ISNAN
3130 : #endif
3131 0 : nItems += 1;
3132 : }
3133 : #ifdef ISNAN
3134 0 : if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
3135 : {
3136 0 : ss << " if (isNan(";
3137 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef();
3138 0 : ss << "))\n";
3139 0 : ss << " tmp"<<i<<"= 0;\n";
3140 0 : ss << " else\n";
3141 0 : ss << " tmp"<<i<<"=";
3142 0 : ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
3143 0 : ss << ";\n";
3144 0 : ss <<" }\n";
3145 : }
3146 : else
3147 : {
3148 0 : ss << " tmp"<<i<<"=";
3149 0 : ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
3150 0 : ss <<";\n";
3151 : }
3152 : #else
3153 : ss << " tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
3154 : ss <<";\n";
3155 : #endif
3156 : }
3157 0 : ss <<" int nNullDate = GetNullDate();\n";
3158 0 : ss <<" tmp = GetOddlyield(nNullDate,tmp0,tmp1";
3159 0 : ss <<",tmp2,tmp3,tmp4,tmp5,tmp6,tmp7);\n";
3160 0 : ss <<" return tmp;\n";
3161 0 : ss <<"}";
3162 0 : }
3163 0 : void OpPriceDisc::BinInlineFun(std::set<std::string>& decls,
3164 : std::set<std::string>& funs)
3165 : {
3166 0 : decls.insert(GetYearDiffDecl);decls.insert(getDiffDecl);
3167 0 : decls.insert(getDaysInYearRangeDecl);decls.insert(GetDaysInYearDecl);
3168 0 : decls.insert(GetDaysInYearsDecl);decls.insert(getDaysInMonthRangeDecl);
3169 0 : decls.insert(addMonthsDecl);decls.insert(ScaDateDecl);
3170 0 : decls.insert(GetNullDateDecl);decls.insert(DateToDaysDecl);
3171 0 : decls.insert(DaysToDateDecl);decls.insert(DaysInMonthDecl);
3172 0 : decls.insert(IsLeapYearDecl);decls.insert(GetDiffDateDecl);
3173 0 : funs.insert(GetYearDiff);funs.insert(getDiff);
3174 0 : funs.insert(getDaysInYearRange);funs.insert(GetDaysInYear);
3175 0 : funs.insert(GetDaysInYears);funs.insert(getDaysInMonthRange);
3176 0 : funs.insert(addMonths);funs.insert(ScaDate);
3177 0 : funs.insert(GetNullDate);funs.insert(DateToDays);
3178 0 : funs.insert(DaysToDate);funs.insert(DaysInMonth);
3179 0 : funs.insert(IsLeapYear);funs.insert(GetDiffDate);
3180 0 : }
3181 0 : void OpPriceDisc::GenSlidingWindowFunction(std::stringstream &ss,
3182 : const std::string &sSymName, SubArguments &vSubArguments)
3183 : {
3184 0 : ss << "\ndouble " << sSymName;
3185 0 : ss << "_"<< BinFuncName() <<"(";
3186 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
3187 : {
3188 0 : if (i)
3189 0 : ss << ", ";
3190 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
3191 : }
3192 0 : ss << ") {\n";
3193 0 : ss << " double tmp = 0;\n";
3194 0 : ss << " int gid0 = get_global_id(0);\n";
3195 0 : ss<<" double tmp0=0;\n";
3196 0 : ss<<" double tmp1=0;\n";
3197 0 : ss<<" double tmp2=0;\n";
3198 0 : ss<<" double tmp3=0;\n";
3199 0 : ss<<" double tmp4=0;\n";
3200 0 : ss <<" \n";
3201 0 : for (size_t i = 0; i < vSubArguments.size(); i++)
3202 : {
3203 0 : FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
3204 : assert(pCur);
3205 0 : if (pCur->GetType() == formula::svSingleVectorRef)
3206 : {
3207 : #ifdef ISNAN
3208 : const formula::SingleVectorRefToken* pSVR =
3209 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
3210 0 : ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n";
3211 : #else
3212 : #endif
3213 : }
3214 0 : else if (pCur->GetType() == formula::svDouble)
3215 : {
3216 : #ifdef ISNAN
3217 0 : ss << "{\n";
3218 : #endif
3219 : }
3220 : else
3221 : {
3222 : #ifdef ISNAN
3223 : #endif
3224 : }
3225 : #ifdef ISNAN
3226 0 : if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
3227 : {
3228 0 : ss << " if (isNan(";
3229 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef();
3230 0 : ss << "))\n";
3231 0 : ss << " tmp"<<i<<"= 0;\n";
3232 0 : ss << " else\n";
3233 0 : ss << " tmp"<<i<<"=";
3234 0 : ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
3235 0 : ss << ";\n";
3236 0 : ss <<" }\n";
3237 : }
3238 : else
3239 : {
3240 0 : ss << " tmp"<<i<<"=";
3241 0 : ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
3242 0 : ss <<";\n";
3243 : }
3244 : #else
3245 : ss << " tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
3246 : ss <<";\n";
3247 : #endif
3248 : }
3249 0 : ss <<" int nNullDate = GetNullDate();\n";
3250 0 : ss <<" tmp=tmp3* ( 1.0 -tmp2*GetYearDiff( nNullDate, ";
3251 0 : ss <<"tmp0,tmp1,tmp4));\n";
3252 0 : ss <<" return tmp;\n";
3253 0 : ss <<"}";
3254 0 : }
3255 0 : void OpNper::GenSlidingWindowFunction(std::stringstream &ss,
3256 : const std::string &sSymName, SubArguments &vSubArguments)
3257 : {
3258 0 : ss << "\ndouble " << sSymName;
3259 0 : ss << "_"<< BinFuncName() <<"(";
3260 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
3261 : {
3262 0 : if (i)
3263 0 : ss << ", ";
3264 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
3265 : }
3266 0 : ss << ") {\n";
3267 0 : ss << " double tmp = 0;\n";
3268 0 : ss << " int gid0 = get_global_id(0);\n";
3269 0 : ss <<" double tmp0=0;\n";
3270 0 : ss <<" double tmp1=0;\n";
3271 0 : ss <<" double tmp2=0;\n";
3272 0 : ss <<" double tmp3=0;\n";
3273 0 : ss <<" double tmp4=0;\n";
3274 0 : size_t nItems = 0;
3275 0 : for (size_t i = 0; i < vSubArguments.size(); i++)
3276 : {
3277 0 : FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
3278 : assert(pCur);
3279 0 : if (pCur->GetType() == formula::svSingleVectorRef)
3280 : {
3281 : #ifdef ISNAN
3282 : const formula::SingleVectorRefToken* pSVR =
3283 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
3284 0 : ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n";
3285 : #else
3286 : nItems += 1;
3287 : #endif
3288 : }
3289 0 : else if (pCur->GetType() == formula::svDouble)
3290 : {
3291 : #ifdef ISNAN
3292 0 : ss << "{\n";
3293 : #endif
3294 0 : nItems += 1;
3295 : }
3296 : else
3297 : {
3298 : #ifdef ISNAN
3299 : #endif
3300 0 : nItems += 1;
3301 : }
3302 : #ifdef ISNAN
3303 0 : if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
3304 : {
3305 0 : ss << " if (isNan(";
3306 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef();
3307 0 : ss << "))\n";
3308 0 : ss << " tmp"<<i<<"= 0;\n";
3309 0 : ss << " else\n";
3310 0 : ss << " tmp"<<i<<"=";
3311 0 : ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
3312 0 : ss << ";\n";
3313 0 : ss <<" }\n";
3314 : }
3315 : else
3316 : {
3317 0 : ss << " tmp"<<i<<"=";
3318 0 : ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
3319 0 : ss <<";\n";
3320 : }
3321 : #else
3322 : ss << " tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
3323 : ss <<";\n";
3324 : #endif
3325 : }
3326 0 : ss <<" if (tmp0 == 0.0)\n";
3327 0 : ss <<" tmp=(-1*(tmp2 + tmp3)/tmp1);\n";
3328 0 : ss <<" else if (tmp4 > 0.0)\n";
3329 0 : ss <<" tmp=log(-1*(tmp0*tmp3-tmp1*(1.0+tmp0))*";
3330 0 : ss <<"pow((tmp0*tmp2+tmp1*(1.0+tmp0)),-1))/log(1.0+tmp0);\n";
3331 0 : ss <<" else\n";
3332 0 : ss <<" tmp=log(-1*(tmp0*tmp3-tmp1)*pow(tmp0*tmp2+tmp1,-1))";
3333 0 : ss <<"/log(1.0+tmp0);\n";
3334 0 : ss <<" return tmp;\n";
3335 0 : ss <<"}";
3336 0 : }
3337 :
3338 0 : void OpPPMT::BinInlineFun(std::set<std::string>& decls,
3339 : std::set<std::string>& funs)
3340 : {
3341 0 : decls.insert(GetZwDecl);
3342 0 : funs.insert(GetZw);
3343 0 : }
3344 :
3345 0 : void OpPPMT::GenSlidingWindowFunction(std::stringstream &ss,
3346 : const std::string &sSymName, SubArguments &vSubArguments)
3347 : {
3348 0 : ss << "\ndouble " << sSymName;
3349 0 : ss << "_"<< BinFuncName() <<"(";
3350 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
3351 : {
3352 0 : if (i)
3353 0 : ss << ", ";
3354 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
3355 : }
3356 0 : ss<<") {\n";
3357 0 : ss<<" double tmp = 0;\n";
3358 0 : ss<<" int gid0 = get_global_id(0);\n";
3359 0 : ss<<" double arg=0;\n";
3360 0 : ss<<" double tmp0=0;\n";
3361 0 : ss<<" double tmp1=0;\n";
3362 0 : ss<<" double tmp2=0;\n";
3363 0 : ss<<" double tmp3=0;\n";
3364 0 : ss<<" double tmp4=0,tmp5=0;\n";
3365 0 : ss <<"\n ";
3366 : //while (i-- > 1)
3367 0 : for (size_t i = 0; i < vSubArguments.size(); i++)
3368 : {
3369 0 : FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
3370 : assert(pCur);
3371 0 : if (pCur->GetType() == formula::svSingleVectorRef)
3372 : {
3373 : #ifdef ISNAN
3374 : const formula::SingleVectorRefToken* pSVR =
3375 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
3376 0 : ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n";
3377 : #else
3378 : #endif
3379 : }
3380 0 : else if (pCur->GetType() == formula::svDouble)
3381 : {
3382 : #ifdef ISNAN
3383 0 : ss << "{\n";
3384 : #endif
3385 : }
3386 : else
3387 : {
3388 : #ifdef ISNAN
3389 : #endif
3390 : }
3391 : #ifdef ISNAN
3392 0 : if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
3393 : {
3394 0 : ss << " arg=";
3395 0 : ss << vSubArguments[i]->GenSlidingWindowDeclRef();
3396 0 : ss << ";\n";
3397 0 : ss << " if (isNan(arg))\n";
3398 0 : ss << " tmp"<<i<<"= 0;\n";
3399 0 : ss << " else\n";
3400 0 : ss << " tmp"<<i<<"=arg;\n";
3401 0 : ss << " }\n";
3402 : }
3403 : else
3404 : {
3405 0 : ss<<" tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
3406 0 : ss<<";\n";
3407 : }
3408 : #else
3409 : ss<<"tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
3410 : ss<<";\n";
3411 : #endif
3412 : }
3413 0 : ss<<" double pmt=0 ;\n";
3414 0 : ss<<" if(tmp0==0.0)\n";
3415 0 : ss<<" return -(tmp3+tmp4)/tmp2;\n";
3416 0 : ss<<" pmt=pmt-tmp4-tmp3*pow(1.0+tmp0,tmp2);\n";
3417 0 : ss<<" pmt=pmt*pow(( (1.0+tmp0*tmp5)* ";
3418 0 : ss<<"( (pow(1.0+tmp0,tmp2)-1.0)/tmp0)),-1);\n";
3419 0 : ss<<" double temp = pow( 1+tmp0,tmp1-2);\n";
3420 0 : ss<<" double re;\n";
3421 0 : ss<<" if(tmp1==1.0){\n";
3422 0 : ss<<" if(tmp5>0.0)\n";
3423 0 : ss<<" re=0.0;\n";
3424 0 : ss<<" else\n";
3425 0 : ss<<" re=-tmp3;\n";
3426 0 : ss<<" }\n";
3427 0 : ss<<" else\n";
3428 0 : ss<<" {\n";
3429 0 : ss<<" if(tmp5>0.0)\n ";
3430 0 : ss<<" re=GetZw(tmp0, tmp1-2.0, pmt, tmp3, 1.0) - pmt;\n";
3431 0 : ss<<" else\n";
3432 0 : ss<<" re=GetZw(tmp0, tmp1-1.0, pmt, tmp3, 0.0);\n";
3433 0 : ss<<" }\n ";
3434 0 : ss<<" re = re * tmp0;\n";
3435 0 : ss<<" tmp = pmt - re;\n";
3436 0 : ss<<" return tmp;\n";
3437 0 : ss<<"}";
3438 0 : }
3439 :
3440 0 : void OpCoupdaybs::BinInlineFun(std::set<std::string>& decls,
3441 : std::set<std::string>& funs)
3442 : {
3443 0 : decls.insert(IsLeapYearDecl); decls.insert(DaysInMonthDecl);
3444 0 : decls.insert(DaysToDateDecl); decls.insert(DateToDays_newDecl);
3445 0 : decls.insert(GetNullDate_newDecl); decls.insert(ScaDateDecl);
3446 0 : decls.insert(addMonthsDecl); decls.insert(getDaysInMonthRangeDecl);
3447 0 : decls.insert(GetDaysInYearsDecl);
3448 0 : decls.insert(getDaysInYearRangeDecl); decls.insert(getDiffDecl);
3449 0 : decls.insert(setDayDecl);decls.insert(checklessthanDecl);
3450 0 : decls.insert(lcl_Getcoupdaybs_newDecl);
3451 0 : decls.insert(coupdaybs_newDecl);
3452 0 : funs.insert(IsLeapYear);funs.insert(DaysInMonth);
3453 0 : funs.insert(DaysToDate);funs.insert(DateToDays_new);
3454 0 : funs.insert(GetNullDate_new);funs.insert(ScaDate);
3455 0 : funs.insert(addMonths);funs.insert(getDaysInMonthRange);
3456 0 : funs.insert(GetDaysInYears);
3457 0 : funs.insert(getDaysInYearRange);funs.insert(getDiff);
3458 0 : funs.insert(setDay);funs.insert(checklessthan);
3459 0 : funs.insert(lcl_Getcoupdaybs_new);
3460 0 : funs.insert(coupdaybs_new);
3461 0 : }
3462 0 : void OpCoupdaybs::GenSlidingWindowFunction(
3463 : std::stringstream &ss, const std::string &sSymName, SubArguments &
3464 : vSubArguments)
3465 : {
3466 0 : ss << "\ndouble " << sSymName;
3467 0 : ss << "_"<< BinFuncName() <<"(";
3468 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
3469 : {
3470 0 : if (i)
3471 0 : ss << ",";
3472 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
3473 : }
3474 0 : ss << ") {\n";
3475 0 : ss << " double tmp = 0;\n";
3476 0 : ss << " int gid0 = get_global_id(0);\n";
3477 0 : ss << " int nSettle,nMat,nFreq,nBase;\n";
3478 : #ifdef ISNAN
3479 0 : FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
3480 0 : FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
3481 0 : FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
3482 0 : FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
3483 : #endif
3484 : #ifdef ISNAN
3485 0 : if(tmpCur0->GetType() == formula::svSingleVectorRef)
3486 : {
3487 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
3488 0 : formula::SingleVectorRefToken *>(tmpCur0);
3489 0 : ss <<" if(isNan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
3490 0 : ss <<")||(gid0 >="<<tmpCurDVR0->GetArrayLength()<<"))\n";
3491 0 : ss <<" nSettle = 0;\n else\n";
3492 : }
3493 : #endif
3494 0 : ss <<" nSettle=(int)";
3495 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3496 0 : ss <<";\n";
3497 : #ifdef ISNAN
3498 0 : if(tmpCur1->GetType() == formula::svSingleVectorRef)
3499 : {
3500 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
3501 0 : formula::SingleVectorRefToken *>(tmpCur1);
3502 0 : ss <<" if(isNan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
3503 0 : ss <<")||(gid0 >="<<tmpCurDVR1->GetArrayLength()<<"))\n";
3504 0 : ss <<" nMat = 0;\n else\n";
3505 : }
3506 : #endif
3507 0 : ss <<" nMat=(int)";
3508 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
3509 0 : ss <<";\n";
3510 : #ifdef ISNAN
3511 0 : if(tmpCur2->GetType() == formula::svSingleVectorRef)
3512 : {
3513 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
3514 0 : formula::SingleVectorRefToken *>(tmpCur2);
3515 0 : ss <<" if(isNan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
3516 0 : ss <<")||(gid0 >="<<tmpCurDVR2->GetArrayLength()<<"))\n";
3517 0 : ss <<" nFreq = 0;\n else\n";
3518 : }
3519 : #endif
3520 0 : ss << " nFreq=(int)";
3521 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
3522 0 : ss <<";\n";
3523 : #ifdef ISNAN
3524 0 : if(tmpCur3->GetType() == formula::svSingleVectorRef)
3525 : {
3526 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
3527 0 : formula::SingleVectorRefToken *>(tmpCur3);
3528 0 : ss <<" if(isNan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
3529 0 : ss <<")||(gid0 >="<<tmpCurDVR3->GetArrayLength()<<"))\n";
3530 0 : ss <<" nBase = 0;\n else\n";
3531 : }
3532 : #endif
3533 0 : ss << " nBase=(int)";
3534 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
3535 0 : ss << ";\n";
3536 0 : ss <<" tmp = coupdaybs_new(nSettle,nMat,nFreq,nBase);\n";
3537 0 : ss <<" return tmp;\n";
3538 0 : ss <<"}";
3539 0 : }
3540 :
3541 0 : void OpCoupdays::BinInlineFun(std::set<std::string>& decls,
3542 : std::set<std::string>& funs)
3543 : {
3544 0 : decls.insert(IsLeapYearDecl); decls.insert(DaysInMonthDecl);
3545 0 : decls.insert(DaysToDateDecl); decls.insert(DateToDays_newDecl);
3546 0 : decls.insert(GetNullDate_newDecl); decls.insert(ScaDateDecl);
3547 0 : decls.insert(addMonthsDecl); decls.insert(getDaysInMonthRangeDecl);
3548 0 : decls.insert(GetDaysInYearsDecl); decls.insert(GetDaysInYearDecl);
3549 0 : decls.insert(getDaysInYearRangeDecl); decls.insert(getDiffDecl);
3550 0 : decls.insert(setDayDecl);decls.insert(checklessthanDecl);
3551 0 : decls.insert(lcl_Getcoupdays_newDecl);
3552 0 : decls.insert(coupdays_newDecl);
3553 0 : funs.insert(IsLeapYear);funs.insert(DaysInMonth);
3554 0 : funs.insert(DaysToDate);funs.insert(DateToDays_new);
3555 0 : funs.insert(GetNullDate_new);funs.insert(ScaDate);
3556 0 : funs.insert(addMonths);funs.insert(getDaysInMonthRange);
3557 0 : funs.insert(GetDaysInYears);funs.insert(GetDaysInYear);
3558 0 : funs.insert(getDaysInYearRange);funs.insert(getDiff);
3559 0 : funs.insert(lcl_Getcoupdays_new);
3560 0 : funs.insert(setDay);funs.insert(checklessthan);
3561 0 : funs.insert(coupdays_new);
3562 0 : }
3563 0 : void OpCoupdays::GenSlidingWindowFunction(
3564 : std::stringstream &ss, const std::string &sSymName, SubArguments &
3565 : vSubArguments)
3566 : {
3567 0 : ss << "\ndouble " << sSymName;
3568 0 : ss << "_"<< BinFuncName() <<"(";
3569 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
3570 : {
3571 0 : if (i)
3572 0 : ss << ",";
3573 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
3574 : }
3575 0 : ss << ") {\n";
3576 0 : ss << " double tmp = 0;\n";
3577 0 : ss << " int gid0 = get_global_id(0);\n";
3578 0 : ss << " int nSettle,nMat,nFreq,nBase;\n";
3579 : #ifdef ISNAN
3580 0 : FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
3581 0 : FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
3582 0 : FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
3583 0 : FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
3584 : #endif
3585 : #ifdef ISNAN
3586 0 : if(tmpCur0->GetType() == formula::svSingleVectorRef)
3587 : {
3588 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
3589 0 : formula::SingleVectorRefToken *>(tmpCur0);
3590 0 : ss <<" if(isNan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
3591 0 : ss <<")||(gid0 >="<<tmpCurDVR0->GetArrayLength()<<"))\n";
3592 0 : ss <<" nSettle = 0;\n else\n";
3593 : }
3594 : #endif
3595 0 : ss <<" nSettle=(int)";
3596 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3597 0 : ss <<";\n";
3598 : #ifdef ISNAN
3599 0 : if(tmpCur1->GetType() == formula::svSingleVectorRef)
3600 : {
3601 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
3602 0 : formula::SingleVectorRefToken *>(tmpCur1);
3603 0 : ss <<" if(isNan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
3604 0 : ss <<")||(gid0 >="<<tmpCurDVR1->GetArrayLength()<<"))\n";
3605 0 : ss <<" nMat = 0;\n else\n";
3606 : }
3607 : #endif
3608 0 : ss <<" nMat=(int)";
3609 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
3610 0 : ss <<";\n";
3611 : #ifdef ISNAN
3612 0 : if(tmpCur2->GetType() == formula::svSingleVectorRef)
3613 : {
3614 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
3615 0 : formula::SingleVectorRefToken *>(tmpCur2);
3616 0 : ss <<" if(isNan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
3617 0 : ss <<")||(gid0 >="<<tmpCurDVR2->GetArrayLength()<<"))\n";
3618 0 : ss <<" nFreq = 0;\n else\n";
3619 : }
3620 : #endif
3621 0 : ss << " nFreq=(int)";
3622 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
3623 0 : ss <<";\n";
3624 : #ifdef ISNAN
3625 0 : if(tmpCur3->GetType() == formula::svSingleVectorRef)
3626 : {
3627 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
3628 0 : formula::SingleVectorRefToken *>(tmpCur3);
3629 0 : ss <<" if(isNan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
3630 0 : ss <<")||(gid0 >="<<tmpCurDVR3->GetArrayLength()<<"))\n";
3631 0 : ss <<" nBase = 0;\n else\n";
3632 : }
3633 : #endif
3634 0 : ss << " nBase=(int)";
3635 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
3636 0 : ss << ";\n";
3637 0 : ss <<" tmp = coupdays_new(nSettle,nMat,nFreq,nBase);\n";
3638 0 : ss <<" return tmp;\n";
3639 0 : ss << "}";
3640 0 : }
3641 0 : void OpCouppcd::BinInlineFun(std::set<std::string>& decls,
3642 : std::set<std::string>& funs)
3643 : {
3644 0 : decls.insert(IsLeapYearDecl); decls.insert(DaysInMonthDecl);
3645 0 : decls.insert(DaysToDateDecl); decls.insert(DateToDaysDecl);
3646 0 : decls.insert(GetNullDateDecl);
3647 0 : decls.insert(ScaDateDecl);
3648 0 : decls.insert(addMonthsDecl);
3649 0 : decls.insert(setDayDecl);decls.insert(checklessthanDecl);
3650 0 : decls.insert(lcl_GetCouppcdDecl);
3651 0 : funs.insert(IsLeapYear);funs.insert(DaysInMonth);
3652 0 : funs.insert(DaysToDate);funs.insert(DateToDays);
3653 0 : funs.insert(GetNullDate);
3654 0 : funs.insert(ScaDate);
3655 0 : funs.insert(addMonths);
3656 0 : funs.insert(setDay);funs.insert(checklessthan);
3657 0 : funs.insert(lcl_GetCouppcd);
3658 0 : }
3659 0 : void OpCouppcd::GenSlidingWindowFunction(
3660 : std::stringstream &ss, const std::string &sSymName,
3661 : SubArguments &vSubArguments)
3662 : {
3663 0 : ss << "\ndouble " << sSymName;
3664 0 : ss << "_"<< BinFuncName() <<"(";
3665 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
3666 : {
3667 0 : if (i)
3668 0 : ss << ",";
3669 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
3670 : }
3671 0 : ss << ") {\n";
3672 0 : ss << " double tmp = 0;\n";
3673 0 : ss << " int gid0 = get_global_id(0);\n";
3674 0 : ss << " int nSettle,nMat,nFreq,nBase;\n";
3675 : #ifdef ISNAN
3676 0 : FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
3677 0 : FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
3678 0 : FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
3679 0 : FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
3680 : #endif
3681 : #ifdef ISNAN
3682 0 : if(tmpCur0->GetType() == formula::svSingleVectorRef)
3683 : {
3684 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
3685 0 : formula::SingleVectorRefToken *>(tmpCur0);
3686 0 : ss <<" if(isNan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
3687 0 : ss <<")||(gid0 >="<<tmpCurDVR0->GetArrayLength()<<"))\n";
3688 0 : ss <<" nSettle = 0;\n else\n";
3689 : }
3690 : #endif
3691 0 : ss <<" nSettle=(int)";
3692 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3693 0 : ss <<";\n";
3694 : #ifdef ISNAN
3695 0 : if(tmpCur1->GetType() == formula::svSingleVectorRef)
3696 : {
3697 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
3698 0 : formula::SingleVectorRefToken *>(tmpCur1);
3699 0 : ss <<" if(isNan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
3700 0 : ss <<")||(gid0 >="<<tmpCurDVR1->GetArrayLength()<<"))\n";
3701 0 : ss <<" nMat = 0;\n else\n";
3702 : }
3703 : #endif
3704 0 : ss <<" nMat=(int)";
3705 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
3706 0 : ss <<";\n";
3707 : #ifdef ISNAN
3708 0 : if(tmpCur2->GetType() == formula::svSingleVectorRef)
3709 : {
3710 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
3711 0 : formula::SingleVectorRefToken *>(tmpCur2);
3712 0 : ss <<" if(isNan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
3713 0 : ss <<")||(gid0 >="<<tmpCurDVR2->GetArrayLength()<<"))\n";
3714 0 : ss <<" nFreq = 0;\n else\n";
3715 : }
3716 : #endif
3717 0 : ss << " nFreq=(int)";
3718 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
3719 0 : ss <<";\n";
3720 : #ifdef ISNAN
3721 0 : if(tmpCur3->GetType() == formula::svSingleVectorRef)
3722 : {
3723 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
3724 0 : formula::SingleVectorRefToken *>(tmpCur3);
3725 0 : ss <<" if(isNan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
3726 0 : ss <<")||(gid0 >="<<tmpCurDVR3->GetArrayLength()<<"))\n";
3727 0 : ss <<" nBase = 0;\n else\n";
3728 : }
3729 : #endif
3730 0 : ss << " nBase=(int)";
3731 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
3732 0 : ss << ";\n";
3733 0 : ss <<" int nNullDate=693594;\n";
3734 0 : ss <<" tmp = lcl_GetCouppcd(nNullDate,nSettle,nMat,nFreq,nBase);\n";
3735 0 : ss <<" return tmp;\n";
3736 0 : ss <<"}";
3737 0 : }
3738 0 : void OpCoupncd::BinInlineFun(std::set<std::string>& decls,
3739 : std::set<std::string>& funs)
3740 : {
3741 0 : decls.insert(IsLeapYearDecl); decls.insert(DaysInMonthDecl);
3742 0 : decls.insert(DaysToDateDecl); decls.insert(DateToDaysDecl);
3743 0 : decls.insert(GetNullDateDecl);
3744 0 : decls.insert(ScaDateDecl);
3745 0 : decls.insert(addMonthsDecl);
3746 0 : decls.insert(setDayDecl);decls.insert(checklessthanDecl);
3747 0 : decls.insert(lcl_GetCoupncdDecl);
3748 0 : funs.insert(IsLeapYear);funs.insert(DaysInMonth);
3749 0 : funs.insert(DaysToDate);funs.insert(DateToDays);
3750 0 : funs.insert(GetNullDate);
3751 0 : funs.insert(ScaDate);
3752 0 : funs.insert(addMonths);
3753 0 : funs.insert(setDay);funs.insert(checklessthan);
3754 0 : funs.insert(lcl_GetCoupncd);
3755 0 : }
3756 0 : void OpCoupncd::GenSlidingWindowFunction(
3757 : std::stringstream &ss, const std::string &sSymName, SubArguments &
3758 : vSubArguments)
3759 : {
3760 0 : ss << "\ndouble " << sSymName;
3761 0 : ss << "_"<< BinFuncName() <<"(";
3762 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
3763 : {
3764 0 : if (i)
3765 0 : ss << ",";
3766 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
3767 : }
3768 0 : ss << ") {\n";
3769 0 : ss << " double tmp = 0;\n";
3770 0 : ss << " int gid0 = get_global_id(0);\n";
3771 0 : ss << " int nSettle,nMat,nFreq,nBase;\n";
3772 : #ifdef ISNAN
3773 0 : FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
3774 0 : FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
3775 0 : FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
3776 0 : FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
3777 : #endif
3778 : #ifdef ISNAN
3779 0 : if(tmpCur0->GetType() == formula::svSingleVectorRef)
3780 : {
3781 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
3782 0 : formula::SingleVectorRefToken *>(tmpCur0);
3783 0 : ss <<" if(isNan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
3784 0 : ss <<")||(gid0 >="<<tmpCurDVR0->GetArrayLength()<<"))\n";
3785 0 : ss <<" nSettle = 0;\n else\n";
3786 : }
3787 : #endif
3788 0 : ss <<" nSettle=(int)";
3789 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3790 0 : ss <<";\n";
3791 : #ifdef ISNAN
3792 0 : if(tmpCur1->GetType() == formula::svSingleVectorRef)
3793 : {
3794 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
3795 0 : formula::SingleVectorRefToken *>(tmpCur1);
3796 0 : ss <<" if(isNan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
3797 0 : ss <<")||(gid0 >="<<tmpCurDVR1->GetArrayLength()<<"))\n";
3798 0 : ss <<" nMat = 0;\n else\n";
3799 : }
3800 : #endif
3801 0 : ss <<" nMat=(int)";
3802 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
3803 0 : ss <<";\n";
3804 : #ifdef ISNAN
3805 0 : if(tmpCur2->GetType() == formula::svSingleVectorRef)
3806 : {
3807 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
3808 0 : formula::SingleVectorRefToken *>(tmpCur2);
3809 0 : ss <<" if(isNan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
3810 0 : ss <<")||(gid0 >="<<tmpCurDVR2->GetArrayLength()<<"))\n";
3811 0 : ss <<" nFreq = 0;\n else\n";
3812 : }
3813 : #endif
3814 0 : ss << " nFreq=(int)";
3815 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
3816 0 : ss <<";\n";
3817 : #ifdef ISNAN
3818 0 : if(tmpCur3->GetType() == formula::svSingleVectorRef)
3819 : {
3820 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
3821 0 : formula::SingleVectorRefToken *>(tmpCur3);
3822 0 : ss <<" if(isNan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
3823 0 : ss <<")||(gid0 >="<<tmpCurDVR3->GetArrayLength()<<"))\n";
3824 0 : ss <<" nBase = 0;\n else\n";
3825 : }
3826 : #endif
3827 0 : ss << " nBase=(int)";
3828 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
3829 0 : ss << ";\n";
3830 0 : ss <<" int nNullDate=693594;\n";
3831 0 : ss <<" tmp = lcl_GetCoupncd(nNullDate,nSettle,nMat,nFreq,nBase);\n";
3832 0 : ss <<" return tmp;\n";
3833 0 : ss <<"}";
3834 0 : }
3835 :
3836 0 : void OpCoupdaysnc::BinInlineFun(std::set<std::string>& decls,
3837 : std::set<std::string>& funs)
3838 : {
3839 0 : decls.insert(IsLeapYearDecl); decls.insert(DaysInMonth_newDecl);
3840 0 : decls.insert(DaysToDateDecl); decls.insert(DateToDaysDecl);
3841 0 : decls.insert(DateToDays_newDecl);
3842 0 : decls.insert(ScaDateDecl);
3843 0 : decls.insert(addMonthsDecl); decls.insert(getDaysInMonthRangeDecl);
3844 0 : decls.insert(GetDaysInYearsDecl); decls.insert(GetDaysInYearDecl);
3845 0 : decls.insert(getDaysInYearRangeDecl); decls.insert(getDiffDecl);
3846 0 : decls.insert(setDayDecl);decls.insert(checklessthanDecl);
3847 0 : decls.insert(coupdaybs_newDecl);
3848 0 : decls.insert(lcl_Getcoupdays_newDecl);
3849 0 : decls.insert(lcl_Getcoupdaybs_newDecl);
3850 0 : decls.insert(coupdays_newDecl);
3851 0 : decls.insert(coupdaysnc_newDecl);
3852 0 : funs.insert(IsLeapYear);funs.insert(DaysInMonth_new);
3853 0 : funs.insert(DaysToDate);funs.insert(DateToDays_new);
3854 0 : funs.insert(DateToDays);
3855 0 : funs.insert(ScaDate);
3856 0 : funs.insert(addMonths);funs.insert(getDaysInMonthRange);
3857 0 : funs.insert(GetDaysInYears);funs.insert(GetDaysInYear);
3858 0 : funs.insert(getDaysInYearRange);funs.insert(getDiff);
3859 0 : funs.insert(setDay);funs.insert(checklessthan);
3860 0 : funs.insert(lcl_Getcoupdaybs_new);
3861 0 : funs.insert(coupdaybs_new);
3862 0 : funs.insert(lcl_Getcoupdays_new);
3863 0 : funs.insert(coupdaysnc_new);
3864 0 : funs.insert(coupdays_new);
3865 0 : }
3866 0 : void OpCoupdaysnc::GenSlidingWindowFunction(
3867 : std::stringstream &ss, const std::string &sSymName,
3868 : SubArguments &vSubArguments)
3869 : {
3870 0 : ss << "\ndouble " << sSymName;
3871 0 : ss << "_"<< BinFuncName() <<"(";
3872 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
3873 : {
3874 0 : if (i)
3875 0 : ss << ",";
3876 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
3877 : }
3878 0 : ss << ") {\n";
3879 0 : ss << " double tmp = 0;\n";
3880 0 : ss << " int gid0 = get_global_id(0);\n";
3881 0 : ss << " int nSettle,nMat,nFreq,nBase;\n";
3882 : #ifdef ISNAN
3883 0 : FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
3884 0 : FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
3885 0 : FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
3886 0 : FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
3887 : #endif
3888 : #ifdef ISNAN
3889 0 : if(tmpCur0->GetType() == formula::svSingleVectorRef)
3890 : {
3891 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
3892 0 : formula::SingleVectorRefToken *>(tmpCur0);
3893 0 : ss <<" if(isNan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
3894 0 : ss <<")||(gid0 >="<<tmpCurDVR0->GetArrayLength()<<"))\n";
3895 0 : ss <<" nSettle = 0;\n else\n";
3896 : }
3897 : #endif
3898 0 : ss <<" nSettle=(int)";
3899 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3900 0 : ss <<";\n";
3901 : #ifdef ISNAN
3902 0 : if(tmpCur1->GetType() == formula::svSingleVectorRef)
3903 : {
3904 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
3905 0 : formula::SingleVectorRefToken *>(tmpCur1);
3906 0 : ss <<" if(isNan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
3907 0 : ss <<")||(gid0 >="<<tmpCurDVR1->GetArrayLength()<<"))\n";
3908 0 : ss <<" nMat = 0;\n else\n";
3909 : }
3910 : #endif
3911 0 : ss <<" nMat=(int)";
3912 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
3913 0 : ss <<";\n";
3914 : #ifdef ISNAN
3915 0 : if(tmpCur2->GetType() == formula::svSingleVectorRef)
3916 : {
3917 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
3918 0 : formula::SingleVectorRefToken *>(tmpCur2);
3919 0 : ss <<" if(isNan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
3920 0 : ss <<")||(gid0 >="<<tmpCurDVR2->GetArrayLength()<<"))\n";
3921 0 : ss <<" nFreq = 0;\n else\n";
3922 : }
3923 : #endif
3924 0 : ss << " nFreq=(int)";
3925 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
3926 0 : ss <<";\n";
3927 : #ifdef ISNAN
3928 0 : if(tmpCur3->GetType() == formula::svSingleVectorRef)
3929 : {
3930 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
3931 0 : formula::SingleVectorRefToken *>(tmpCur3);
3932 0 : ss <<" if(isNan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
3933 0 : ss <<")||(gid0 >="<<tmpCurDVR3->GetArrayLength()<<"))\n";
3934 0 : ss <<" nBase = 0;\n else\n";
3935 : }
3936 : #endif
3937 0 : ss << " nBase=(int)";
3938 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
3939 0 : ss << ";\n";
3940 0 : ss <<" tmp = coupdaysnc_new(nSettle,nMat,nFreq,nBase);\n";
3941 0 : ss <<" return tmp;\n";
3942 0 : ss << "}";
3943 0 : }
3944 :
3945 0 : void OpCoupnum::BinInlineFun(std::set<std::string>& decls,
3946 : std::set<std::string>& funs)
3947 : {
3948 0 : decls.insert(IsLeapYearDecl);decls.insert(DaysInMonthDecl);
3949 0 : decls.insert(DaysToDateDecl);
3950 0 : decls.insert(DateToDaysDecl);
3951 0 : decls.insert(ScaDateDecl);
3952 0 : decls.insert(setDayDecl);decls.insert(checklessthanDecl);
3953 0 : decls.insert(addMonthsDecl);decls.insert(lcl_Getcoupnum_newDecl);
3954 0 : decls.insert(coupnum_newDecl);
3955 0 : funs.insert(IsLeapYear);funs.insert(DaysInMonth_new);
3956 0 : funs.insert(DaysToDate);
3957 0 : funs.insert(DateToDays);
3958 0 : funs.insert(ScaDate);
3959 0 : funs.insert(setDay);funs.insert(checklessthan);
3960 0 : funs.insert(addMonths);funs.insert(lcl_Getcoupnum_new);
3961 0 : funs.insert(coupnum_new);
3962 0 : }
3963 0 : void OpCoupnum::GenSlidingWindowFunction(std::stringstream &ss,
3964 : const std::string &sSymName, SubArguments &vSubArguments)
3965 : {
3966 0 : ss << "\ndouble " << sSymName;
3967 0 : ss << "_"<< BinFuncName() <<"(";
3968 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
3969 : {
3970 0 : if (i)
3971 0 : ss << ",";
3972 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
3973 : }
3974 0 : ss << ") {\n";
3975 0 : ss << " double tmp = 0;\n";
3976 0 : ss << " int gid0 = get_global_id(0);\n";
3977 0 : ss << " int nSettle,nMat,nFreq,nBase;\n";
3978 : #ifdef ISNAN
3979 0 : FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
3980 0 : FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
3981 0 : FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
3982 0 : FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
3983 : #endif
3984 : #ifdef ISNAN
3985 0 : if(tmpCur0->GetType() == formula::svSingleVectorRef)
3986 : {
3987 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
3988 0 : formula::SingleVectorRefToken *>(tmpCur0);
3989 0 : ss <<" if(isNan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
3990 0 : ss <<")||(gid0 >="<<tmpCurDVR0->GetArrayLength()<<"))\n";
3991 0 : ss <<" nSettle = 0;\n else\n";
3992 : }
3993 : #endif
3994 0 : ss <<" nSettle=(int)";
3995 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
3996 0 : ss <<";\n";
3997 : #ifdef ISNAN
3998 0 : if(tmpCur1->GetType() == formula::svSingleVectorRef)
3999 : {
4000 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
4001 0 : formula::SingleVectorRefToken *>(tmpCur1);
4002 0 : ss <<" if(isNan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
4003 0 : ss <<")||(gid0 >="<<tmpCurDVR1->GetArrayLength()<<"))\n";
4004 0 : ss <<" nMat = 0;\n else\n";
4005 : }
4006 : #endif
4007 0 : ss <<" nMat=(int)";
4008 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
4009 0 : ss <<";\n";
4010 : #ifdef ISNAN
4011 0 : if(tmpCur2->GetType() == formula::svSingleVectorRef)
4012 : {
4013 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
4014 0 : formula::SingleVectorRefToken *>(tmpCur2);
4015 0 : ss <<" if(isNan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
4016 0 : ss <<")||(gid0 >="<<tmpCurDVR2->GetArrayLength()<<"))\n";
4017 0 : ss <<" nFreq = 0;\n else\n";
4018 : }
4019 : #endif
4020 0 : ss << " nFreq=(int)";
4021 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
4022 0 : ss <<";\n";
4023 : #ifdef ISNAN
4024 0 : if(tmpCur3->GetType() == formula::svSingleVectorRef)
4025 : {
4026 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
4027 0 : formula::SingleVectorRefToken *>(tmpCur3);
4028 0 : ss <<" if(isNan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
4029 0 : ss <<")||(gid0 >="<<tmpCurDVR3->GetArrayLength()<<"))\n";
4030 0 : ss <<" nBase = 0;\n else\n";
4031 : }
4032 : #endif
4033 0 : ss << " nBase=(int)";
4034 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
4035 0 : ss << ";\n";
4036 0 : ss <<" tmp = coupnum_new(nSettle,nMat,nFreq,nBase);\n";
4037 0 : ss <<" return tmp;\n";
4038 0 : ss << "}";
4039 0 : }
4040 0 : void OpAmordegrc::BinInlineFun(std::set<std::string>& decls,
4041 : std::set<std::string>& funs)
4042 : {
4043 0 : decls.insert(nKorrValDecl); decls.insert(RoundDecl);
4044 0 : decls.insert(IsLeapYearDecl);decls.insert(DaysInMonthDecl);
4045 0 : decls.insert(DaysToDateDecl); decls.insert(DateToDaysDecl);
4046 0 : decls.insert(GetNullDateDecl); decls.insert(GetYearFracDecl);
4047 0 : funs.insert(Round);
4048 0 : funs.insert(IsLeapYear);funs.insert(DaysInMonth);
4049 0 : funs.insert(DaysToDate);funs.insert(DateToDays);
4050 0 : funs.insert(GetNullDate);funs.insert(GetYearFrac);
4051 0 : }
4052 0 : void OpAmordegrc::GenSlidingWindowFunction(std::stringstream &ss,
4053 : const std::string &sSymName, SubArguments &vSubArguments)
4054 : {
4055 0 : ss << "\ndouble " << sSymName;
4056 0 : ss << "_"<< BinFuncName() <<"(";
4057 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
4058 : {
4059 0 : if (i)
4060 0 : ss << ",";
4061 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
4062 : }
4063 0 : ss << ") {\n ";
4064 0 : ss << "int gid0 = get_global_id(0);\n";
4065 0 : ss << " double tmp = " << GetBottom() <<";\n";
4066 0 : ss << " double fCost,fRestVal,fPer,fRate;\n";
4067 0 : ss << " int nDate,nFirstPer,nBase;\n";
4068 : #ifdef ISNAN
4069 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
4070 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
4071 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
4072 0 : FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
4073 0 : FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
4074 0 : FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
4075 0 : FormulaToken *tmpCur6 = vSubArguments[6]->GetFormulaToken();
4076 : #endif
4077 : #ifdef ISNAN
4078 0 : if(tmpCur0->GetType() == formula::svSingleVectorRef)
4079 : {
4080 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
4081 0 : formula::SingleVectorRefToken *>(tmpCur0);
4082 0 : ss <<" if(isNan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
4083 0 : ss <<")||(gid0 >="<<tmpCurDVR0->GetArrayLength()<<"))\n";
4084 0 : ss <<" fCost = 0;\n else\n";
4085 : }
4086 : #endif
4087 0 : ss << " fCost=";
4088 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
4089 0 : ss <<";\n";
4090 : #ifdef ISNAN
4091 0 : if(tmpCur1->GetType() == formula::svSingleVectorRef)
4092 : {
4093 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
4094 0 : formula::SingleVectorRefToken *>(tmpCur1);
4095 0 : ss <<" if(isNan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
4096 0 : ss <<")||(gid0 >="<<tmpCurDVR1->GetArrayLength()<<"))\n";
4097 0 : ss <<" nDate = 0;\n else\n";
4098 : }
4099 : #endif
4100 0 : ss << " nDate=(int)";
4101 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
4102 0 : ss << ";\n";
4103 : #ifdef ISNAN
4104 0 : if(tmpCur2->GetType() == formula::svSingleVectorRef)
4105 : {
4106 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
4107 0 : formula::SingleVectorRefToken *>(tmpCur2);
4108 0 : ss <<" if(isNan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
4109 0 : ss <<")||(gid0 >="<<tmpCurDVR2->GetArrayLength()<<"))\n";
4110 0 : ss <<" nFirstPer = 0;\n else\n";
4111 : }
4112 : #endif
4113 0 : ss << " nFirstPer=(int)";
4114 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
4115 0 : ss <<";\n";
4116 : #ifdef ISNAN
4117 0 : if(tmpCur3->GetType() == formula::svSingleVectorRef)
4118 : {
4119 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
4120 0 : formula::SingleVectorRefToken *>(tmpCur3);
4121 0 : ss <<" if(isNan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
4122 0 : ss <<")||(gid0 >="<<tmpCurDVR3->GetArrayLength()<<"))\n";
4123 0 : ss <<" fRestVal = 0;\n else\n";
4124 : }
4125 : #endif
4126 0 : ss << " fRestVal=";
4127 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
4128 0 : ss << ";\n";
4129 : #ifdef ISNAN
4130 0 : if(tmpCur4->GetType() == formula::svSingleVectorRef)
4131 : {
4132 : const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
4133 0 : formula::SingleVectorRefToken *>(tmpCur4);
4134 0 : ss <<" if(isNan(" <<vSubArguments[4]->GenSlidingWindowDeclRef();
4135 0 : ss <<")||(gid0 >="<<tmpCurDVR4->GetArrayLength()<<"))\n";
4136 0 : ss <<" fPer = 0;\n else\n";
4137 : }
4138 : #endif
4139 0 : ss << " fPer = ";
4140 0 : ss << vSubArguments[4]->GenSlidingWindowDeclRef();
4141 0 : ss <<";\n";
4142 : #ifdef ISNAN
4143 0 : if(tmpCur5->GetType() == formula::svSingleVectorRef)
4144 : {
4145 : const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const
4146 0 : formula::SingleVectorRefToken *>(tmpCur5);
4147 0 : ss <<" if(isNan(" <<vSubArguments[5]->GenSlidingWindowDeclRef();
4148 0 : ss <<")||(gid0 >="<<tmpCurDVR5->GetArrayLength()<<"))\n";
4149 0 : ss <<" fRate = 0;\n else\n";
4150 : }
4151 : #endif
4152 0 : ss << " fRate=";
4153 0 : ss << vSubArguments[5]->GenSlidingWindowDeclRef();
4154 0 : ss << ";\n";
4155 : #ifdef ISNAN
4156 0 : if(tmpCur6->GetType() == formula::svSingleVectorRef)
4157 : {
4158 : const formula::SingleVectorRefToken*tmpCurDVR6= static_cast<const
4159 0 : formula::SingleVectorRefToken *>(tmpCur6);
4160 0 : ss <<" if(isNan(" <<vSubArguments[6]->GenSlidingWindowDeclRef();
4161 0 : ss <<")||(gid0 >="<<tmpCurDVR6->GetArrayLength()<<"))\n";
4162 0 : ss <<" nBase = 0;\n else\n";
4163 : }
4164 : #endif
4165 0 : ss << " nBase = (int)";
4166 0 : ss << vSubArguments[6]->GenSlidingWindowDeclRef();
4167 0 : ss << ";\n";
4168 0 : ss <<" uint nPer = convert_int( fPer );\n";
4169 0 : ss <<" double fUsePer = 1.0 *pow( fRate,-1);\n";
4170 0 : ss <<" double fAmorCoeff;\n";
4171 0 : ss <<" if( fUsePer < 3.0 )\n";
4172 0 : ss <<" fAmorCoeff = 1.0;\n";
4173 0 : ss <<" else if( fUsePer < 5.0 )\n";
4174 0 : ss <<" fAmorCoeff = 1.5;\n";
4175 0 : ss <<" else if( fUsePer <= 6.0 )\n";
4176 0 : ss <<" fAmorCoeff = 2.0;\n";
4177 0 : ss <<" else\n";
4178 0 : ss <<" fAmorCoeff = 2.5;\n";
4179 0 : ss <<" fRate *= fAmorCoeff;\n";
4180 0 : ss <<" tmp = Round( GetYearFrac( 693594,";
4181 0 : ss <<"nDate, nFirstPer, nBase ) * fRate * fCost);\n";
4182 0 : ss <<" fCost = fCost-tmp;\n";
4183 0 : ss <<" double fRest = fCost - fRestVal;\n";
4184 0 : ss <<" for( uint n = 0 ; n < nPer ; n++ )\n";
4185 0 : ss <<" {\n";
4186 0 : ss <<" tmp = Round( fRate * fCost);\n";
4187 0 : ss <<" fRest -= tmp;\n";
4188 0 : ss <<" if( fRest < 0.0 )\n";
4189 0 : ss <<" {\n";
4190 0 : ss <<" switch( nPer - n )\n";
4191 0 : ss <<" {\n";
4192 0 : ss <<" case 0:\n";
4193 0 : ss <<" case 1:\n";
4194 0 : ss <<" tmp = Round( fCost * 0.5);\n";
4195 0 : ss <<" default:\n";
4196 0 : ss <<" tmp = 0.0;\n";
4197 0 : ss <<" }\n";
4198 0 : ss <<" }\n";
4199 0 : ss <<" fCost -= tmp;\n";
4200 0 : ss <<" }\n";
4201 0 : ss <<" return tmp;\n";
4202 0 : ss <<"}";
4203 0 : }
4204 0 : void OpAmorlinc::BinInlineFun(std::set<std::string>& decls,
4205 : std::set<std::string>& funs)
4206 : {
4207 0 : decls.insert(nKorrValDecl); decls.insert(RoundDecl);
4208 0 : decls.insert(IsLeapYearDecl);decls.insert(DaysInMonthDecl);
4209 0 : decls.insert(DaysToDateDecl); decls.insert(DateToDaysDecl);
4210 0 : decls.insert(GetYearFracDecl);
4211 0 : funs.insert(Round);
4212 0 : funs.insert(IsLeapYear);funs.insert(DaysInMonth);
4213 0 : funs.insert(DaysToDate);funs.insert(DateToDays);
4214 0 : funs.insert(GetYearFrac);
4215 0 : }
4216 0 : void OpAmorlinc::GenSlidingWindowFunction(std::stringstream &ss,
4217 : const std::string &sSymName, SubArguments &vSubArguments)
4218 : {
4219 0 : ss << "\ndouble " << sSymName;
4220 0 : ss << "_"<< BinFuncName() <<"(";
4221 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
4222 : {
4223 0 : if (i)
4224 0 : ss << ",";
4225 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
4226 : }
4227 0 : ss << ") {\n";
4228 0 : ss << " int gid0 = get_global_id(0);\n";
4229 0 : ss << " double tmp = 0;\n";
4230 0 : ss << " double fCost,fRestVal,fPer,fRate;\n";
4231 0 : ss << " int nDate,nFirstPer,nBase;\n";
4232 : #ifdef ISNAN
4233 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
4234 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
4235 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
4236 0 : FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
4237 0 : FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
4238 0 : FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
4239 0 : FormulaToken *tmpCur6 = vSubArguments[6]->GetFormulaToken();
4240 : #endif
4241 : #ifdef ISNAN
4242 0 : if(tmpCur0->GetType() == formula::svSingleVectorRef)
4243 : {
4244 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
4245 0 : formula::SingleVectorRefToken *>(tmpCur0);
4246 0 : ss <<" if(isNan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
4247 0 : ss <<")||(gid0 >="<<tmpCurDVR0->GetArrayLength()<<"))\n";
4248 0 : ss <<" fCost = 0;\n else\n";
4249 : }
4250 : #endif
4251 0 : ss << " fCost=";
4252 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
4253 0 : ss <<";\n";
4254 : #ifdef ISNAN
4255 0 : if(tmpCur1->GetType() == formula::svSingleVectorRef)
4256 : {
4257 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
4258 0 : formula::SingleVectorRefToken *>(tmpCur1);
4259 0 : ss <<" if(isNan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
4260 0 : ss <<")||(gid0 >="<<tmpCurDVR1->GetArrayLength()<<"))\n";
4261 0 : ss <<" nDate = 0;\n else\n";
4262 : }
4263 : #endif
4264 0 : ss << " nDate=(int)";
4265 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
4266 0 : ss << ";\n";
4267 : #ifdef ISNAN
4268 0 : if(tmpCur2->GetType() == formula::svSingleVectorRef)
4269 : {
4270 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
4271 0 : formula::SingleVectorRefToken *>(tmpCur2);
4272 0 : ss <<" if(isNan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
4273 0 : ss <<")||(gid0 >="<<tmpCurDVR2->GetArrayLength()<<"))\n";
4274 0 : ss <<" nFirstPer = 0;\n else\n";
4275 : }
4276 : #endif
4277 0 : ss << " nFirstPer=(int)";
4278 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
4279 0 : ss <<";\n";
4280 : #ifdef ISNAN
4281 0 : if(tmpCur3->GetType() == formula::svSingleVectorRef)
4282 : {
4283 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
4284 0 : formula::SingleVectorRefToken *>(tmpCur3);
4285 0 : ss <<" if(isNan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
4286 0 : ss <<")||(gid0 >="<<tmpCurDVR3->GetArrayLength()<<"))\n";
4287 0 : ss <<" fRestVal = 0;\n else\n";
4288 : }
4289 : #endif
4290 0 : ss << " fRestVal=";
4291 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
4292 0 : ss << ";\n";
4293 : #ifdef ISNAN
4294 0 : if(tmpCur4->GetType() == formula::svSingleVectorRef)
4295 : {
4296 : const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
4297 0 : formula::SingleVectorRefToken *>(tmpCur4);
4298 0 : ss <<" if(isNan(" <<vSubArguments[4]->GenSlidingWindowDeclRef();
4299 0 : ss <<")||(gid0 >="<<tmpCurDVR4->GetArrayLength()<<"))\n";
4300 0 : ss <<" fPer = 0;\n else\n";
4301 : }
4302 : #endif
4303 0 : ss << " fPer = ";
4304 0 : ss << vSubArguments[4]->GenSlidingWindowDeclRef();
4305 0 : ss <<";\n";
4306 : #ifdef ISNAN
4307 0 : if(tmpCur5->GetType() == formula::svSingleVectorRef)
4308 : {
4309 : const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const
4310 0 : formula::SingleVectorRefToken *>(tmpCur5);
4311 0 : ss <<" if(isNan(" <<vSubArguments[5]->GenSlidingWindowDeclRef();
4312 0 : ss <<")||(gid0 >="<<tmpCurDVR5->GetArrayLength()<<"))\n";
4313 0 : ss <<" fRate = 0;\n else\n";
4314 : }
4315 : #endif
4316 0 : ss << " fRate=";
4317 0 : ss << vSubArguments[5]->GenSlidingWindowDeclRef();
4318 0 : ss << ";\n";
4319 : #ifdef ISNAN
4320 0 : if(tmpCur6->GetType() == formula::svSingleVectorRef)
4321 : {
4322 : const formula::SingleVectorRefToken*tmpCurDVR6= static_cast<const
4323 0 : formula::SingleVectorRefToken *>(tmpCur6);
4324 0 : ss <<" if(isNan(" <<vSubArguments[6]->GenSlidingWindowDeclRef();
4325 0 : ss <<")||(gid0 >="<<tmpCurDVR6->GetArrayLength()<<"))\n";
4326 0 : ss <<" nBase = 0;\n else\n";
4327 : }
4328 : #endif
4329 0 : ss << " nBase = (int)";
4330 0 : ss << vSubArguments[6]->GenSlidingWindowDeclRef();
4331 0 : ss << ";\n";
4332 0 : ss <<" int nPer = convert_int( fPer );\n";
4333 0 : ss <<" double fOneRate = fCost * fRate;\n";
4334 0 : ss <<" double fCostDelta = fCost - fRestVal;\n";
4335 0 : ss <<" double f0Rate = GetYearFrac( 693594,";
4336 0 : ss <<"nDate, nFirstPer, nBase )* fRate * fCost;\n";
4337 0 : ss <<" int nNumOfFullPeriods = (int)";
4338 0 : ss <<"( ( fCost - fRestVal - f0Rate) *pow(fOneRate,-1) );\n";
4339 0 : ss <<" if( nPer == 0 )\n";
4340 0 : ss <<" tmp = f0Rate;\n";
4341 0 : ss <<" else if( nPer <= nNumOfFullPeriods )\n";
4342 0 : ss <<" tmp = fOneRate;\n";
4343 0 : ss <<" else if( nPer == nNumOfFullPeriods + 1 )\n";
4344 0 : ss <<" tmp = fCostDelta - fOneRate * nNumOfFullPeriods - f0Rate;\n";
4345 0 : ss <<" else\n";
4346 0 : ss <<" tmp = 0.0;\n";
4347 0 : ss <<" return tmp;\n";
4348 0 : ss <<"}";
4349 0 : }
4350 0 : void OpReceived::BinInlineFun(std::set<std::string>& decls,
4351 : std::set<std::string>& funs)
4352 : {
4353 0 : decls.insert(GetYearDiffDecl);decls.insert(GetDiffDateDecl);
4354 0 : decls.insert(DaysToDateDecl);decls.insert(DaysInMonthDecl);
4355 0 : decls.insert(GetNullDateDecl);decls.insert(IsLeapYearDecl);
4356 0 : decls.insert(DateToDaysDecl);
4357 0 : funs.insert(GetDiffDate);funs.insert(DaysToDate);
4358 0 : funs.insert(DaysInMonth);funs.insert(GetNullDate);
4359 0 : funs.insert(DateToDays);funs.insert(IsLeapYear);
4360 0 : funs.insert(GetYearDiff);
4361 0 : }
4362 :
4363 0 : void OpReceived::GenSlidingWindowFunction(std::stringstream &ss,
4364 : const std::string &sSymName, SubArguments &vSubArguments)
4365 : {
4366 0 : ss << "\ndouble " << sSymName;
4367 0 : ss << "_"<< BinFuncName() <<"(";
4368 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
4369 : {
4370 0 : if (i)
4371 0 : ss << ",";
4372 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
4373 : }
4374 0 : ss << ") {\n";
4375 0 : ss << " double tmp = " << GetBottom() <<";\n";
4376 0 : ss << " int gid0 = get_global_id(0);\n";
4377 0 : ss << " int nSettle, nMat;\n";
4378 0 : ss << " double fInvest,fDisc;\n";
4379 0 : ss << " int rOB;\n";
4380 : #ifdef ISNAN
4381 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
4382 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
4383 0 : formula::SingleVectorRefToken *>(tmpCur0);
4384 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
4385 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
4386 0 : formula::SingleVectorRefToken *>(tmpCur1);
4387 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
4388 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
4389 0 : formula::SingleVectorRefToken *>(tmpCur2);
4390 0 : FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
4391 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
4392 0 : formula::SingleVectorRefToken *>(tmpCur3);
4393 0 : FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
4394 : const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
4395 0 : formula::SingleVectorRefToken *>(tmpCur4);
4396 0 : ss<< " int buffer_settle_len = ";
4397 0 : ss<< tmpCurDVR0->GetArrayLength();
4398 0 : ss << ";\n";
4399 0 : ss<< " int buffer_mat_len = ";
4400 0 : ss<< tmpCurDVR1->GetArrayLength();
4401 0 : ss << ";\n";
4402 0 : ss<< " int buffer_invest_len = ";
4403 0 : ss<< tmpCurDVR2->GetArrayLength();
4404 0 : ss << ";\n";
4405 0 : ss<< " int buffer_disc_len = ";
4406 0 : ss<< tmpCurDVR3->GetArrayLength();
4407 0 : ss << ";\n";
4408 0 : ss<< " int buffer_rob_len = ";
4409 0 : ss<< tmpCurDVR4->GetArrayLength();
4410 0 : ss << ";\n";
4411 : #endif
4412 : #ifdef ISNAN
4413 0 : ss <<" if(gid0 >= buffer_settle_len || isNan(";
4414 0 : ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
4415 0 : ss <<"))\n";
4416 0 : ss <<" nSettle = 0;\n\telse\n";
4417 : #endif
4418 0 : ss <<" nSettle = (int)"<<vSubArguments[0]->GenSlidingWindowDeclRef();
4419 0 : ss <<";\n";
4420 : #ifdef ISNAN
4421 0 : ss <<" if(gid0 >= buffer_mat_len || isNan(";
4422 0 : ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
4423 0 : ss <<"))\n";
4424 0 : ss <<" nMat = 0;\n\telse\n";
4425 : #endif
4426 0 : ss <<" nMat = (int)";
4427 0 : ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
4428 0 : ss <<";\n";
4429 : #ifdef ISNAN
4430 0 : ss <<" if(gid0 >= buffer_invest_len || isNan(";
4431 0 : ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
4432 0 : ss <<"))\n";
4433 0 : ss <<" fInvest = 0;\n\telse\n";
4434 : #endif
4435 0 : ss <<" fInvest = "<<vSubArguments[2]->GenSlidingWindowDeclRef();
4436 0 : ss <<";\n";
4437 : #ifdef ISNAN
4438 0 : ss <<" if(gid0 >= buffer_disc_len || isNan(";
4439 0 : ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
4440 0 : ss <<"))\n";
4441 0 : ss <<" fDisc = 0;\n\telse\n";
4442 : #endif
4443 0 : ss <<" fDisc = "<<vSubArguments[3]->GenSlidingWindowDeclRef();
4444 0 : ss <<";\n";
4445 : #ifdef ISNAN
4446 0 : ss <<" if(gid0 >= buffer_rob_len || isNan(";
4447 0 : ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
4448 0 : ss <<"))\n";
4449 0 : ss <<" rOB = 0;\n\telse\n";
4450 : #endif
4451 0 : ss <<" rOB = (int)"<<vSubArguments[4]->GenSlidingWindowDeclRef();
4452 0 : ss <<";\n";
4453 0 : ss << " double tmpvalue = (1.0-(fDisc";
4454 0 : ss <<" * GetYearDiff( GetNullDate()";
4455 0 : ss <<",nSettle,nMat,rOB)));\n";
4456 0 : ss << " tmp = fInvest*pow(tmpvalue,-1);\n";
4457 0 : ss << " return tmp;\n";
4458 0 : ss << "}";
4459 0 : }
4460 :
4461 0 : void OpYielddisc::BinInlineFun(std::set<std::string>& decls,
4462 : std::set<std::string>& funs)
4463 : {
4464 0 : decls.insert(GetYearFracDecl);decls.insert(GetNullDateDecl);
4465 0 : decls.insert(DateToDaysDecl);decls.insert(DaysToDateDecl);
4466 0 : decls.insert(DaysInMonthDecl);decls.insert(IsLeapYearDecl);
4467 :
4468 0 : funs.insert(GetYearFrac);funs.insert(GetNullDate);
4469 0 : funs.insert(DateToDays);funs.insert(DaysToDate);
4470 0 : funs.insert(DaysInMonth);funs.insert(IsLeapYear);
4471 0 : }
4472 0 : void OpYielddisc::GenSlidingWindowFunction(
4473 : std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
4474 : {
4475 0 : ss << "\ndouble " << sSymName;
4476 0 : ss << "_"<< BinFuncName() <<"(";
4477 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
4478 : {
4479 0 : if (i)
4480 0 : ss << ",";
4481 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
4482 : }
4483 0 : ss << ") {\n\t";
4484 0 : ss << "double tmp = " <<"0"<<";\n\t";
4485 0 : ss << "int gid0 = get_global_id(0);\n\t";
4486 0 : ss << "double tmp000;\n\t";
4487 0 : ss << "double tmp001;\n\t";
4488 0 : ss << "double tmp002;\n\t";
4489 0 : ss << "double tmp003;\n\t";
4490 0 : ss << "double tmp004;\n\t";
4491 :
4492 :
4493 : #ifdef ISNAN
4494 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
4495 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
4496 0 : formula::SingleVectorRefToken *>(tmpCur0);
4497 :
4498 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
4499 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
4500 0 : formula::SingleVectorRefToken *>(tmpCur1);
4501 :
4502 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
4503 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
4504 0 : formula::SingleVectorRefToken *>(tmpCur2);
4505 :
4506 0 : FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
4507 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
4508 0 : formula::SingleVectorRefToken *>(tmpCur3);
4509 :
4510 0 : FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
4511 : const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
4512 0 : formula::SingleVectorRefToken *>(tmpCur4);
4513 :
4514 0 : ss<< "int buffer_tmp000_len = ";
4515 0 : ss<< tmpCurDVR0->GetArrayLength();
4516 0 : ss << ";\n\t";
4517 :
4518 0 : ss<< "int buffer_tmp001_len = ";
4519 0 : ss<< tmpCurDVR1->GetArrayLength();
4520 0 : ss << ";\n\t";
4521 :
4522 0 : ss<< "int buffer_tmp002_len = ";
4523 0 : ss<< tmpCurDVR2->GetArrayLength();
4524 0 : ss << ";\n\t";
4525 :
4526 0 : ss<< "int buffer_tmp003_len = ";
4527 0 : ss<< tmpCurDVR3->GetArrayLength();
4528 0 : ss << ";\n\t";
4529 :
4530 0 : ss<< "int buffer_tmp004_len = ";
4531 0 : ss<< tmpCurDVR4->GetArrayLength();
4532 0 : ss << ";\n\t";
4533 :
4534 : #endif
4535 :
4536 : #ifdef ISNAN
4537 0 : ss<<"if(gid0>=buffer_tmp000_len || isNan(";
4538 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
4539 0 : ss<<"))\n\t\t";
4540 0 : ss<<"tmp000 = 0;\n\telse \n\t\t";
4541 : #endif
4542 0 : ss<<"tmp000 = ";
4543 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
4544 0 : ss<<";\n\t";
4545 :
4546 : #ifdef ISNAN
4547 0 : ss<<"if(gid0>=buffer_tmp001_len || isNan(";
4548 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
4549 0 : ss<<"))\n\t\t";
4550 0 : ss<<"tmp001 = 0;\n\telse \n\t\t";
4551 : #endif
4552 0 : ss<<"tmp001 = ";
4553 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
4554 0 : ss<<";\n\t";
4555 :
4556 : #ifdef ISNAN
4557 0 : ss<<"if(gid0>=buffer_tmp002_len || isNan(";
4558 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
4559 0 : ss<<"))\n\t\t";
4560 0 : ss<<"tmp002 = 0;\n\telse \n\t\t";
4561 : #endif
4562 0 : ss<<"tmp002 = ";
4563 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
4564 0 : ss<<";\n\t";
4565 :
4566 : #ifdef ISNAN
4567 0 : ss<<"if(gid0>=buffer_tmp003_len || isNan(";
4568 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
4569 0 : ss<<"))\n\t\t";
4570 0 : ss<<"tmp003 = 0;\n\telse \n\t\t";
4571 : #endif
4572 0 : ss<<"tmp003 = ";
4573 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
4574 0 : ss<<";\n\t";
4575 :
4576 : #ifdef ISNAN
4577 0 : ss<<"if(gid0>=buffer_tmp004_len || isNan(";
4578 0 : ss << vSubArguments[4]->GenSlidingWindowDeclRef();
4579 0 : ss<<"))\n\t\t";
4580 0 : ss<<"tmp004 = 0;\n\telse \n\t\t";
4581 : #endif
4582 0 : ss<<"tmp004 = ";
4583 0 : ss << vSubArguments[4]->GenSlidingWindowDeclRef();
4584 0 : ss<<";\n\t";
4585 :
4586 0 : ss<< "tmp = (tmp003/tmp002)-1;\n\t";
4587 0 : ss << "tmp /= GetYearFrac( GetNullDate(),tmp000,tmp001,tmp004);\n\t";
4588 0 : ss << "return tmp;\n";
4589 0 : ss << "}";
4590 0 : }
4591 :
4592 0 : void OpTbillprice::BinInlineFun(std::set<std::string>& decls,
4593 : std::set<std::string>& funs)
4594 : {
4595 0 : decls.insert(GetYearFracDecl);
4596 0 : decls.insert(DateToDaysDecl);decls.insert(DaysToDateDecl);
4597 0 : decls.insert(DaysInMonthDecl);decls.insert(IsLeapYearDecl);
4598 :
4599 0 : funs.insert(GetYearFrac);
4600 0 : funs.insert(DateToDays);funs.insert(DaysToDate);
4601 0 : funs.insert(DaysInMonth);funs.insert(IsLeapYear);
4602 0 : }
4603 :
4604 0 : void OpTbillprice::GenSlidingWindowFunction(
4605 : std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
4606 : {
4607 0 : ss << "\ndouble " << sSymName;
4608 0 : ss << "_"<< BinFuncName() <<"(";
4609 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
4610 : {
4611 0 : if (i)
4612 0 : ss << ",";
4613 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
4614 : }
4615 0 : ss << ") {\n";
4616 0 : ss << " int gid0 = get_global_id(0);\n";
4617 0 : ss << " double tmp = 0;\n";
4618 :
4619 0 : ss << " int singleIndex = gid0;\n";
4620 0 : ss << " int doubleIndex = gid0;\n";
4621 0 : ss << " int i = gid0;\n";
4622 0 : GenTmpVariables(ss,vSubArguments);
4623 0 : CheckAllSubArgumentIsNan(ss,vSubArguments);
4624 :
4625 0 : ss << " tmp1+=1.0;\n";
4626 0 : ss << " double fFraction =GetYearFrac(693594,tmp0,tmp1,0);\n";
4627 0 : ss << " tmp = 100.0 * ( 1.0 - tmp2 * fFraction );\n";
4628 0 : ss << " return tmp;\n";
4629 0 : ss << "}\n";
4630 0 : }
4631 0 : void RATE::BinInlineFun(std::set<std::string>& decls,
4632 : std::set<std::string>& funs)
4633 : {
4634 0 : decls.insert(approxEqualDecl);decls.insert(nKorrValDecl);
4635 0 : decls.insert(SCdEpsilonDecl);decls.insert(RoundDecl);
4636 0 : funs.insert(approxEqual);funs.insert(Round);
4637 0 : }
4638 :
4639 0 : void RATE::GenSlidingWindowFunction(
4640 : std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
4641 : {
4642 0 : ss << "\ndouble " << sSymName;
4643 0 : ss << "_"<< BinFuncName() <<"(";
4644 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
4645 : {
4646 0 : if (i)
4647 0 : ss << ",";
4648 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
4649 : }
4650 :
4651 0 : FormulaToken* pCur = vSubArguments[5]->GetFormulaToken();
4652 : assert(pCur);
4653 : const formula::SingleVectorRefToken* pSVR =
4654 0 : static_cast< const formula::SingleVectorRefToken* >(pCur);
4655 : assert(pSVR);
4656 0 : ss << ") {\n";
4657 0 : ss << " double result;\n";
4658 0 : ss << " int gid0 = get_global_id(0);\n";
4659 0 : ss << " bool bValid = true, bFound = false;\n";
4660 0 : ss << " double fX, fXnew, fTerm, fTermDerivation;\n";
4661 0 : ss << " double fGeoSeries, fGeoSeriesDerivation;\n";
4662 0 : ss << " int nIterationsMax = 150;\n";
4663 0 : ss << " int nCount = 0;\n";
4664 0 : ss << " double fEpsilonSmall = 1.0E-14;\n";
4665 0 : ss << " double arg0, arg1, arg2, arg3, arg4, arg5;\n";
4666 0 : ss << " arg0=" << vSubArguments[0]->GenSlidingWindowDeclRef()<<";\n";
4667 0 : ss << " arg1=" << vSubArguments[1]->GenSlidingWindowDeclRef()<<";\n";
4668 0 : ss << " arg2=" << vSubArguments[2]->GenSlidingWindowDeclRef()<<";\n";
4669 0 : ss << " arg3=" << vSubArguments[3]->GenSlidingWindowDeclRef()<<";\n";
4670 0 : ss << " arg4=" << vSubArguments[4]->GenSlidingWindowDeclRef()<<";\n";
4671 0 : ss << " arg5=" << vSubArguments[5]->GenSlidingWindowDeclRef()<<";\n";
4672 0 : ss << " int guessLen = " << pSVR->GetArrayLength() << ";\n";
4673 : #ifdef ISNAN
4674 0 : ss << " if (isNan(arg0) || isNan(arg1) || isNan(arg2)){\n";
4675 0 : ss << " result = 523;\n";
4676 0 : ss << " return result;\n";
4677 0 : ss << " }\n";
4678 0 : ss << " if (isNan(arg3))\n";
4679 0 : ss << " arg3 = 0.0;\n";
4680 0 : ss << " if (isNan(arg4))\n";
4681 0 : ss << " arg4 = 0.0;\n";
4682 0 : ss << " if (isNan(arg5))\n";
4683 0 : ss << " arg5 = 0.1;\n";
4684 0 : ss << " if (gid0 >= guessLen)\n";
4685 0 : ss << " arg5 = 0.1;\n";
4686 : #endif
4687 0 : ss << " arg3 = arg3 - arg1 * arg4;\n";
4688 0 : ss << " arg2 = arg2 + arg1 * arg4;\n";
4689 0 : ss << " if (arg0 == Round(arg0)){\n";
4690 0 : ss << " fX = arg5;\n";
4691 0 : ss << " double fPowN, fPowNminus1;\n";
4692 0 : ss << " while (!bFound && nCount < nIterationsMax)\n";
4693 0 : ss << " {\n";
4694 0 : ss << " fPowNminus1 = pow( 1.0+fX, arg0-1.0);\n";
4695 0 : ss << " fPowN = fPowNminus1 * (1.0+fX);\n";
4696 0 : ss << " if (approxEqual( fabs(fX), 0.0))\n";
4697 0 : ss << " {\n";
4698 0 : ss << " fGeoSeries = arg0;\n";
4699 0 : ss << " fGeoSeriesDerivation = arg0 * (arg0-1.0)";
4700 0 : ss << "*pow(2.0,-1);\n";
4701 0 : ss << " }\n";
4702 0 : ss << " else\n";
4703 0 : ss << " {";
4704 0 : ss << " fGeoSeries = (fPowN-1.0)*pow(fX,-1);\n";
4705 0 : ss << " fGeoSeriesDerivation =";
4706 0 : ss << " arg0 * fPowNminus1 * pow( fX , -1) - fGeoSeries * pow(fX, -1);\n";
4707 0 : ss << " }\n";
4708 0 : ss << " fTerm = arg3 + arg2 *fPowN+ arg1 * fGeoSeries;\n";
4709 0 : ss << " fTermDerivation = arg2 * arg0 * fPowNminus1 +";
4710 0 : ss << "arg1 * fGeoSeriesDerivation;\n";
4711 0 : ss << " if (fabs(fTerm) < fEpsilonSmall)\n";
4712 0 : ss << " bFound = true;\n";
4713 0 : ss << " else\n";
4714 0 : ss << " {\n";
4715 0 : ss << " if (approxEqual(fabs(fTermDerivation), 0.0))\n";
4716 0 : ss << " fXnew = fX + 1.1 * SCdEpsilon;\n";
4717 0 : ss << " else\n";
4718 0 : ss << " fXnew = fX - fTerm ";
4719 0 : ss << "*pow( fTermDerivation,-1);\n";
4720 0 : ss << " nCount++;\n";
4721 0 : ss << " bFound = (fabs(fXnew - fX) < SCdEpsilon);\n";
4722 0 : ss << " fX = fXnew;\n";
4723 0 : ss << " }\n";
4724 0 : ss << " }\n";
4725 0 : ss << " }\n";
4726 0 : ss << " else\n";
4727 0 : ss << " {";
4728 0 : ss << " fX = (arg5 < -1.0) ? -1.0 : arg5;\n";
4729 0 : ss << " while (bValid && !bFound && nCount < nIterationsMax)\n";
4730 0 : ss << " {\n";
4731 0 : ss << " if (approxEqual(fabs(fX), 0.0)){\n";
4732 0 : ss << " fGeoSeries = arg0;\n";
4733 0 : ss << " fGeoSeriesDerivation = arg0 * ";
4734 0 : ss << "(arg0-1.0)* pow(2.0,-1);\n";
4735 0 : ss << " }else{\n";
4736 0 : ss << " fGeoSeries = (pow( 1.0+fX, arg0) - 1.0)";
4737 0 : ss << " *pow( fX,-1);\n";
4738 0 : ss << " fGeoSeriesDerivation =";
4739 0 : ss << " arg0 * pow(1.0+fX,arg0-1.0) *pow(fX,-1)";
4740 0 : ss << " - fGeoSeries *pow( fX,-1);\n";
4741 0 : ss << " }\n";
4742 0 : ss << " fTerm = arg3 + arg2 *pow(1.0+fX, arg0)";
4743 0 : ss << "+ arg1 * fGeoSeries;\n";
4744 0 : ss << " fTermDerivation =";
4745 0 : ss << "arg2*arg0*pow(1.0+fX,arg0-1.0)";
4746 0 : ss << "+arg1*fGeoSeriesDerivation;\n";
4747 0 : ss << " if (fabs(fTerm) < fEpsilonSmall)\n";
4748 0 : ss << " bFound = true;\n";
4749 0 : ss << " else{\n";
4750 0 : ss << " if (approxEqual(fabs(fTermDerivation), 0.0))\n";
4751 0 : ss << " fXnew = fX + 1.1 * SCdEpsilon;\n";
4752 0 : ss << " else\n";
4753 0 : ss << " fXnew = fX - fTerm ";
4754 0 : ss << "*pow( fTermDerivation,-1);\n";
4755 0 : ss << " nCount++;\n";
4756 0 : ss << " bFound = (fabs(fXnew - fX) < SCdEpsilon);\n";
4757 0 : ss << " fX = fXnew;\n";
4758 0 : ss << " bValid = (fX >= -1.0);\n";
4759 0 : ss << " }\n";
4760 0 : ss << " }\n";
4761 0 : ss << " }\n";
4762 0 : ss << " if (bValid && bFound)\n";
4763 0 : ss << " result = fX;\n";
4764 0 : ss << " else\n";
4765 0 : ss << " result = 523;\n";
4766 0 : ss << " return result;\n";
4767 0 : ss << "}";
4768 0 : }
4769 :
4770 0 : void OpTbillyield::BinInlineFun(std::set<std::string>& decls,
4771 : std::set<std::string>& funs)
4772 : {
4773 0 : decls.insert(GetDiffDate360Decl);decls.insert(IsLeapYearDecl);
4774 0 : decls.insert(DateToDaysDecl);decls.insert(DaysToDate_LocalBarrierDecl);
4775 0 : decls.insert(DaysInMonthDecl);decls.insert(GetNullDateDecl);
4776 0 : decls.insert(GetDiffDate360_Decl);
4777 0 : funs.insert(GetDiffDate360);funs.insert(DateToDays);
4778 0 : funs.insert(DaysToDate_LocalBarrier);funs.insert(IsLeapYear);
4779 0 : funs.insert(DaysInMonth);funs.insert(GetNullDate);
4780 0 : funs.insert(GetDiffDate360_);
4781 :
4782 0 : }
4783 :
4784 0 : void OpTbillyield::GenSlidingWindowFunction(
4785 : std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
4786 : {
4787 0 : ss << "\ndouble " << sSymName;
4788 0 : ss << "_"<< BinFuncName() <<"(";
4789 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
4790 : {
4791 0 : if (i)
4792 0 : ss << ",";
4793 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
4794 : }
4795 0 : ss << ") {\n\t";
4796 0 : ss << "int gid0 = get_global_id(0);\n\t";
4797 0 : ss << "double tmp = 0;\n\t";
4798 0 : ss << "double tmp000;\n\t";
4799 0 : ss << "double tmp001;\n\t";
4800 0 : ss << "double tmp002;\n\t";
4801 :
4802 : #ifdef ISNAN
4803 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
4804 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
4805 0 : formula::SingleVectorRefToken *>(tmpCur0);
4806 :
4807 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
4808 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
4809 0 : formula::SingleVectorRefToken *>(tmpCur1);
4810 :
4811 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
4812 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
4813 0 : formula::SingleVectorRefToken *>(tmpCur2);
4814 :
4815 0 : ss<< "int buffer_tmp000_len = ";
4816 0 : ss<< tmpCurDVR0->GetArrayLength();
4817 0 : ss << ";\n\t";
4818 :
4819 0 : ss<< "int buffer_tmp001_len = ";
4820 0 : ss<< tmpCurDVR1->GetArrayLength();
4821 0 : ss << ";\n\t";
4822 :
4823 0 : ss<< "int buffer_tmp002_len = ";
4824 0 : ss<< tmpCurDVR2->GetArrayLength();
4825 0 : ss << ";\n\t";
4826 : #endif
4827 :
4828 : #ifdef ISNAN
4829 0 : ss<<"if(gid0>=buffer_tmp000_len || isNan(";
4830 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
4831 0 : ss<<"))\n\t\t";
4832 0 : ss<<"tmp000 = 0;\n\telse \n\t\t";
4833 : #endif
4834 0 : ss<<"tmp000 = ";
4835 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
4836 0 : ss<<";\n\t";
4837 :
4838 : #ifdef ISNAN
4839 0 : ss<<"if(gid0>=buffer_tmp001_len || isNan(";
4840 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
4841 0 : ss<<"))\n\t\t";
4842 0 : ss<<"tmp001 = 0;\n\telse \n\t\t";
4843 : #endif
4844 0 : ss<<"tmp001 = ";
4845 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
4846 0 : ss<<";\n\t";
4847 :
4848 : #ifdef ISNAN
4849 0 : ss<<"if(gid0>=buffer_tmp002_len || isNan(";
4850 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
4851 0 : ss<<"))\n\t\t";
4852 0 : ss<<"tmp002 = 0;\n\telse \n\t\t";
4853 : #endif
4854 0 : ss<<"tmp002 = ";
4855 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
4856 0 : ss<<";\n\t";
4857 0 : ss <<" int nDiff=GetDiffDate360(GetNullDate(),tmp000,tmp001,true);\n";
4858 0 : ss <<" nDiff++;\n";
4859 0 : ss <<" tmp=100.0;\n";
4860 0 : ss <<" tmp = tmp *pow( tmp002,-1);\n";
4861 0 : ss <<" tmp = tmp - 1.0;\n";
4862 0 : ss <<" tmp = tmp * pow( nDiff,-1.0 );\n";
4863 0 : ss <<" tmp = tmp * 360.0;\n";
4864 0 : ss <<" return tmp;\n";
4865 0 : ss << "}\n";
4866 0 : }
4867 0 : void OpDDB::GenSlidingWindowFunction(std::stringstream& ss,
4868 : const std::string &sSymName, SubArguments& vSubArguments)
4869 : {
4870 0 : ss << "\ndouble " << sSymName;
4871 0 : ss << "_"<< BinFuncName() <<"(";
4872 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
4873 : {
4874 0 : if (i)
4875 0 : ss << ",";
4876 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
4877 : }
4878 0 : ss << ") {\n";
4879 0 : ss << " int gid0 = get_global_id(0);\n";
4880 0 : ss << " double tmp = 0;\n";
4881 0 : ss << " double fWert,fRest,fDauer,fPeriode,fFaktor;\n";
4882 0 : ss << " double fZins, fAlterWert, fNeuerWert;\n";
4883 :
4884 : #ifdef ISNAN
4885 0 : FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
4886 0 : FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
4887 0 : FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
4888 0 : FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
4889 0 : FormulaToken* tmpCur4 = vSubArguments[4]->GetFormulaToken();
4890 : #endif
4891 : #ifdef ISNAN
4892 0 : if(tmpCur0->GetType() == formula::svSingleVectorRef)
4893 : {
4894 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
4895 0 : formula::SingleVectorRefToken *>(tmpCur0);
4896 0 : ss <<" if(gid0 >= "<<tmpCurDVR0->GetArrayLength()<<" || isNan(";
4897 0 : ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
4898 0 : ss <<"))\n";
4899 0 : ss <<" fWert = 0;\n else\n";
4900 : }
4901 : #endif
4902 0 : ss <<" fWert = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
4903 0 : ss <<";\n";
4904 : #ifdef ISNAN
4905 0 : if(tmpCur1->GetType() == formula::svSingleVectorRef)
4906 : {
4907 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
4908 0 : formula::SingleVectorRefToken *>(tmpCur1);
4909 0 : ss <<" if(gid0 >= "<<tmpCurDVR1->GetArrayLength()<<" || isNan(";
4910 0 : ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
4911 0 : ss <<"))\n";
4912 0 : ss <<" fRest = 0;\n else\n";
4913 : }
4914 : #endif
4915 0 : ss <<" fRest = ";
4916 0 : ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
4917 0 : ss <<";\n";
4918 : #ifdef ISNAN
4919 0 : if(tmpCur2->GetType() == formula::svSingleVectorRef)
4920 : {
4921 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
4922 0 : formula::SingleVectorRefToken *>(tmpCur2);
4923 0 : ss <<" if(gid0 >= "<<tmpCurDVR2->GetArrayLength()<<" || isNan(";
4924 0 : ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
4925 0 : ss <<"))\n";
4926 0 : ss <<" fDauer = 0;\n else\n";
4927 : }
4928 : #endif
4929 0 : ss <<" fDauer = ";
4930 0 : ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
4931 0 : ss <<";\n";
4932 : #ifdef ISNAN
4933 0 : if(tmpCur3->GetType() == formula::svSingleVectorRef)
4934 : {
4935 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
4936 0 : formula::SingleVectorRefToken *>(tmpCur3);
4937 0 : ss <<" if(gid0 >= "<<tmpCurDVR3->GetArrayLength()<<" || isNan(";
4938 0 : ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
4939 0 : ss <<"))\n";
4940 0 : ss <<" fPeriode = 0;\n else\n";
4941 : }
4942 : #endif
4943 0 : ss <<" fPeriode = "<<vSubArguments[3]->GenSlidingWindowDeclRef();
4944 0 : ss <<";\n";
4945 : #ifdef ISNAN
4946 0 : if(tmpCur4->GetType() == formula::svSingleVectorRef)
4947 : {
4948 : const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
4949 0 : formula::SingleVectorRefToken *>(tmpCur4);
4950 0 : ss <<" if(gid0 >= "<<tmpCurDVR4->GetArrayLength()<<" || isNan(";
4951 0 : ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
4952 0 : ss <<"))\n";
4953 0 : ss <<" fFaktor = 0;\n else\n";
4954 : }
4955 : #endif
4956 0 : ss <<" fFaktor = "<<vSubArguments[4]->GenSlidingWindowDeclRef();
4957 0 : ss <<";\n";
4958 0 : ss <<" fZins = fFaktor * pow(fDauer,-1);\n";
4959 0 : ss <<" if (fZins >= 1.0)\n";
4960 0 : ss <<" {\n";
4961 0 : ss <<" fZins = 1.0;\n";
4962 0 : ss <<" if (fPeriode == 1.0)\n";
4963 0 : ss <<" fAlterWert = fWert;\n";
4964 0 : ss <<" else\n";
4965 0 : ss <<" fAlterWert = 0.0;\n";
4966 0 : ss <<" }\n";
4967 0 : ss <<" else\n";
4968 0 : ss <<" fAlterWert = fWert * pow(1.0 - fZins, fPeriode - 1);\n";
4969 0 : ss <<" fNeuerWert = fWert * pow(1.0 - fZins, fPeriode);\n";
4970 0 : ss <<" if (fNeuerWert < fRest)\n";
4971 0 : ss <<" tmp = fAlterWert - fRest;\n";
4972 0 : ss <<" else\n";
4973 0 : ss <<" tmp = fAlterWert - fNeuerWert;\n";
4974 0 : ss <<" if (tmp < 0.0)\n";
4975 0 : ss <<" tmp = 0.0;\n";
4976 0 : ss <<" return tmp;\n";
4977 0 : ss <<"}";
4978 0 : }
4979 0 : void OpPV::GenSlidingWindowFunction(
4980 : std::stringstream &ss, const std::string &sSymName, SubArguments &
4981 : vSubArguments)
4982 : {
4983 0 : ss << "\ndouble " << sSymName;
4984 0 : ss << "_"<< BinFuncName() <<"(";
4985 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
4986 : {
4987 0 : if (i)
4988 0 : ss << ",";
4989 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
4990 : }
4991 0 : ss << ") {\n";
4992 0 : ss << " double result = " <<"0"<<";\n";
4993 0 : ss << " int gid0 = get_global_id(0);\n";
4994 0 : ss << " double zins;\n";
4995 0 : ss << " double zzr;\n";
4996 0 : ss << " double rmz;\n";
4997 0 : ss << " double zw;\n";
4998 0 : ss << " double flag;\n";
4999 :
5000 : #ifdef ISNAN
5001 0 : FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
5002 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
5003 0 : formula::SingleVectorRefToken *>(tmpCur0);
5004 :
5005 0 : FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
5006 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
5007 0 : formula::SingleVectorRefToken *>(tmpCur1);
5008 :
5009 0 : FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
5010 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
5011 0 : formula::SingleVectorRefToken *>(tmpCur2);
5012 :
5013 : const formula::SingleVectorRefToken*tmpCurDVR3;
5014 : const formula::SingleVectorRefToken*tmpCurDVR4;
5015 :
5016 0 : if(vSubArguments.size()>3)
5017 : {
5018 0 : FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
5019 : tmpCurDVR3= static_cast<const formula::SingleVectorRefToken *>(
5020 0 : tmpCur3);
5021 0 : ss<< " int buffer_zw_len = ";
5022 0 : ss<< tmpCurDVR3->GetArrayLength();
5023 0 : ss << ";\n";
5024 : }
5025 :
5026 0 : if(vSubArguments.size()>4)
5027 : {
5028 0 : FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
5029 : tmpCurDVR4= static_cast<const formula::SingleVectorRefToken *>(
5030 0 : tmpCur4);
5031 0 : ss<< " int buffer_flag_len = ";
5032 0 : ss<< tmpCurDVR4->GetArrayLength();
5033 0 : ss << ";\n";
5034 : }
5035 :
5036 0 : ss<< " int buffer_zins_len = ";
5037 0 : ss<< tmpCurDVR0->GetArrayLength();
5038 0 : ss << ";\n";
5039 :
5040 0 : ss<< " int buffer_zzr_len = ";
5041 0 : ss<< tmpCurDVR1->GetArrayLength();
5042 0 : ss << ";\n";
5043 :
5044 0 : ss<< " int buffer_rmz_len = ";
5045 0 : ss<< tmpCurDVR2->GetArrayLength();
5046 0 : ss << ";\n";
5047 :
5048 : #endif
5049 :
5050 : #ifdef ISNAN
5051 0 : ss<<" if(gid0>=buffer_zins_len || isNan(";
5052 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
5053 0 : ss<<"))\n";
5054 0 : ss<<" zins = 0;\n else \n";
5055 : #endif
5056 0 : ss<<" zins = ";
5057 0 : ss << vSubArguments[0]->GenSlidingWindowDeclRef();
5058 0 : ss<<";\n";
5059 :
5060 : #ifdef ISNAN
5061 0 : ss<<" if(gid0>=buffer_zzr_len || isNan(";
5062 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
5063 0 : ss<<"))\n";
5064 0 : ss<<" zzr = 0;\n else \n";
5065 : #endif
5066 0 : ss<<" zzr = ";
5067 0 : ss << vSubArguments[1]->GenSlidingWindowDeclRef();
5068 0 : ss<<";\n";
5069 :
5070 : #ifdef ISNAN
5071 0 : ss<<" if(gid0>=buffer_rmz_len || isNan(";
5072 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
5073 0 : ss<<"))\n";
5074 0 : ss<<" rmz = 0;\n else \n";
5075 : #endif
5076 0 : ss<<" rmz = ";
5077 0 : ss << vSubArguments[2]->GenSlidingWindowDeclRef();
5078 0 : ss<<";\n";
5079 :
5080 0 : if(vSubArguments.size()>3)
5081 : {
5082 : #ifdef ISNAN
5083 0 : ss<<" if(gid0>=buffer_zw_len || isNan(";
5084 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
5085 0 : ss<<"))\n";
5086 0 : ss<<" zw = 0;\n else \n";
5087 : #endif
5088 0 : ss<<" zw = ";
5089 0 : ss << vSubArguments[3]->GenSlidingWindowDeclRef();
5090 0 : ss<<";\n";
5091 : }else
5092 : {
5093 0 : ss<<" zw = 0;\n";
5094 : }
5095 :
5096 0 : if(vSubArguments.size()>4)
5097 : {
5098 : #ifdef ISNAN
5099 0 : ss<<" if(gid0>=buffer_flag_len || isNan(";
5100 0 : ss << vSubArguments[4]->GenSlidingWindowDeclRef();
5101 0 : ss<<"))\n";
5102 0 : ss<<" flag = 0;\n else \n";
5103 : #endif
5104 0 : ss<<" flag = ";
5105 0 : ss << vSubArguments[4]->GenSlidingWindowDeclRef();
5106 0 : ss<<";\n";
5107 : }else
5108 : {
5109 0 : ss<<" flag = 0;\n";
5110 : }
5111 0 : ss << " if(zins == 0)\n";
5112 0 : ss << " result=zw+rmz*zzr;\n";
5113 0 : ss << " else if(flag > 0)\n";
5114 0 : ss << " result=(zw*pow(1+zins,-zzr))+";
5115 0 : ss << "(rmz*(1-pow(1+zins,-zzr+1))*pow(zins,-1))+rmz;\n";
5116 0 : ss << " else\n";
5117 0 : ss << " result=(zw*pow(1+zins,-zzr))+";
5118 0 : ss << "(rmz*(1-pow(1+zins,-zzr))*pow(zins,-1));\n";
5119 0 : ss << " return -result;\n";
5120 0 : ss << "}";
5121 0 : }
5122 0 : void OpVDB::BinInlineFun(std::set<std::string>& decls,
5123 : std::set<std::string>& funs)
5124 : {
5125 0 : decls.insert(ScGetGDADecl);decls.insert(DblMinDecl);
5126 0 : decls.insert(ScInterVDBDecl);decls.insert(VDBImplementDecl);
5127 0 : funs.insert(ScGetGDA);funs.insert(DblMin);
5128 0 : funs.insert(ScInterVDB);funs.insert(VDBImplement);
5129 0 : }
5130 :
5131 0 : void OpVDB::GenSlidingWindowFunction(
5132 : std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
5133 : {
5134 0 : ss << "\ndouble " << sSymName;
5135 0 : ss << "_"<< BinFuncName() <<"(";
5136 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
5137 : {
5138 0 : if (i)
5139 0 : ss << ",";
5140 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
5141 : }
5142 0 : ss << ") {\n";
5143 0 : ss << " int gid0 = get_global_id(0);\n";
5144 0 : ss << " int singleIndex = gid0;\n";
5145 0 : ss << " double result = 0;\n";
5146 0 : if(vSubArguments.size()<5)
5147 : {
5148 0 : ss << " result = -DBL_MAX;\n";
5149 0 : ss << " return result;\n";
5150 : }else
5151 : {
5152 0 : GenTmpVariables(ss,vSubArguments);
5153 0 : CheckAllSubArgumentIsNan(ss,vSubArguments);
5154 0 : if(vSubArguments.size() <= 6)
5155 : {
5156 0 : ss << " int tmp6 = 0;\n";
5157 : }
5158 0 : if(vSubArguments.size() == 5)
5159 : {
5160 0 : ss << " double tmp5= 2.0;\n";
5161 : }
5162 0 : ss << " if(tmp3 < 0 || tmp4<tmp3 || tmp4>tmp2 || tmp0<0 ||tmp1>tmp0";
5163 0 : ss << "|| tmp5 <=0)\n";
5164 0 : ss << " result = -DBL_MAX;\n";
5165 0 : ss << " else\n";
5166 0 : ss << " result =";
5167 0 : ss << "VDBImplement(tmp0,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);\n";
5168 0 : ss << " return result;\n";
5169 0 : ss << "}";
5170 : }
5171 :
5172 0 : }
5173 :
5174 0 : void OpXirr::GenSlidingWindowFunction(std::stringstream &ss,
5175 : const std::string &sSymName, SubArguments &vSubArguments)
5176 : {
5177 0 : FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
5178 : const formula::DoubleVectorRefToken*pCurDVR= static_cast<const
5179 0 : formula::DoubleVectorRefToken *>(tmpCur);
5180 0 : size_t nCurWindowSize = pCurDVR->GetArrayLength() <
5181 0 : pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength():
5182 0 : pCurDVR->GetRefRowSize() ;
5183 0 : ss << "\ndouble " << sSymName;
5184 0 : ss << "_"<< BinFuncName() <<"(";
5185 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
5186 : {
5187 0 : if (i)
5188 0 : ss << ",";
5189 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
5190 : }
5191 0 : ss << ") {\n";
5192 0 : ss << " int gid0 = get_global_id(0);\n";
5193 0 : ss << " int doubleIndex = gid0;\n";
5194 0 : ss << " int singleIndex = gid0;\n";
5195 0 : ss << " double result = 0;\n";
5196 0 : ss << " int i=0;\n";
5197 0 : if(vSubArguments.size()<2)
5198 : {
5199 0 : ss << " result = -DBL_MAX;\n";
5200 0 : ss << " return result;\n";
5201 : }else
5202 : {
5203 0 : GenTmpVariables(ss,vSubArguments);
5204 0 : if(vSubArguments.size() == 2)
5205 : {
5206 0 : ss << " double tmp2 = 0.1;\n";
5207 : }else
5208 : {
5209 0 : CheckSubArgumentIsNan(ss,vSubArguments,2);
5210 : }
5211 0 : ss << " if(tmp2<=-1)\n";
5212 0 : ss << " result = -DBL_MAX;\n";
5213 0 : ss << " else\n";
5214 0 : ss << " {\n";
5215 0 : ss << " double fMaxEps = 1e-10;\n";
5216 0 : ss << " int nMaxIter = 50;\n";
5217 0 : ss << " double fNewRate, fRateEps, fResultValue, fResultValue2;\n";
5218 0 : ss << " int nIter = 0;\n";
5219 0 : ss << " int bContLoop;\n";
5220 0 : ss << " int windowsSize = ";
5221 0 : ss << nCurWindowSize;
5222 0 : ss << ";\n";
5223 0 : CheckSubArgumentIsNan(ss,vSubArguments,0);
5224 0 : CheckSubArgumentIsNan(ss,vSubArguments,1);
5225 0 : ss << " double D_0 = tmp1;\n";
5226 0 : ss << " double V_0 = tmp0;\n";
5227 0 : ss << " double fResultRate = tmp2;\n";
5228 0 : ss << " double r;\n";
5229 0 : ss << " double fResult;\n";
5230 0 : ss << " do\n";
5231 0 : ss << " {\n";
5232 0 : ss << " fResultValue = V_0;\n";
5233 0 : ss << " r = fResultRate + 1;\n";
5234 0 : ss << " for (i = ";
5235 0 : if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) {
5236 0 : ss << "gid0+1; i < "<< nCurWindowSize <<"; i++)\n";
5237 0 : } else if (pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) {
5238 0 : ss << "1; i < gid0+"<< nCurWindowSize <<"; i++)\n";
5239 : } else {
5240 0 : ss << "1; i < "<< nCurWindowSize <<"; i++)\n";
5241 : }
5242 0 : ss << " {\n";
5243 0 : if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
5244 : {
5245 0 : ss<< " doubleIndex =i+gid0;\n";
5246 : }else
5247 : {
5248 0 : ss<< " doubleIndex =i;\n";
5249 : }
5250 0 : CheckSubArgumentIsNan(ss,vSubArguments,0);
5251 0 : CheckSubArgumentIsNan(ss,vSubArguments,1);
5252 0 : ss << " fResultValue += tmp0/pow(r,(tmp1 - D_0)/365.0);\n";
5253 0 : ss << " }\n";
5254 0 : ss << " fResultValue2 = 0;\n";
5255 :
5256 0 : ss << " for (i = ";
5257 0 : if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) {
5258 0 : ss << "gid0+1; i < "<< nCurWindowSize <<"; i++)\n";
5259 0 : } else if (pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) {
5260 0 : ss << "1; i < gid0+"<< nCurWindowSize <<"; i++)\n";
5261 : } else {
5262 0 : ss << "1; i < "<< nCurWindowSize <<"; i++)\n";
5263 : }
5264 0 : ss << " {\n";
5265 0 : if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
5266 : {
5267 0 : ss<< " doubleIndex =i+gid0;\n";
5268 : }else
5269 : {
5270 0 : ss<< " doubleIndex =i;\n";
5271 : }
5272 0 : CheckSubArgumentIsNan(ss,vSubArguments,0);
5273 0 : CheckSubArgumentIsNan(ss,vSubArguments,1);
5274 0 : ss << " double E_i = (tmp1 - D_0)/365.0;\n";
5275 0 : ss << " fResultValue2 -= E_i * tmp0 / pow(r,E_i + 1.0);\n";
5276 0 : ss << " }\n";
5277 0 : ss << " fNewRate = fResultRate - fResultValue / fResultValue2;\n";
5278 0 : ss << " fRateEps = fabs( fNewRate - fResultRate );\n";
5279 0 : ss << " fResultRate = fNewRate;\n";
5280 0 : ss << " bContLoop = (fRateEps > fMaxEps) && (fabs( fResultValue ) > fMaxEps);\n";
5281 0 : ss << " }\n";
5282 0 : ss << " while( bContLoop && (++nIter < nMaxIter) );\n";
5283 0 : ss << " if( bContLoop )\n";
5284 0 : ss << " result = -DBL_MAX;\n";
5285 0 : ss << " result = fResultRate;\n";
5286 0 : ss << " }\n";
5287 0 : ss << " return result;\n";
5288 0 : ss << "}";
5289 : }
5290 :
5291 0 : }
5292 0 : void OpDB::GenSlidingWindowFunction(std::stringstream& ss,
5293 : const std::string &sSymName, SubArguments& vSubArguments)
5294 : {
5295 0 : ss << "\ndouble " << sSymName;
5296 0 : ss << "_"<< BinFuncName() <<"(";
5297 0 : for (unsigned i = 0; i < vSubArguments.size(); i++)
5298 : {
5299 0 : if (i)
5300 0 : ss << ",";
5301 0 : vSubArguments[i]->GenSlidingWindowDecl(ss);
5302 : }
5303 0 : ss << ") {\n";
5304 0 : ss << " int gid0 = get_global_id(0);\n";
5305 0 : ss << " double nWert,nRest,nDauer,nPeriode;\n";
5306 0 : ss << " int nMonate;\n";
5307 0 : ss << " double tmp = 0;\n";
5308 : #ifdef ISNAN
5309 0 : FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
5310 : const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
5311 0 : formula::SingleVectorRefToken *>(tmpCur0);
5312 0 : FormulaToken* tmpCur1 = vSubArguments[1]->GetFormulaToken();
5313 : const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
5314 0 : formula::SingleVectorRefToken *>(tmpCur1);
5315 0 : FormulaToken* tmpCur2 = vSubArguments[2]->GetFormulaToken();
5316 : const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
5317 0 : formula::SingleVectorRefToken *>(tmpCur2);
5318 0 : FormulaToken* tmpCur3 = vSubArguments[3]->GetFormulaToken();
5319 : const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
5320 0 : formula::SingleVectorRefToken *>(tmpCur3);
5321 0 : FormulaToken* tmpCur4 = vSubArguments[4]->GetFormulaToken();
5322 : const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
5323 0 : formula::SingleVectorRefToken *>(tmpCur4);
5324 0 : ss<< " int buffer_wert_len = ";
5325 0 : ss<< tmpCurDVR0->GetArrayLength();
5326 0 : ss << ";\n";
5327 0 : ss<< " int buffer_rest_len = ";
5328 0 : ss<< tmpCurDVR1->GetArrayLength();
5329 0 : ss << ";\n";
5330 0 : ss<< " int buffer_dauer_len = ";
5331 0 : ss<< tmpCurDVR2->GetArrayLength();
5332 0 : ss << ";\n";
5333 0 : ss<< " int buffer_periode_len = ";
5334 0 : ss<< tmpCurDVR3->GetArrayLength();
5335 0 : ss << ";\n";
5336 0 : ss<< " int buffer_nMonate_len = ";
5337 0 : ss<< tmpCurDVR4->GetArrayLength();
5338 0 : ss << ";\n";
5339 : #endif
5340 : #ifdef ISNAN
5341 0 : ss <<" if(gid0 >= buffer_wert_len || isNan(";
5342 0 : ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
5343 0 : ss <<"))\n";
5344 0 : ss <<" nWert = 0;\n else\n";
5345 : #endif
5346 0 : ss <<" nWert = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
5347 0 : ss <<";\n";
5348 : #ifdef ISNAN
5349 0 : ss <<" if(gid0 >= buffer_rest_len || isNan(";
5350 0 : ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
5351 0 : ss <<"))\n";
5352 0 : ss <<" nRest = 0;\n else\n";
5353 : #endif
5354 0 : ss <<" nRest = ";
5355 0 : ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
5356 0 : ss <<";\n";
5357 : #ifdef ISNAN
5358 0 : ss <<" if(gid0 >= buffer_dauer_len || isNan(";
5359 0 : ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
5360 0 : ss <<"))\n";
5361 0 : ss <<" nDauer = 0;\n else\n";
5362 : #endif
5363 0 : ss <<" nDauer = "<<vSubArguments[2]->GenSlidingWindowDeclRef();
5364 0 : ss <<";\n";
5365 : #ifdef ISNAN
5366 0 : ss <<" if(gid0 >= buffer_periode_len || isNan(";
5367 0 : ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
5368 0 : ss <<"))\n";
5369 0 : ss <<" nPeriode = 0;\n else\n";
5370 : #endif
5371 0 : ss <<" nPeriode = "<<vSubArguments[3]->GenSlidingWindowDeclRef();
5372 0 : ss <<";\n";
5373 : #ifdef ISNAN
5374 0 : ss <<" if(gid0 >= buffer_nMonate_len || isNan(";
5375 0 : ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
5376 0 : ss <<"))\n";
5377 0 : ss <<" nMonate = 0;\n else\n";
5378 : #endif
5379 0 : ss <<" nMonate = (int)"<<vSubArguments[4]->GenSlidingWindowDeclRef();
5380 0 : ss <<";\n";
5381 0 : ss <<" double nAbRate = 1.0 - pow(nRest / nWert, 1.0 / nDauer);\n";
5382 0 : ss <<" nAbRate = ((int)(nAbRate * 1000.0 + 0.5)) / 1000.0;\n";
5383 0 : ss <<" double nErsteAbRate = nWert * nAbRate * nMonate / 12.0;\n";
5384 0 : ss <<" double nGda2 = 0.0;\n";
5385 0 : ss <<" if ((int)(nPeriode) == 1)\n";
5386 0 : ss <<" nGda2 = nErsteAbRate;\n";
5387 0 : ss <<" else\n";
5388 0 : ss <<" {\n";
5389 0 : ss <<" double nSummAbRate = nErsteAbRate;\n";
5390 0 : ss <<" double nMin = nDauer;\n";
5391 0 : ss <<" if (nMin > nPeriode) nMin = nPeriode;\n";
5392 0 : ss <<" int iMax = (int)nMin;\n";
5393 0 : ss <<" for (int i = 2; i <= iMax; i++)\n";
5394 0 : ss <<" {\n";
5395 0 : ss <<" nGda2 = (nWert - nSummAbRate) * nAbRate;\n";
5396 0 : ss <<" nSummAbRate += nGda2;\n";
5397 0 : ss <<" }\n";
5398 0 : ss <<" if (nPeriode > nDauer)\n";
5399 0 : ss <<" nGda2 = ((nWert - nSummAbRate)";
5400 0 : ss <<"* nAbRate * (12.0 - nMonate)) / 12.0;\n";
5401 0 : ss <<" }\n";
5402 0 : ss <<" tmp = nGda2;\n";
5403 0 : ss <<" return tmp;\n";
5404 0 : ss <<"}";
5405 0 : }
5406 0 : }}
5407 :
5408 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|