Kaydet (Commit) b0aec629 authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Properly split header and source files.

Without this, formulagroupcl.cxx alone would take minutes to compile.

Change-Id: I7d55ed22fbd7f5c0859d5f1bf2a4e4eafd47ac3b
üst 92d7ca2c
...@@ -38,6 +38,10 @@ $(eval $(call gb_Library_use_libraries,scopencl,\ ...@@ -38,6 +38,10 @@ $(eval $(call gb_Library_use_libraries,scopencl,\
$(eval $(call gb_Library_add_exception_objects,scopencl,\ $(eval $(call gb_Library_add_exception_objects,scopencl,\
sc/source/core/opencl/formulagroupcl \ sc/source/core/opencl/formulagroupcl \
sc/source/core/opencl/openclwrapper \ sc/source/core/opencl/openclwrapper \
sc/source/core/opencl/op_financial \
sc/source/core/opencl/op_database \
sc/source/core/opencl/op_math \
sc/source/core/opencl/op_statistical \
sc/source/core/opencl/clcc/clew \ sc/source/core/opencl/clcc/clew \
)) ))
......
...@@ -18,10 +18,10 @@ ...@@ -18,10 +18,10 @@
#include "openclwrapper.hxx" #include "openclwrapper.hxx"
#include "op_financial.cxx" #include "op_financial.hxx"
#include "op_database.cxx" #include "op_database.hxx"
#include "op_math.cxx" #include "op_math.hxx"
#include "op_statistical.cxx" #include "op_statistical.hxx"
#include "formulagroupcl_public.hxx" #include "formulagroupcl_public.hxx"
#include "formulagroupcl_finacial.hxx" #include "formulagroupcl_finacial.hxx"
......
...@@ -7,26 +7,12 @@ ...@@ -7,26 +7,12 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
#ifndef OP_DATABASE #include "op_database.hxx"
#define OP_DATABASE
#include "formulagroup.hxx"
#include "document.hxx"
#include "formulacell.hxx"
#include "tokenarray.hxx"
#include "compiler.hxx"
#include "interpre.hxx"
#include "opbase.hxx"
#include<list>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <memory>
using namespace formula;
namespace sc { namespace opencl { namespace sc { namespace opencl {
}} }}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#ifndef SC_OPENCL_OP_DATABASE_HXX
#define SC_OPENCL_OP_DATABASE_HXX
namespace sc { namespace opencl {
}}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
This source diff could not be displayed because it is too large. You can view the blob instead.
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#ifndef SC_OPENCL_OP_FINANCIAL_HXX
#define SC_OPENCL_OP_FINANCIAL_HXX
#include "opbase.hxx"
namespace sc { namespace opencl {
class RRI: public SlidingFunctionBase, public OpBase
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
};
class OpRRI:public RRI
{
public:
virtual std::string GetBottom(void) { return "0"; }
virtual std::string BinFuncName(void) const { return "RRI"; }
};
class OpNominal: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "NOMINAL_ADD"; }
};
class OpDollarde:public Normal
{
public:
virtual std::string GetBottom(void) { return "0"; }
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Dollarde"; }
};
class OpDollarfr:public Normal
{
public:
virtual std::string GetBottom(void) { return "0"; }
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Dollarfr"; }
};
class OpDISC: public Normal
{
public:
virtual std::string GetBottom(void) { return "0"; }
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "DISC"; }
};
class OpINTRATE: public Normal
{
public:
virtual std::string GetBottom(void) { return "0"; }
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "INTRATE"; }
};
class Fvschedule: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
};
class Cumipmt: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
};
class IRR: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
};
class OpIRR: public IRR
{
public:
virtual std::string GetBottom(void) { return "0"; }
virtual std::string BinFuncName(void) const { return "IRR"; }
};
class XNPV: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
};
class PriceMat: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
};
class OpSYD: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "SYD"; }
};
class MIRR: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
};
class OpEffective:public Normal
{
public:
virtual std::string GetBottom(void) { return "0"; }
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Effect_Add"; }
};
class OpCumipmt: public Cumipmt
{
public:
virtual std::string GetBottom(void) { return "0"; }
virtual std::string BinFuncName(void) const { return "Cumipmt"; }
};
class OpXNPV: public XNPV
{
public:
virtual std::string GetBottom(void) { return "0"; }
virtual std::string BinFuncName(void) const { return "XNPV"; }
};
class OpTbilleq: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "fTbilleq"; }
};
class OpCumprinc: public Normal
{
public:
virtual std::string GetBottom(void) { return "0"; }
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "cumprinc"; }
};
class OpAccrintm: public Normal
{
public:
virtual std::string GetBottom(void) { return "0"; }
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Accrintm"; }
};
class OpYield: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Yield"; }
};
class OpSLN: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "SLN"; }
};
class OpFvschedule: public Fvschedule
{
public:
virtual std::string GetBottom(void) { return "0"; }
virtual std::string BinFuncName(void) const { return "Fvschedule"; }
};
class OpYieldmat: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Yieldmat"; }
};
class OpPMT: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "PMT"; }
};
class OpPPMT: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "PPMT"; }
};
class OpCoupdaybs:public Normal
{
public:
virtual std::string GetBottom(void) { return "0";}
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Coupdaybs"; }
};
class OpCoupdays:public Normal
{
public:
virtual std::string GetBottom(void) { return "0";}
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Coupdays";}
};
class OpCoupdaysnc:public Normal
{
public:
virtual std::string GetBottom(void) { return "0";}
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Coupdaysnc"; }
};
class OpReceived:public Normal
{
public:
virtual std::string GetBottom(void) { return "0"; }
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Received"; }
};
class OpYielddisc: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Yielddisc"; }
};
class OpTbillprice: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "fTbillprice"; }
};
class OpPriceMat:public PriceMat
{
public:
virtual std::string GetBottom(void) { return "0"; }
virtual std::string BinFuncName(void) const { return "PriceMat"; }
};
class RATE: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
};
class OpIntrate: public RATE {
public:
virtual std::string GetBottom(void) { return "0"; }
virtual std::string BinFuncName(void) const { return "rate"; }
};
class OpTbillyield: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "fTbillyield"; }
};
class OpMIRR: public MIRR
{
public:
virtual std::string GetBottom(void) { return "0"; }
virtual std::string BinFuncName(void) const { return "MIRR"; }
};
}}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -7,16 +7,15 @@ ...@@ -7,16 +7,15 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
#ifndef OP_MATH #include "op_math.hxx"
#define OP_MATH
#include "formulagroup.hxx" #include "formulagroup.hxx"
#include "document.hxx" #include "document.hxx"
#include "formulacell.hxx" #include "formulacell.hxx"
#include "tokenarray.hxx" #include "tokenarray.hxx"
#include "compiler.hxx" #include "compiler.hxx"
#include "interpre.hxx" #include "interpre.hxx"
#include "opbase.hxx" #include <list>
#include<list>
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include <algorithm> #include <algorithm>
...@@ -25,74 +24,65 @@ ...@@ -25,74 +24,65 @@
using namespace formula; using namespace formula;
namespace sc { namespace opencl { namespace sc { namespace opencl {
class OpCos: public Normal
{ void OpCos::GenSlidingWindowFunction(std::stringstream &ss,
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments) const std::string sSymName, SubArguments &vSubArguments)
{
FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
const formula::SingleVectorRefToken*tmpCurDVR= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur);
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{ {
FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken(); if (i)
const formula::SingleVectorRefToken*tmpCurDVR= dynamic_cast<const ss << ",";
formula::SingleVectorRefToken *>(tmpCur); vSubArguments[i]->GenSlidingWindowDecl(ss);
ss << "\ndouble " << sSymName; }
ss << "_"<< BinFuncName() <<"("; ss << ")\n{\n\t";
for (unsigned i = 0; i < vSubArguments.size(); i++) ss <<"int gid0=get_global_id(0);\n\t";
{ ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
if (i) ss << ";\n\t";
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
ss << ")\n{\n\t";
ss <<"int gid0=get_global_id(0);\n\t";
ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
ss << ";\n\t";
#ifdef ISNAN #ifdef ISNAN
ss<< "if(isNan(arg0)||(gid0>="; ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength(); ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t"; ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t"; ss<<"arg0 = 0;\n\t";
#endif #endif
ss << "double tmp=cos(arg0);\n\t"; ss << "double tmp=cos(arg0);\n\t";
ss << "return tmp;\n"; ss << "return tmp;\n";
ss << "}"; ss << "}";
} }
virtual std::string BinFuncName(void) const { return "Cos"; }
};
class OpCsc: public Normal void OpCsc::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{ {
public: FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
virtual void GenSlidingWindowFunction(std::stringstream &ss, const formula::SingleVectorRefToken*tmpCurDVR= dynamic_cast<const
const std::string sSymName, SubArguments &vSubArguments) formula::SingleVectorRefToken *>(tmpCur);
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{ {
FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken(); if (i)
const formula::SingleVectorRefToken*tmpCurDVR= dynamic_cast<const ss << ",";
formula::SingleVectorRefToken *>(tmpCur); vSubArguments[i]->GenSlidingWindowDecl(ss);
ss << "\ndouble " << sSymName; }
ss << "_"<< BinFuncName() <<"("; ss << ")\n{\n\t";
for (unsigned i = 0; i < vSubArguments.size(); i++) ss <<"int gid0=get_global_id(0);\n\t";
{ ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
if (i) ss << ";\n\t";
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
ss << ")\n{\n\t";
ss <<"int gid0=get_global_id(0);\n\t";
ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
ss << ";\n\t";
#ifdef ISNAN #ifdef ISNAN
ss<< "if(isNan(arg0)||(gid0>="; ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength(); ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t"; ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t"; ss<<"arg0 = 0;\n\t";
#endif #endif
ss << "double tmp=1/sin(arg0);\n\t"; ss << "double tmp=1/sin(arg0);\n\t";
ss << "return tmp;\n"; ss << "return tmp;\n";
ss << "}"; ss << "}";
} }
virtual std::string BinFuncName(void) const { return "Csc"; }
};
}} }}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#ifndef SC_OPENCL_OP_MATH_HXX
#define SC_OPENCL_OP_MATH_HXX
#include "opbase.hxx"
namespace sc { namespace opencl {
class OpCos: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Cos"; }
};
class OpCsc: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Csc"; }
};
}}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -7,732 +7,694 @@ ...@@ -7,732 +7,694 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
#ifndef OP_STATISTICAL #include "op_statistical.hxx"
#define OP_STATISTICAL
#include "formulagroup.hxx" #include "formulagroup.hxx"
#include "document.hxx" #include "document.hxx"
#include "formulacell.hxx" #include "formulacell.hxx"
#include "tokenarray.hxx" #include "tokenarray.hxx"
#include "compiler.hxx" #include "compiler.hxx"
#include "interpre.hxx" #include "interpre.hxx"
#include "opbase.hxx" #include <list>
#include<list>
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include <algorithm> #include <algorithm>
#include <memory> #include <memory>
using namespace formula; using namespace formula;
namespace sc { namespace opencl { namespace sc { namespace opencl {
class OpFisher:public Normal{
public: void OpFisher::GenSlidingWindowFunction(
virtual void GenSlidingWindowFunction(std::stringstream &ss, std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
const std::string sSymName, SubArguments &vSubArguments) {
FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
const formula::SingleVectorRefToken*tmpCurDVR=
dynamic_cast<const formula::SingleVectorRefToken *>(tmpCur);
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{ {
FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken(); if (i)
const formula::SingleVectorRefToken*tmpCurDVR= ss << ",";
dynamic_cast<const formula::SingleVectorRefToken *>(tmpCur); vSubArguments[i]->GenSlidingWindowDecl(ss);
ss << "\ndouble " << sSymName; }
ss << "_"<< BinFuncName() <<"("; ss << ") {\n\t";
for (unsigned i = 0; i < vSubArguments.size(); i++) ss <<"int gid0=get_global_id(0);\n\t";
{ ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
if (i) ss << ";\n\t";
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
ss << ") {\n\t";
ss <<"int gid0=get_global_id(0);\n\t";
ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
ss << ";\n\t";
#ifdef ISNAN #ifdef ISNAN
ss<< "if(isNan(arg0)||(gid0>="; ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength(); ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t"; ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t"; ss<<"arg0 = 0;\n\t";
#endif #endif
ss << "double tmp=atanh(arg0);\n\t"; ss << "double tmp=atanh(arg0);\n\t";
ss << "return tmp;\n"; ss << "return tmp;\n";
ss << "}\n"; ss << "}\n";
} }
virtual std::string BinFuncName(void) const { return "Fisher"; }
};
class OpFisherInv:public Normal{ void OpFisherInv::GenSlidingWindowFunction(
public: std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
virtual void GenSlidingWindowFunction(std::stringstream &ss, {
const std::string sSymName, SubArguments &vSubArguments) FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
const formula::SingleVectorRefToken*tmpCurDVR= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur);
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{ {
FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken(); if (i)
const formula::SingleVectorRefToken*tmpCurDVR= dynamic_cast<const ss << ",";
formula::SingleVectorRefToken *>(tmpCur); vSubArguments[i]->GenSlidingWindowDecl(ss);
ss << "\ndouble " << sSymName; }
ss << "_"<< BinFuncName() <<"("; ss << ") {\n\t";
for (unsigned i = 0; i < vSubArguments.size(); i++) ss <<"int gid0=get_global_id(0);\n\t";
{ ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
if (i) ss << ";\n\t";
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
ss << ") {\n\t";
ss <<"int gid0=get_global_id(0);\n\t";
ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
ss << ";\n\t";
#ifdef ISNAN #ifdef ISNAN
ss<< "if(isNan(arg0)||(gid0>="; ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength(); ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t"; ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t"; ss<<"arg0 = 0;\n\t";
#endif #endif
ss << "double tmp=tanh(arg0);\n\t"; ss << "double tmp=tanh(arg0);\n\t";
ss << "return tmp;\n"; ss << "return tmp;\n";
ss << "}\n"; ss << "}\n";
}
void OpGamma::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{
if (i)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
} }
virtual std::string BinFuncName(void) const { return "FisherInv"; } ss << ") {\n\t";
}; ss <<"int gid0=get_global_id(0);\n\t";
ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
ss << ";\n\t";
ss << "double tmp=tgamma(arg0);\n\t";
ss << "return tmp;\n";
ss << "}\n";
}
class OpGamma:public Normal{ void OpCorrel::GenSlidingWindowFunction(
public: std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
virtual void GenSlidingWindowFunction(std::stringstream &ss, {
const std::string sSymName, SubArguments &vSubArguments) ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{ {
ss << "\ndouble " << sSymName; if (i)
ss << "_"<< BinFuncName() <<"("; ss << ",";
for (unsigned i = 0; i < vSubArguments.size(); i++) vSubArguments[i]->GenSlidingWindowDecl(ss);
{
if (i)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
ss << ") {\n\t";
ss <<"int gid0=get_global_id(0);\n\t";
ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
ss << ";\n\t";
ss << "double tmp=tgamma(arg0);\n\t";
ss << "return tmp;\n";
ss << "}\n";
} }
virtual std::string BinFuncName(void) const { return "Gamma"; } ss << ") {\n\t";
}; ss << "double vSum = 0.0;\n\t";
class OpCorrel:public Normal{ ss << "double vXSum = 0.0;\n\t";
public: ss << "double vYSum = 0.0;\n\t";
virtual void GenSlidingWindowFunction(std::stringstream &ss, ss << "double vXMean = 0.0;\n\t";
const std::string sSymName, SubArguments &vSubArguments) ss << "double vYMean = 0.0;\n\t";
ss << "int gid0 = get_global_id(0);\n\t";
ss << "double arg0 = 0.0;\n\t";
ss << "double arg1 = 0.0;\n\t";
ss << "int cnt = 0;\n\t";
FormulaToken *pCurX = vSubArguments[0]->GetFormulaToken();
FormulaToken *pCurY = vSubArguments[1]->GetFormulaToken();
const formula::DoubleVectorRefToken* pCurDVRX =
dynamic_cast<const formula::DoubleVectorRefToken *>(pCurX);
const formula::DoubleVectorRefToken* pCurDVRY =
dynamic_cast<const formula::DoubleVectorRefToken *>(pCurY);
size_t nCurWindowSizeX = pCurDVRX->GetRefRowSize();
size_t nCurWindowSizeY = pCurDVRY->GetRefRowSize();
if(nCurWindowSizeX == nCurWindowSizeY)
{ {
ss << "\ndouble " << sSymName; ss << "for (int i = ";
ss << "_"<< BinFuncName() <<"("; if (!pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
for (unsigned i = 0; i < vSubArguments.size(); i++) ss << "gid0; i < " << nCurWindowSizeX << "; i++) {\n\t\t";
{ ss << "arg0 = " << vSubArguments[0]
if (i) ->GenSlidingWindowDeclRef() << ";\n\t\t";
ss << ","; ss << "arg1 = " << vSubArguments[1]
vSubArguments[i]->GenSlidingWindowDecl(ss); ->GenSlidingWindowDeclRef() << ";\n\t\t";
}
ss << ") {\n\t";
ss << "double vSum = 0.0;\n\t";
ss << "double vXSum = 0.0;\n\t";
ss << "double vYSum = 0.0;\n\t";
ss << "double vXMean = 0.0;\n\t";
ss << "double vYMean = 0.0;\n\t";
ss << "int gid0 = get_global_id(0);\n\t";
ss << "double arg0 = 0.0;\n\t";
ss << "double arg1 = 0.0;\n\t";
ss << "int cnt = 0;\n\t";
FormulaToken *pCurX = vSubArguments[0]->GetFormulaToken();
FormulaToken *pCurY = vSubArguments[1]->GetFormulaToken();
const formula::DoubleVectorRefToken* pCurDVRX =
dynamic_cast<const formula::DoubleVectorRefToken *>(pCurX);
const formula::DoubleVectorRefToken* pCurDVRY =
dynamic_cast<const formula::DoubleVectorRefToken *>(pCurY);
size_t nCurWindowSizeX = pCurDVRX->GetRefRowSize();
size_t nCurWindowSizeY = pCurDVRY->GetRefRowSize();
if(nCurWindowSizeX == nCurWindowSizeY)
{
ss << "for (int i = ";
if (!pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
ss << "gid0; i < " << nCurWindowSizeX << "; i++) {\n\t\t";
ss << "arg0 = " << vSubArguments[0]
->GenSlidingWindowDeclRef() << ";\n\t\t";
ss << "arg1 = " << vSubArguments[1]
->GenSlidingWindowDeclRef() << ";\n\t\t";
#ifdef ISNAN #ifdef ISNAN
ss << "if(isNan(arg0) || isNan(arg1) || (i >= "; ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >="; ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t"; ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
ss << "arg0 = 0.0;\n\t\t\t"; ss << "arg0 = 0.0;\n\t\t\t";
ss << "arg1 = 0.0;\n\t\t\t"; ss << "arg1 = 0.0;\n\t\t\t";
ss << "--cnt;\n\t\t"; ss << "--cnt;\n\t\t";
ss << "}\n\t\t"; ss << "}\n\t\t";
#endif #endif
ss << "++cnt;\n\t\t"; ss << "++cnt;\n\t\t";
ss << "vXSum += arg0;\n\t\t"; ss << "vXSum += arg0;\n\t\t";
ss << "vYSum += arg1;\n\t"; ss << "vYSum += arg1;\n\t";
ss << "}\n\t"; ss << "}\n\t";
} else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) { } else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) {
ss << "0; i < gid0 + " << nCurWindowSizeX << "; i++) {\n\t\t"; ss << "0; i < gid0 + " << nCurWindowSizeX << "; i++) {\n\t\t";
ss << "arg0 = " << vSubArguments[0] ss << "arg0 = " << vSubArguments[0]
->GenSlidingWindowDeclRef() << ";\n\t\t"; ->GenSlidingWindowDeclRef() << ";\n\t\t";
ss << "arg1 = " << vSubArguments[1] ss << "arg1 = " << vSubArguments[1]
->GenSlidingWindowDeclRef() << ";\n\t\t"; ->GenSlidingWindowDeclRef() << ";\n\t\t";
#ifdef ISNAN #ifdef ISNAN
ss << "if(isNan(arg0) || isNan(arg1) || (i >= "; ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >="; ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t"; ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
ss << "arg0 = 0.0;\n\t\t\t"; ss << "arg0 = 0.0;\n\t\t\t";
ss << "arg1 = 0.0;\n\t\t\t"; ss << "arg1 = 0.0;\n\t\t\t";
ss << "--cnt;\n\t\t"; ss << "--cnt;\n\t\t";
ss << "}\n\t\t"; ss << "}\n\t\t";
#endif #endif
ss << "++cnt;\n\t\t"; ss << "++cnt;\n\t\t";
ss << "vXSum += arg0;\n\t\t"; ss << "vXSum += arg0;\n\t\t";
ss << "vYSum += arg1;\n\t"; ss << "vYSum += arg1;\n\t";
ss << "}\n\t"; ss << "}\n\t";
} }
else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) { else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t"; ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t";
ss << "arg0 = " << vSubArguments[0] ss << "arg0 = " << vSubArguments[0]
->GenSlidingWindowDeclRef() << ";\n\t\t"; ->GenSlidingWindowDeclRef() << ";\n\t\t";
ss << "arg1 = " << vSubArguments[1] ss << "arg1 = " << vSubArguments[1]
->GenSlidingWindowDeclRef() << ";\n\t\t"; ->GenSlidingWindowDeclRef() << ";\n\t\t";
#ifdef ISNAN #ifdef ISNAN
ss << "if(isNan(arg0) || isNan(arg1) || (i >= "; ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >="; ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t"; ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
ss << "arg0 = 0.0;\n\t\t\t"; ss << "arg0 = 0.0;\n\t\t\t";
ss << "arg1 = 0.0;\n\t\t\t"; ss << "arg1 = 0.0;\n\t\t\t";
ss << "--cnt;\n\t\t"; ss << "--cnt;\n\t\t";
ss << "}\n\t\t"; ss << "}\n\t\t";
#endif #endif
ss << "++cnt;\n\t\t"; ss << "++cnt;\n\t\t";
ss << "vXSum += arg0;\n\t\t"; ss << "vXSum += arg0;\n\t\t";
ss << "vYSum += arg1;\n\t"; ss << "vYSum += arg1;\n\t";
ss << "}\n\t"; ss << "}\n\t";
} else { } else {
ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t"; ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t";
ss << "arg0 = " << vSubArguments[0] ss << "arg0 = " << vSubArguments[0]
->GenSlidingWindowDeclRef() << ";\n\t\t"; ->GenSlidingWindowDeclRef() << ";\n\t\t";
ss << "arg1 = " << vSubArguments[1] ss << "arg1 = " << vSubArguments[1]
->GenSlidingWindowDeclRef() << ";\n\t\t"; ->GenSlidingWindowDeclRef() << ";\n\t\t";
#ifdef ISNAN #ifdef ISNAN
ss << "if(isNan(arg0) || isNan(arg1) || (i + gid0 >= "; ss << "if(isNan(arg0) || isNan(arg1) || (i + gid0 >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i + gid0 >="; ss << pCurDVRX->GetArrayLength() << ") || (i + gid0 >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t"; ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
ss << "arg0 = 0.0;\n\t\t\t"; ss << "arg0 = 0.0;\n\t\t\t";
ss << "arg1 = 0.0;\n\t\t\t"; ss << "arg1 = 0.0;\n\t\t\t";
ss << "--cnt;\n\t\t"; ss << "--cnt;\n\t\t";
ss << "}\n\t\t"; ss << "}\n\t\t";
#endif #endif
ss << "++cnt;\n\t\t"; ss << "++cnt;\n\t\t";
ss << "vXSum += arg0;\n\t\t"; ss << "vXSum += arg0;\n\t\t";
ss << "vYSum += arg1;\n\t"; ss << "vYSum += arg1;\n\t";
ss << "}\n\t";
}
ss << "if(cnt < 1) {\n\t\t";
ss << "return DBL_MIN;\n\t";
ss << "}\n\t"; ss << "}\n\t";
ss << "else {\n\t\t"; }
ss << "vXMean = vXSum/cnt;\n\t\t";
ss << "vYMean = vYSum/cnt;\n\t\t"; ss << "if(cnt < 1) {\n\t\t";
ss << "vXSum = 0.0;\n\t\t"; ss << "return DBL_MIN;\n\t";
ss << "vYSum = 0.0;\n\t\t"; ss << "}\n\t";
ss << "else {\n\t\t";
ss << "for (int i = "; ss << "vXMean = vXSum/cnt;\n\t\t";
if (!pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) { ss << "vYMean = vYSum/cnt;\n\t\t";
ss << "gid0; i < " << nCurWindowSizeX << "; i++) {\n\t\t\t"; ss << "vXSum = 0.0;\n\t\t";
ss << "arg0 = " << vSubArguments[0] ss << "vYSum = 0.0;\n\t\t";
->GenSlidingWindowDeclRef() << ";\n\t\t\t";
ss << "arg1 = " << vSubArguments[1] ss << "for (int i = ";
->GenSlidingWindowDeclRef() << ";\n\t\t\t"; if (!pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
ss << "gid0; i < " << nCurWindowSizeX << "; i++) {\n\t\t\t";
ss << "arg0 = " << vSubArguments[0]
->GenSlidingWindowDeclRef() << ";\n\t\t\t";
ss << "arg1 = " << vSubArguments[1]
->GenSlidingWindowDeclRef() << ";\n\t\t\t";
#ifdef ISNAN #ifdef ISNAN
ss << "if(isNan(arg0) || isNan(arg1) || (i >= "; ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >="; ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t"; ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
ss << "arg0 = vXMean;\n\t\t\t\t"; ss << "arg0 = vXMean;\n\t\t\t\t";
ss << "arg1 = vYMean;\n\t\t\t"; ss << "arg1 = vYMean;\n\t\t\t";
ss << "}\n\t\t\t"; ss << "}\n\t\t\t";
#endif #endif
ss << "vXSum += pow(arg0 - vXMean, 2);\n\t\t\t"; ss << "vXSum += pow(arg0 - vXMean, 2);\n\t\t\t";
ss << "vYSum += pow(arg1 - vYMean, 2);\n\t\t\t"; ss << "vYSum += pow(arg1 - vYMean, 2);\n\t\t\t";
ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t"; ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
ss << "}\n\t\t"; ss << "}\n\t\t";
} else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) { } else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) {
ss << "0; i < gid0 + " << nCurWindowSizeX << "; i++) {\n\t\t\t"; ss << "0; i < gid0 + " << nCurWindowSizeX << "; i++) {\n\t\t\t";
ss << "arg0 = " << vSubArguments[0] ss << "arg0 = " << vSubArguments[0]
->GenSlidingWindowDeclRef() << ";\n\t\t\t"; ->GenSlidingWindowDeclRef() << ";\n\t\t\t";
ss << "arg1 = " << vSubArguments[1] ss << "arg1 = " << vSubArguments[1]
->GenSlidingWindowDeclRef() << ";\n\t\t\t"; ->GenSlidingWindowDeclRef() << ";\n\t\t\t";
#ifdef ISNAN #ifdef ISNAN
ss << "if(isNan(arg0) || isNan(arg1) || (i >= "; ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >="; ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t"; ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
ss << "arg0 = vXMean;\n\t\t\t\t"; ss << "arg0 = vXMean;\n\t\t\t\t";
ss << "arg1 = vYMean;\n\t\t\t"; ss << "arg1 = vYMean;\n\t\t\t";
ss << "}\n\t\t\t"; ss << "}\n\t\t\t";
#endif #endif
ss << "vXSum += pow(arg0 - vXMean, 2);\n\t\t\t"; ss << "vXSum += pow(arg0 - vXMean, 2);\n\t\t\t";
ss << "vYSum += pow(arg1 - vYMean, 2);\n\t\t\t"; ss << "vYSum += pow(arg1 - vYMean, 2);\n\t\t\t";
ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t"; ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
ss << "}\n\t\t"; ss << "}\n\t\t";
} else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) { } else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t\t"; ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t\t";
ss << "arg0 = " << vSubArguments[0] ss << "arg0 = " << vSubArguments[0]
->GenSlidingWindowDeclRef() << ";\n\t\t\t"; ->GenSlidingWindowDeclRef() << ";\n\t\t\t";
ss << "arg1 = " << vSubArguments[1] ss << "arg1 = " << vSubArguments[1]
->GenSlidingWindowDeclRef() << ";\n\t\t\t"; ->GenSlidingWindowDeclRef() << ";\n\t\t\t";
#ifdef ISNAN #ifdef ISNAN
ss << "if(isNan(arg0) || isNan(arg1) || (i >= "; ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >="; ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t"; ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
ss << "arg0 = vXMean;\n\t\t\t\t"; ss << "arg0 = vXMean;\n\t\t\t\t";
ss << "arg1 = vYMean;\n\t\t\t"; ss << "arg1 = vYMean;\n\t\t\t";
ss << "}\n\t\t\t"; ss << "}\n\t\t\t";
#endif #endif
ss << "vXSum += pow(arg0 - vXMean, 2);\n\t\t\t"; ss << "vXSum += pow(arg0 - vXMean, 2);\n\t\t\t";
ss << "vYSum += pow(arg1 - vYMean, 2);\n\t\t\t"; ss << "vYSum += pow(arg1 - vYMean, 2);\n\t\t\t";
ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t"; ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
ss << "}\n\t\t"; ss << "}\n\t\t";
} else { } else {
ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t\t"; ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t\t";
ss << "arg0 = " << vSubArguments[0] ss << "arg0 = " << vSubArguments[0]
->GenSlidingWindowDeclRef() << ";\n\t\t\t"; ->GenSlidingWindowDeclRef() << ";\n\t\t\t";
ss << "arg1 = " << vSubArguments[1] ss << "arg1 = " << vSubArguments[1]
->GenSlidingWindowDeclRef() << ";\n\t\t\t"; ->GenSlidingWindowDeclRef() << ";\n\t\t\t";
#ifdef ISNAN #ifdef ISNAN
ss << "if(isNan(arg0) || isNan(arg1) || (i + gid0 >= "; ss << "if(isNan(arg0) || isNan(arg1) || (i + gid0 >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i + gid0 >="; ss << pCurDVRX->GetArrayLength() << ") || (i + gid0 >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t"; ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
ss << "arg0 = vXMean;\n\t\t\t\t"; ss << "arg0 = vXMean;\n\t\t\t\t";
ss << "arg1 = vYMean;\n\t\t\t"; ss << "arg1 = vYMean;\n\t\t\t";
ss << "}\n\t\t\t"; ss << "}\n\t\t\t";
#endif #endif
ss << "vXSum += ((arg0 - vXMean)*(arg0 - vXMean));\n\t\t\t"; ss << "vXSum += ((arg0 - vXMean)*(arg0 - vXMean));\n\t\t\t";
ss << "vYSum += ((arg1 - vYMean)*(arg1 - vYMean));\n\t\t\t"; ss << "vYSum += ((arg1 - vYMean)*(arg1 - vYMean));\n\t\t\t";
ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t"; ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
ss << "}\n\t\t";
}
ss << "if(vXSum == 0.0 || vYSum == 0.0) {\n\t\t\t";
ss << "return DBL_MIN;\n\t\t";
ss << "}\n\t\t"; ss << "}\n\t\t";
ss << "else {\n\t\t\t";
ss << "return vSum/pow(vXSum*vYSum, 0.5);\n\t\t";
ss << "}\n\t";
ss << "}\n";
ss << "}";
} }
ss << "if(vXSum == 0.0 || vYSum == 0.0) {\n\t\t\t";
ss << "return DBL_MIN;\n\t\t";
ss << "}\n\t\t";
ss << "else {\n\t\t\t";
ss << "return vSum/pow(vXSum*vYSum, 0.5);\n\t\t";
ss << "}\n\t";
ss << "}\n";
ss << "}";
} }
virtual std::string BinFuncName(void) const { return "Correl"; } }
};
class OpNegbinomdist:public Normal{ void OpNegbinomdist::GenSlidingWindowFunction(
public: std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
virtual void GenSlidingWindowFunction(std::stringstream &ss, {
const std::string sSymName, SubArguments &vSubArguments) ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{ {
ss << "\ndouble " << sSymName; if (i)
ss << "_"<< BinFuncName() <<"("; ss << ",";
for (unsigned i = 0; i < vSubArguments.size(); i++) vSubArguments[i]->GenSlidingWindowDecl(ss);
{ }
if (i) ss << ")\n";
ss << ","; ss << "{\n\t";
vSubArguments[i]->GenSlidingWindowDecl(ss); ss << "double f,s,p;\n\t";
} ss << " int gid0=get_global_id(0);\n\t";
ss << ")\n";
ss << "{\n\t";
ss << "double f,s,p;\n\t";
ss << " int gid0=get_global_id(0);\n\t";
#ifdef ISNAN #ifdef ISNAN
FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
const formula::SingleVectorRefToken*tmpCurDVR0= dynamic_cast<const const formula::SingleVectorRefToken*tmpCurDVR0= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur0); formula::SingleVectorRefToken *>(tmpCur0);
FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
const formula::SingleVectorRefToken*tmpCurDVR1= dynamic_cast<const const formula::SingleVectorRefToken*tmpCurDVR1= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur1); formula::SingleVectorRefToken *>(tmpCur1);
FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken(); FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
const formula::SingleVectorRefToken*tmpCurDVR2= dynamic_cast<const const formula::SingleVectorRefToken*tmpCurDVR2= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur2); formula::SingleVectorRefToken *>(tmpCur2);
ss<< "int buffer_f_len = "; ss<< "int buffer_f_len = ";
ss<< tmpCurDVR0->GetArrayLength(); ss<< tmpCurDVR0->GetArrayLength();
ss << ";\n\t"; ss << ";\n\t";
ss<< "int buffer_s_len = "; ss<< "int buffer_s_len = ";
ss<< tmpCurDVR1->GetArrayLength(); ss<< tmpCurDVR1->GetArrayLength();
ss << ";\n\t"; ss << ";\n\t";
ss<< "int buffer_p_len = "; ss<< "int buffer_p_len = ";
ss<< tmpCurDVR2->GetArrayLength(); ss<< tmpCurDVR2->GetArrayLength();
ss << ";\n\t"; ss << ";\n\t";
#endif #endif
#ifdef ISNAN #ifdef ISNAN
ss<<"if((gid0)>=buffer_p_len || isNan("; ss<<"if((gid0)>=buffer_p_len || isNan(";
ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss << vSubArguments[2]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t"; ss<<"))\n\t\t";
ss<<"p = 0;\n\telse \n\t\t"; ss<<"p = 0;\n\telse \n\t\t";
#endif #endif
ss << " p = "<<vSubArguments[2]->GenSlidingWindowDeclRef(); ss << " p = "<<vSubArguments[2]->GenSlidingWindowDeclRef();
ss << " ;\n\t"; ss << " ;\n\t";
#ifdef ISNAN #ifdef ISNAN
ss<<"if((gid0)>=buffer_s_len || isNan("; ss<<"if((gid0)>=buffer_s_len || isNan(";
ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss << vSubArguments[1]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t"; ss<<"))\n\t\t";
ss<<"s = 0;\n\telse \n\t\t"; ss<<"s = 0;\n\telse \n\t\t";
#endif #endif
ss << " s = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); ss << " s = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " ;\n\t"; ss << " ;\n\t";
#ifdef ISNAN #ifdef ISNAN
ss<<"if((gid0)>=buffer_f_len || isNan("; ss<<"if((gid0)>=buffer_f_len || isNan(";
ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss << vSubArguments[0]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t"; ss<<"))\n\t\t";
ss<<"f = 0;\n\telse \n\t\t"; ss<<"f = 0;\n\telse \n\t\t";
#endif #endif
ss << " f = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); ss << " f = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " ;\n\t"; ss << " ;\n\t";
ss << " double q = 1.0 - p;\n\t"; ss << " double q = 1.0 - p;\n\t";
ss << " double fFactor = pow(p,s);\n\t"; ss << " double fFactor = pow(p,s);\n\t";
ss << " for(int i=0; i<f; i++)\n\t"; ss << " for(int i=0; i<f; i++)\n\t";
ss << " {\n\t"; ss << " {\n\t";
ss << " fFactor *= ((double)i+s)/((double)i+1.0)*q;\n\t"; ss << " fFactor *= ((double)i+s)/((double)i+1.0)*q;\n\t";
ss << " }\n\t"; ss << " }\n\t";
ss << " double tmp=fFactor;\n\t"; ss << " double tmp=fFactor;\n\t";
ss << " return tmp;\n"; ss << " return tmp;\n";
ss << "}\n"; ss << "}\n";
} }
virtual std::string BinFuncName(void) const { return "OpNegbinomdist"; }
}; void OpPearson::GenSlidingWindowFunction(
class OpPearson:public Normal{ std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
public: {
virtual void GenSlidingWindowFunction(std::stringstream &ss, FormulaToken* pCur = vSubArguments[1]->GetFormulaToken();
const std::string sSymName, SubArguments &vSubArguments) assert(pCur);
const formula::DoubleVectorRefToken* pCurDVR =
dynamic_cast<const formula::DoubleVectorRefToken *>(pCur);
size_t CurWindowSize = pCurDVR->GetRefRowSize();
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{ {
FormulaToken* pCur = vSubArguments[1]->GetFormulaToken(); if (i)
assert(pCur); ss << ",";
const formula::DoubleVectorRefToken* pCurDVR = vSubArguments[i]->GenSlidingWindowDecl(ss);
dynamic_cast<const formula::DoubleVectorRefToken *>(pCur); }
size_t CurWindowSize = pCurDVR->GetRefRowSize(); ss << ")\n";
ss << "{\n\t";
ss << "\ndouble " << sSymName; ss << "int gid0=get_global_id(0);\n\t";
ss << "_"<< BinFuncName() <<"("; ss << "double fCount = 0.0;\n\t";
for (unsigned i = 0; i < vSubArguments.size(); i++) ss << "double fSumX = 0.0;\n\t";
{ ss << "double fSumY = 0.0;\n\t";
if (i) ss << "double fSumDeltaXDeltaY = 0.0;\n\t";
ss << ","; ss << "double fSumSqrDeltaX = 0.0;\n\t";
vSubArguments[i]->GenSlidingWindowDecl(ss); ss << "double fSumSqrDeltaY = 0.0;\n\t";
} ss << "double fInx;\n\t";
ss << ")\n"; ss << "double fIny;\n\t";
ss << "{\n\t";
ss << "int gid0=get_global_id(0);\n\t";
ss << "double fCount = 0.0;\n\t";
ss << "double fSumX = 0.0;\n\t";
ss << "double fSumY = 0.0;\n\t";
ss << "double fSumDeltaXDeltaY = 0.0;\n\t";
ss << "double fSumSqrDeltaX = 0.0;\n\t";
ss << "double fSumSqrDeltaY = 0.0;\n\t";
ss << "double fInx;\n\t";
ss << "double fIny;\n\t";
#ifdef ISNAN #ifdef ISNAN
FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
const formula::DoubleVectorRefToken*tmpCurDVR0= dynamic_cast<const const formula::DoubleVectorRefToken*tmpCurDVR0= dynamic_cast<const
formula::DoubleVectorRefToken *>(tmpCur0); formula::DoubleVectorRefToken *>(tmpCur0);
FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
const formula::DoubleVectorRefToken*tmpCurDVR1= dynamic_cast<const const formula::DoubleVectorRefToken*tmpCurDVR1= dynamic_cast<const
formula::DoubleVectorRefToken *>(tmpCur1); formula::DoubleVectorRefToken *>(tmpCur1);
ss<< "int buffer_fInx_len = "; ss<< "int buffer_fInx_len = ";
ss<< tmpCurDVR0->GetArrayLength(); ss<< tmpCurDVR0->GetArrayLength();
ss << ";\n\t"; ss << ";\n\t";
ss<< "int buffer_fIny_len = "; ss<< "int buffer_fIny_len = ";
ss<< tmpCurDVR1->GetArrayLength(); ss<< tmpCurDVR1->GetArrayLength();
ss << ";\n\t"; ss << ";\n\t";
#endif #endif
ss << "for(int i=0; i<"<<CurWindowSize<<"; i++)\n\t"; ss << "for(int i=0; i<"<<CurWindowSize<<"; i++)\n\t";
ss << "{\n\t"; ss << "{\n\t";
#ifdef ISNAN #ifdef ISNAN
ss<<"if((gid0+i)>=buffer_fInx_len || isNan("; ss<<"if((gid0+i)>=buffer_fInx_len || isNan(";
ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss << vSubArguments[0]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t"; ss<<"))\n\t\t";
ss<<"fInx = 0;\n\telse \n\t"; ss<<"fInx = 0;\n\telse \n\t";
#endif #endif
ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " ;\n\t"; ss << " ;\n\t";
#ifdef ISNAN #ifdef ISNAN
ss<<"if((gid0+i)>=buffer_fIny_len || isNan("; ss<<"if((gid0+i)>=buffer_fIny_len || isNan(";
ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss << vSubArguments[1]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t"; ss<<"))\n\t\t";
ss<<"fIny = 0;\n\telse \n\t"; ss<<"fIny = 0;\n\telse \n\t";
#endif #endif
ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " ;\n\t"; ss << " ;\n\t";
ss << " double fValX = fInx;\n\t"; ss << " double fValX = fInx;\n\t";
ss << " double fValY = fIny;\n\t"; ss << " double fValY = fIny;\n\t";
ss << " fSumX += fValX;\n\t"; ss << " fSumX += fValX;\n\t";
ss << " fSumY += fValY;\n\t"; ss << " fSumY += fValY;\n\t";
ss << " fCount = fCount + 1;\n\t"; ss << " fCount = fCount + 1;\n\t";
ss << "}\n\t"; ss << "}\n\t";
ss << "const double fMeanX = fSumX / fCount;\n\t"; ss << "const double fMeanX = fSumX / fCount;\n\t";
ss << "const double fMeanY = fSumY / fCount;\n\t"; ss << "const double fMeanY = fSumY / fCount;\n\t";
ss << "for(int i=0; i<"<<CurWindowSize<<"; i++)\n\t"; ss << "for(int i=0; i<"<<CurWindowSize<<"; i++)\n\t";
ss << "{\n\t"; ss << "{\n\t";
ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " ;\n\t"; ss << " ;\n\t";
ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " ;\n\t"; ss << " ;\n\t";
ss << " const double fValX = fInx;\n\t"; ss << " const double fValX = fInx;\n\t";
ss << " const double fValY = fIny;\n\t"; ss << " const double fValY = fIny;\n\t";
ss << " fSumDeltaXDeltaY += (fValX - fMeanX) * (fValY - fMeanY);\n\t"; ss << " fSumDeltaXDeltaY += (fValX - fMeanX) * (fValY - fMeanY);\n\t";
ss << " fSumSqrDeltaX += (fValX - fMeanX) * (fValX - fMeanX);\n\t"; ss << " fSumSqrDeltaX += (fValX - fMeanX) * (fValX - fMeanX);\n\t";
ss << " fSumSqrDeltaY += (fValY - fMeanY) * (fValY - fMeanY);\n\t"; ss << " fSumSqrDeltaY += (fValY - fMeanY) * (fValY - fMeanY);\n\t";
ss << "}\n\t"; ss << "}\n\t";
ss << "double tmp = ( fSumDeltaXDeltaY / "; ss << "double tmp = ( fSumDeltaXDeltaY / ";
ss << "sqrt( fSumSqrDeltaX * fSumSqrDeltaY));\n\t"; ss << "sqrt( fSumSqrDeltaX * fSumSqrDeltaY));\n\t";
ss << "return tmp;\n"; ss << "return tmp;\n";
ss << "}\n"; ss << "}\n";
} }
virtual std::string BinFuncName(void) const { return "OpPearson"; }
}; void OpGammaLn::GenSlidingWindowFunction(
class OpGammaLn:public Normal{ std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
public: {
virtual void GenSlidingWindowFunction(std::stringstream &ss, FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
const std::string sSymName, SubArguments &vSubArguments) const formula::SingleVectorRefToken*tmpCurDVR= dynamic_cast<const
{
FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
const formula::SingleVectorRefToken*tmpCurDVR= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur); formula::SingleVectorRefToken *>(tmpCur);
ss << "\ndouble " << sSymName; ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"("; ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++) for (unsigned i = 0; i < vSubArguments.size(); i++)
{ {
if (i) if (i)
ss << ","; ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss); vSubArguments[i]->GenSlidingWindowDecl(ss);
} }
ss << ") {\n\t"; ss << ") {\n\t";
ss <<"int gid0=get_global_id(0);\n\t"; ss <<"int gid0=get_global_id(0);\n\t";
ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef(); ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
ss << ";\n\t"; ss << ";\n\t";
#ifdef ISNAN #ifdef ISNAN
ss<< "if(isNan(arg0)||(gid0>="; ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength(); ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t"; ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t"; ss<<"arg0 = 0;\n\t";
#endif #endif
ss << "double tmp=lgamma(arg0);\n\t"; ss << "double tmp=lgamma(arg0);\n\t";
ss << "return tmp;\n"; ss << "return tmp;\n";
ss << "}\n"; ss << "}\n";
} }
virtual std::string BinFuncName(void) const { return "GammaLn"; }
};
class OpGauss:public Normal{ void OpGauss::GenSlidingWindowFunction(
public: std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
virtual void GenSlidingWindowFunction(std::stringstream &ss, {
const std::string sSymName, SubArguments &vSubArguments) FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
const formula::SingleVectorRefToken*tmpCurDVR= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur);
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{ {
FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken(); if (i)
const formula::SingleVectorRefToken*tmpCurDVR= dynamic_cast<const ss << ",";
formula::SingleVectorRefToken *>(tmpCur); vSubArguments[i]->GenSlidingWindowDecl(ss);
ss << "\ndouble " << sSymName; }
ss << "_"<< BinFuncName() <<"("; ss << ") {\n\t";
for (unsigned i = 0; i < vSubArguments.size(); i++) ss <<"int gid0=get_global_id(0);\n\t";
{ ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
if (i) ss << ";\n\t";
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
ss << ") {\n\t";
ss <<"int gid0=get_global_id(0);\n\t";
ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
ss << ";\n\t";
#ifdef ISNAN #ifdef ISNAN
ss<< "if(isNan(arg0)||(gid0>="; ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength(); ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t"; ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t"; ss<<"arg0 = 0;\n\t";
#endif #endif
ss << "double tmp=0.5 *erfc(-arg0 * 0.7071067811865475)-0.5;\n\t"; ss << "double tmp=0.5 *erfc(-arg0 * 0.7071067811865475)-0.5;\n\t";
ss << "return tmp;\n"; ss << "return tmp;\n";
ss << "}\n"; ss << "}\n";
} }
virtual std::string BinFuncName(void) const { return "Gauss"; }
}; void OpGeoMean::GenSlidingWindowFunction(
class OpGeoMean:public Normal{ std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
public: {
virtual void GenSlidingWindowFunction(std::stringstream &ss, FormulaToken *pCur = vSubArguments[0]->GetFormulaToken();
const std::string sSymName, SubArguments &vSubArguments) assert(pCur);
const formula::DoubleVectorRefToken* pCurDVR =
dynamic_cast<const formula::DoubleVectorRefToken *>(pCur);
size_t nCurWindowSize = pCurDVR->GetRefRowSize();
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"( ";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{ {
FormulaToken *pCur = vSubArguments[0]->GetFormulaToken(); if (i)
assert(pCur); ss << ",";
const formula::DoubleVectorRefToken* pCurDVR = vSubArguments[i]->GenSlidingWindowDecl(ss);
dynamic_cast<const formula::DoubleVectorRefToken *>(pCur); }
size_t nCurWindowSize = pCurDVR->GetRefRowSize(); ss << ") {\n\t";
ss << "\ndouble " << sSymName; ss << "int gid0 = get_global_id(0);\n\t";
ss << "_"<< BinFuncName() <<"( "; ss << "double nVal=0.0;\n\t";
for (unsigned i = 0; i < vSubArguments.size(); i++) ss << "int length="<<nCurWindowSize;
{ ss << ";\n\tdouble tmp = 0;\n\t";
if (i) ss << "for (int i = 0; i <" << nCurWindowSize << "; i++)\n\t";
ss << ","; ss << "{\n\t";
vSubArguments[i]->GenSlidingWindowDecl(ss); ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
} ss << ";\n\t";
ss << ") {\n\t";
ss << "int gid0 = get_global_id(0);\n\t";
ss << "double nVal=0.0;\n\t";
ss << "int length="<<nCurWindowSize;
ss << ";\n\tdouble tmp = 0;\n\t";
ss << "for (int i = 0; i <" << nCurWindowSize << "; i++)\n\t";
ss << "{\n\t";
ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
ss << ";\n\t";
#ifdef ISNAN #ifdef ISNAN
ss<< "if(isNan(arg0)||((gid0+i)>="; ss<< "if(isNan(arg0)||((gid0+i)>=";
ss<<pCurDVR->GetArrayLength(); ss<<pCurDVR->GetArrayLength();
ss<<"))\n\t{"; ss<<"))\n\t{";
ss<<"length--;\n\t"; ss<<"length--;\n\t";
ss<<"continue;\n\t}\n\t"; ss<<"continue;\n\t}\n\t";
#endif #endif
ss << "nVal += log(arg0);\n\t"; ss << "nVal += log(arg0);\n\t";
ss <<"}\n\t"; ss <<"}\n\t";
ss<<"tmp = exp(nVal/length);\n\t"; ss<<"tmp = exp(nVal/length);\n\t";
ss << "return tmp;\n"; ss << "return tmp;\n";
ss << "}"; ss << "}";
} }
virtual std::string BinFuncName(void) const { return "GeoMean"; }
}; void OpHarMean::GenSlidingWindowFunction(
class OpHarMean:public Normal{ std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
public: {
virtual void GenSlidingWindowFunction(std::stringstream &ss, FormulaToken *pCur = vSubArguments[0]->GetFormulaToken();
const std::string sSymName, SubArguments &vSubArguments) assert(pCur);
const formula::DoubleVectorRefToken* pCurDVR =
dynamic_cast<const formula::DoubleVectorRefToken *>(pCur);
size_t nCurWindowSize = pCurDVR->GetRefRowSize();
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"( ";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{ {
FormulaToken *pCur = vSubArguments[0]->GetFormulaToken(); if (i)
assert(pCur); ss << ",";
const formula::DoubleVectorRefToken* pCurDVR = vSubArguments[i]->GenSlidingWindowDecl(ss);
dynamic_cast<const formula::DoubleVectorRefToken *>(pCur); }
size_t nCurWindowSize = pCurDVR->GetRefRowSize(); ss << ") {\n\t";
ss << "\ndouble " << sSymName; ss << "int gid0 = get_global_id(0);\n\t";
ss << "_"<< BinFuncName() <<"( "; ss << "double nVal=0.0;\n\t";
for (unsigned i = 0; i < vSubArguments.size(); i++) ss << "int length="<<nCurWindowSize;
{ ss << ";\n\tdouble tmp = 0;\n\t";
if (i) ss << "for (int i = 0; i <" << nCurWindowSize << "; i++)\n\t";
ss << ","; ss << "{\n\t";
vSubArguments[i]->GenSlidingWindowDecl(ss); ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
} ss << ";\n\t";
ss << ") {\n\t";
ss << "int gid0 = get_global_id(0);\n\t";
ss << "double nVal=0.0;\n\t";
ss << "int length="<<nCurWindowSize;
ss << ";\n\tdouble tmp = 0;\n\t";
ss << "for (int i = 0; i <" << nCurWindowSize << "; i++)\n\t";
ss << "{\n\t";
ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
ss << ";\n\t";
#ifdef ISNAN #ifdef ISNAN
ss<< "if(isNan(arg0)||((gid0+i)>="; ss<< "if(isNan(arg0)||((gid0+i)>=";
ss<<pCurDVR->GetArrayLength(); ss<<pCurDVR->GetArrayLength();
ss<<"))\n\t{"; ss<<"))\n\t{";
ss<<"length--;\n\t"; ss<<"length--;\n\t";
ss<<"continue;\n\t}\n\t"; ss<<"continue;\n\t}\n\t";
#endif #endif
ss << "nVal += (1.0/arg0);\n\t}\n\t"; ss << "nVal += (1.0/arg0);\n\t}\n\t";
ss<<"tmp = length/nVal;\n\t"; ss<<"tmp = length/nVal;\n\t";
ss << "return tmp;\n"; ss << "return tmp;\n";
ss << "}"; ss << "}";
} }
virtual std::string BinFuncName(void) const { return "HarMean"; }
}; void OpRsq::GenSlidingWindowFunction(
class OpRsq:public Normal{ std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
public: {
virtual void GenSlidingWindowFunction(std::stringstream &ss, FormulaToken* pCur = vSubArguments[1]->GetFormulaToken();
const std::string sSymName, SubArguments &vSubArguments) assert(pCur);
const formula::DoubleVectorRefToken* pCurDVR =
dynamic_cast<const formula::DoubleVectorRefToken *>(pCur);
size_t nCurWindowSize = pCurDVR->GetRefRowSize();
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{ {
FormulaToken* pCur = vSubArguments[1]->GetFormulaToken(); if (i)
assert(pCur); ss << ",";
const formula::DoubleVectorRefToken* pCurDVR = vSubArguments[i]->GenSlidingWindowDecl(ss);
dynamic_cast<const formula::DoubleVectorRefToken *>(pCur); }
size_t nCurWindowSize = pCurDVR->GetRefRowSize(); ss << ")\n";
ss << "{\n\t";
ss << "\ndouble " << sSymName; ss << "int gid0=get_global_id(0);\n\t";
ss << "_"<< BinFuncName() <<"("; ss << "double fCount = 0.0;\n\t";
for (unsigned i = 0; i < vSubArguments.size(); i++) ss << "double fSumX = 0.0;\n\t";
{ ss << "double fSumY = 0.0;\n\t";
if (i) ss << "double fSumDeltaXDeltaY = 0.0;\n\t";
ss << ","; ss << "double fSumSqrDeltaX = 0.0;\n\t";
vSubArguments[i]->GenSlidingWindowDecl(ss); ss << "double fSumSqrDeltaY = 0.0;\n\t";
} ss << "double fInx;\n\t";
ss << ")\n"; ss << "double fIny;\n\t";
ss << "{\n\t";
ss << "int gid0=get_global_id(0);\n\t";
ss << "double fCount = 0.0;\n\t";
ss << "double fSumX = 0.0;\n\t";
ss << "double fSumY = 0.0;\n\t";
ss << "double fSumDeltaXDeltaY = 0.0;\n\t";
ss << "double fSumSqrDeltaX = 0.0;\n\t";
ss << "double fSumSqrDeltaY = 0.0;\n\t";
ss << "double fInx;\n\t";
ss << "double fIny;\n\t";
#ifdef ISNAN #ifdef ISNAN
FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
const formula::DoubleVectorRefToken*tmpCurDVR0= dynamic_cast<const const formula::DoubleVectorRefToken*tmpCurDVR0= dynamic_cast<const
formula::DoubleVectorRefToken *>(tmpCur0); formula::DoubleVectorRefToken *>(tmpCur0);
FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
const formula::DoubleVectorRefToken*tmpCurDVR1= dynamic_cast<const const formula::DoubleVectorRefToken*tmpCurDVR1= dynamic_cast<const
formula::DoubleVectorRefToken *>(tmpCur1); formula::DoubleVectorRefToken *>(tmpCur1);
ss<< "int buffer_fInx_len = "; ss<< "int buffer_fInx_len = ";
ss<< tmpCurDVR0->GetArrayLength(); ss<< tmpCurDVR0->GetArrayLength();
ss << ";\n\t"; ss << ";\n\t";
ss<< "int buffer_fIny_len = "; ss<< "int buffer_fIny_len = ";
ss<< tmpCurDVR1->GetArrayLength(); ss<< tmpCurDVR1->GetArrayLength();
ss << ";\n\t"; ss << ";\n\t";
#endif #endif
ss << "for(int i=0; i<"<<nCurWindowSize<<"; i++)\n\t"; ss << "for(int i=0; i<"<<nCurWindowSize<<"; i++)\n\t";
ss << "{\n\t"; ss << "{\n\t";
#ifdef ISNAN #ifdef ISNAN
ss<<"if((gid0+i)>=buffer_fInx_len || isNan("; ss<<"if((gid0+i)>=buffer_fInx_len || isNan(";
ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss << vSubArguments[0]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t"; ss<<"))\n\t\t";
ss<<"fInx = 0;\n\telse \n\t"; ss<<"fInx = 0;\n\telse \n\t";
#endif #endif
ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " ;\n\t"; ss << " ;\n\t";
#ifdef ISNAN #ifdef ISNAN
ss<<"if((gid0+i)>=buffer_fIny_len || isNan("; ss<<"if((gid0+i)>=buffer_fIny_len || isNan(";
ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss << vSubArguments[1]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t"; ss<<"))\n\t\t";
ss<<"fIny = 0;\n\telse \n\t"; ss<<"fIny = 0;\n\telse \n\t";
#endif #endif
ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " ;\n\t"; ss << " ;\n\t";
ss << " double fValX = fInx;\n\t"; ss << " double fValX = fInx;\n\t";
ss << " double fValY = fIny;\n\t"; ss << " double fValY = fIny;\n\t";
ss << " fSumX += fValX;\n\t"; ss << " fSumX += fValX;\n\t";
ss << " fSumY += fValY;\n\t"; ss << " fSumY += fValY;\n\t";
ss << " fCount = fCount + 1;\n\t"; ss << " fCount = fCount + 1;\n\t";
ss << "}\n\t"; ss << "}\n\t";
ss << "const double fMeanX = fSumX / fCount;\n\t"; ss << "const double fMeanX = fSumX / fCount;\n\t";
ss << "const double fMeanY = fSumY / fCount;\n\t"; ss << "const double fMeanY = fSumY / fCount;\n\t";
ss << "for(int i=0; i<"<<nCurWindowSize<<"; i++)\n\t"; ss << "for(int i=0; i<"<<nCurWindowSize<<"; i++)\n\t";
ss << "{\n\t"; ss << "{\n\t";
ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " ;\n\t"; ss << " ;\n\t";
ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " ;\n\t"; ss << " ;\n\t";
ss << " const double fValX = fInx;\n\t"; ss << " const double fValX = fInx;\n\t";
ss << " const double fValY = fIny;\n\t"; ss << " const double fValY = fIny;\n\t";
ss << " fSumDeltaXDeltaY += (fValX - fMeanX) * (fValY - fMeanY);\n\t"; ss << " fSumDeltaXDeltaY += (fValX - fMeanX) * (fValY - fMeanY);\n\t";
ss << " fSumSqrDeltaX += (fValX - fMeanX) * (fValX - fMeanX);\n\t"; ss << " fSumSqrDeltaX += (fValX - fMeanX) * (fValX - fMeanX);\n\t";
ss << " fSumSqrDeltaY += (fValY - fMeanY) * (fValY - fMeanY);\n\t"; ss << " fSumSqrDeltaY += (fValY - fMeanY) * (fValY - fMeanY);\n\t";
ss << "}\n\t"; ss << "}\n\t";
ss << "double tmp = ( fSumDeltaXDeltaY / sqrt( fSumSqrDeltaX * fSumSqrDeltaY));\n\t"; ss << "double tmp = ( fSumDeltaXDeltaY / sqrt( fSumSqrDeltaX * fSumSqrDeltaY));\n\t";
ss << "return (tmp * tmp);\n"; ss << "return (tmp * tmp);\n";
ss << "}\n"; ss << "}\n";
} }
virtual std::string BinFuncName(void) const { return "OpRsq"; }
};
}} }}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#ifndef SC_OPENCL_OP_STATISTICAL_HXX
#define SC_OPENCL_OP_STATISTICAL_HXX
#include "opbase.hxx"
namespace sc { namespace opencl {
class OpFisher: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Fisher"; }
};
class OpFisherInv: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "FisherInv"; }
};
class OpGamma: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Gamma"; }
};
class OpCorrel: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Correl"; }
};
class OpNegbinomdist: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "OpNegbinomdist"; }
};
class OpPearson: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "OpPearson"; }
};
class OpGammaLn: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "GammaLn"; }
};
class OpGauss: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Gauss"; }
};
class OpGeoMean: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "GeoMean"; }
};
class OpHarMean: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "HarMean"; }
};
class OpRsq: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "OpRsq"; }
};
}}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -7,16 +7,20 @@ ...@@ -7,16 +7,20 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
#ifndef OPBASE #ifndef SC_OPENCL_OPBASE_HXX
#define OPBASE #define SC_OPENCL_OPBASE_HXX
#include "formulagroup.hxx" #include "formulagroup.hxx"
#include "document.hxx" #include "document.hxx"
#include "formulacell.hxx" #include "formulacell.hxx"
#include "tokenarray.hxx" #include "tokenarray.hxx"
#include "compiler.hxx" #include "compiler.hxx"
#include "interpre.hxx" #include "interpre.hxx"
#include "formula/vectortoken.hxx"
#include "clcc/clew.h"
#include<list> #include <list>
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include <algorithm> #include <algorithm>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment