19 void OpBesselj::GenSlidingWindowFunction(std::stringstream &ss,
20 const std::string &sSymName,
SubArguments &vSubArguments)
23 ss <<
"\ndouble " << sSymName;
24 ss <<
"_" << BinFuncName() <<
"(";
25 for (
size_t i = 0;
i < vSubArguments.size();
i++)
29 vSubArguments[
i]->GenSlidingWindowDecl(ss);
32 ss <<
" int gid0 = get_global_id(0);\n";
33 ss <<
" double x = 0.0;\n";
34 ss <<
" double N = 0.0;\n";
35 FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
37 if(
ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
46 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
47 ss <<
" if (isnan(x))\n";
53 ss <<
" x = " << tmpCur0->
GetDouble() <<
";\n";
63 ss << vSubArguments[0]->GenSlidingWindowDeclRef() <<
";\n";
66 FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
68 if(
ocPush == vSubArguments[1]->GetFormulaToken()->GetOpCode())
77 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
78 ss <<
" if (isnan(N))\n";
84 ss <<
" N = " << tmpCur1->
GetDouble() <<
";\n";
94 ss << vSubArguments[1]->GenSlidingWindowDeclRef() <<
";\n";
96 ss <<
" double f_PI = 3.1415926535897932385;\n";
97 ss <<
" double f_2_DIV_PI = 2.0 / f_PI;\n";
98 ss <<
" double f_PI_DIV_2 = f_PI / 2.0;\n";
99 ss <<
" double f_PI_DIV_4 = f_PI / 4.0;\n";
100 ss <<
" if( N < 0.0 )\n";
101 ss <<
" return CreateDoubleError(IllegalArgument);\n";
102 ss <<
" if (x == 0.0)\n";
103 ss <<
" return (N == 0.0) ? 1.0 : 0.0;\n";
104 ss <<
" double fSign = ((int)N % 2 == 1 && x < 0.0) ? -1.0 : 1.0;\n";
105 ss <<
" double fX = fabs(x);\n";
106 ss <<
" double fMaxIteration = 9000000.0;\n";
107 ss <<
" double fEstimateIteration = fX * 1.5 + N;\n";
108 ss <<
" bool bAsymptoticPossible = pow(fX,0.4) > N;\n";
109 ss <<
" if (fEstimateIteration > fMaxIteration)\n";
111 ss <<
" if (bAsymptoticPossible)\n";
112 ss <<
" return fSign * sqrt(f_2_DIV_PI/fX)";
113 ss <<
"* cos(fX-N*f_PI_DIV_2-f_PI_DIV_4);\n";
115 ss <<
" return CreateDoubleError(NoConvergence);\n";
117 ss <<
" double epsilon = 1.0e-15;\n";
118 ss <<
" bool bHasfound = false;\n";
119 ss <<
" double k= 0.0;\n";
120 ss <<
" double u ;\n";
121 ss <<
" double m_bar;\n";
122 ss <<
" double g_bar;\n";
123 ss <<
" double g_bar_delta_u;\n";
124 ss <<
" double g = 0.0;\n";
125 ss <<
" double delta_u = 0.0;\n";
126 ss <<
" double f_bar = -1.0;\n";
127 ss <<
" if (N==0)\n";
130 ss <<
" g_bar_delta_u = 0.0;\n";
131 ss <<
" g_bar = - 2.0/fX; \n";
132 ss <<
" delta_u = g_bar_delta_u / g_bar;\n";
133 ss <<
" u = u + delta_u ;\n";
134 ss <<
" g = -1.0 / g_bar; \n";
135 ss <<
" f_bar = f_bar * g;\n";
138 ss <<
" if (N!=0)\n";
141 ss <<
" for (k =1.0; k<= N-1; k = k + 1.0)\n";
143 ss <<
" m_bar=2.0 * fmod(k-1.0, 2.0) * f_bar;\n";
144 ss <<
" g_bar_delta_u = - g * delta_u - m_bar * u;\n";
145 ss <<
" g_bar = m_bar - 2.0*k/fX + g;\n";
146 ss <<
" delta_u = g_bar_delta_u / g_bar;\n";
147 ss <<
" u = u + delta_u;\n";
148 ss <<
" g = -1.0/g_bar;\n";
149 ss <<
" f_bar=f_bar * g;\n";
151 ss <<
" m_bar=2.0 * fmod(k-1.0, 2.0) * f_bar;\n";
152 ss <<
" g_bar_delta_u = f_bar - g * delta_u - m_bar * u;\n";
153 ss <<
" g_bar = m_bar - 2.0*k/fX + g;\n";
154 ss <<
" delta_u = g_bar_delta_u / g_bar;\n";
155 ss <<
" u = u + delta_u;\n";
156 ss <<
" g = -1.0/g_bar;\n";
157 ss <<
" f_bar = f_bar * g;\n";
158 ss <<
" k = k + 1.0;\n";
162 ss <<
" m_bar = 2.0 * fmod(k-1.0, 2.0) * f_bar;\n";
163 ss <<
" g_bar_delta_u = - g * delta_u - m_bar * u;\n";
164 ss <<
" g_bar = m_bar - 2.0*k/fX + g;\n";
165 ss <<
" delta_u = g_bar_delta_u / g_bar;\n";
166 ss <<
" u = u + delta_u;\n";
167 ss <<
" g = -pow(g_bar,-1.0);\n";
168 ss <<
" f_bar = f_bar * g;\n";
169 ss <<
" bHasfound = (fabs(delta_u)<=fabs(u)*epsilon);\n";
170 ss <<
" k = k + 1.0;\n";
172 ss <<
" while (!bHasfound && k <= fMaxIteration);\n";
173 ss <<
" if (bHasfound)\n";
174 ss <<
" return u * fSign;\n";
176 ss <<
" return CreateDoubleError(NoConvergence);\n";
179 void OpGestep::GenSlidingWindowFunction(
180 std::stringstream &ss,
const std::string &sSymName,
183 ss <<
"\ndouble " << sSymName;
184 ss <<
"_"<< BinFuncName() <<
"(";
185 for (
size_t i = 0;
i < vSubArguments.size();
i++)
189 vSubArguments[
i]->GenSlidingWindowDecl(ss);
193 ss <<
" double tmp=0,tmp0 =0,tmp1 = 0;\n";
194 ss <<
" int gid0=get_global_id(0);\n";
196 for (
size_t i = 0;
i < vSubArguments.size();
i++)
212 if(
ocPush==vSubArguments[
i]->GetFormulaToken()->GetOpCode())
215 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
217 ss <<
" tmp"<<
i<<
" = 0;\n";
219 ss <<
" tmp"<<i<<
" = ";
220 ss << vSubArguments[i]->GenSlidingWindowDeclRef();
225 ss <<
"tmp"<<
i<<
" ="<<vSubArguments[
i]->GenSlidingWindowDeclRef();
229 ss <<
" tmp =tmp0 >= tmp1 ? 1 : 0;\n";
230 ss <<
" return tmp;\n";
std::vector< DynamicKernelArgumentRef > SubArguments
Arguments that are actually compile-time constant string Currently, only the hash is passed...
#define CHECK_PARAMETER_COUNT(min, max)