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,\
$(eval $(call gb_Library_add_exception_objects,scopencl,\
sc/source/core/opencl/formulagroupcl \
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 \
))
......
......@@ -18,10 +18,10 @@
#include "openclwrapper.hxx"
#include "op_financial.cxx"
#include "op_database.cxx"
#include "op_math.cxx"
#include "op_statistical.cxx"
#include "op_financial.hxx"
#include "op_database.hxx"
#include "op_math.hxx"
#include "op_statistical.hxx"
#include "formulagroupcl_public.hxx"
#include "formulagroupcl_finacial.hxx"
......
......@@ -7,26 +7,12 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#ifndef OP_DATABASE
#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;
#include "op_database.hxx"
namespace sc { namespace opencl {
}}
#endif
/* 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 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#ifndef OP_MATH
#define OP_MATH
#include "op_math.hxx"
#include "formulagroup.hxx"
#include "document.hxx"
#include "formulacell.hxx"
#include "tokenarray.hxx"
#include "compiler.hxx"
#include "interpre.hxx"
#include "opbase.hxx"
#include<list>
#include <list>
#include <iostream>
#include <sstream>
#include <algorithm>
......@@ -25,74 +24,65 @@
using namespace formula;
namespace sc { namespace opencl {
class OpCos: public Normal
{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
void OpCos::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();
const formula::SingleVectorRefToken*tmpCurDVR= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur);
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{
if (i)
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";
if (i)
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
ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t";
ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t";
#endif
ss << "double tmp=cos(arg0);\n\t";
ss << "return tmp;\n";
ss << "}";
}
virtual std::string BinFuncName(void) const { return "Cos"; }
};
ss << "double tmp=cos(arg0);\n\t";
ss << "return tmp;\n";
ss << "}";
}
class OpCsc: public Normal
void OpCsc::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
public:
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();
const formula::SingleVectorRefToken*tmpCurDVR= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur);
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{
if (i)
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";
if (i)
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
ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t";
ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t";
#endif
ss << "double tmp=1/sin(arg0);\n\t";
ss << "return tmp;\n";
ss << "}";
}
virtual std::string BinFuncName(void) const { return "Csc"; }
};
ss << "double tmp=1/sin(arg0);\n\t";
ss << "return tmp;\n";
ss << "}";
}
}}
#endif
/* 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 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#ifndef OP_STATISTICAL
#define OP_STATISTICAL
#include "op_statistical.hxx"
#include "formulagroup.hxx"
#include "document.hxx"
#include "formulacell.hxx"
#include "tokenarray.hxx"
#include "compiler.hxx"
#include "interpre.hxx"
#include "opbase.hxx"
#include<list>
#include <list>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <memory>
using namespace formula;
namespace sc { namespace opencl {
class OpFisher:public Normal{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments)
void OpFisher::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();
const formula::SingleVectorRefToken*tmpCurDVR=
dynamic_cast<const formula::SingleVectorRefToken *>(tmpCur);
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{
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";
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";
#ifdef ISNAN
ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t";
ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t";
#endif
ss << "double tmp=atanh(arg0);\n\t";
ss << "return tmp;\n";
ss << "}\n";
}
virtual std::string BinFuncName(void) const { return "Fisher"; }
};
ss << "double tmp=atanh(arg0);\n\t";
ss << "return tmp;\n";
ss << "}\n";
}
class OpFisherInv:public Normal{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments)
void OpFisherInv::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();
const formula::SingleVectorRefToken*tmpCurDVR= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur);
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{
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";
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";
#ifdef ISNAN
ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t";
ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t";
#endif
ss << "double tmp=tanh(arg0);\n\t";
ss << "return tmp;\n";
ss << "}\n";
ss << "double tmp=tanh(arg0);\n\t";
ss << "return tmp;\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{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments)
void OpCorrel::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;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{
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";
if (i)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
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)
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 << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{
if (i)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
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";
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
ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
ss << "arg0 = 0.0;\n\t\t\t";
ss << "arg1 = 0.0;\n\t\t\t";
ss << "--cnt;\n\t\t";
ss << "}\n\t\t";
ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
ss << "arg0 = 0.0;\n\t\t\t";
ss << "arg1 = 0.0;\n\t\t\t";
ss << "--cnt;\n\t\t";
ss << "}\n\t\t";
#endif
ss << "++cnt;\n\t\t";
ss << "vXSum += arg0;\n\t\t";
ss << "vYSum += arg1;\n\t";
ss << "}\n\t";
} else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) {
ss << "0; i < gid0 + " << nCurWindowSizeX << "; i++) {\n\t\t";
ss << "arg0 = " << vSubArguments[0]
->GenSlidingWindowDeclRef() << ";\n\t\t";
ss << "arg1 = " << vSubArguments[1]
->GenSlidingWindowDeclRef() << ";\n\t\t";
ss << "++cnt;\n\t\t";
ss << "vXSum += arg0;\n\t\t";
ss << "vYSum += arg1;\n\t";
ss << "}\n\t";
} else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) {
ss << "0; i < gid0 + " << nCurWindowSizeX << "; i++) {\n\t\t";
ss << "arg0 = " << vSubArguments[0]
->GenSlidingWindowDeclRef() << ";\n\t\t";
ss << "arg1 = " << vSubArguments[1]
->GenSlidingWindowDeclRef() << ";\n\t\t";
#ifdef ISNAN
ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
ss << "arg0 = 0.0;\n\t\t\t";
ss << "arg1 = 0.0;\n\t\t\t";
ss << "--cnt;\n\t\t";
ss << "}\n\t\t";
ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
ss << "arg0 = 0.0;\n\t\t\t";
ss << "arg1 = 0.0;\n\t\t\t";
ss << "--cnt;\n\t\t";
ss << "}\n\t\t";
#endif
ss << "++cnt;\n\t\t";
ss << "vXSum += arg0;\n\t\t";
ss << "vYSum += arg1;\n\t";
ss << "}\n\t";
}
else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t";
ss << "arg0 = " << vSubArguments[0]
->GenSlidingWindowDeclRef() << ";\n\t\t";
ss << "arg1 = " << vSubArguments[1]
->GenSlidingWindowDeclRef() << ";\n\t\t";
ss << "++cnt;\n\t\t";
ss << "vXSum += arg0;\n\t\t";
ss << "vYSum += arg1;\n\t";
ss << "}\n\t";
}
else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t";
ss << "arg0 = " << vSubArguments[0]
->GenSlidingWindowDeclRef() << ";\n\t\t";
ss << "arg1 = " << vSubArguments[1]
->GenSlidingWindowDeclRef() << ";\n\t\t";
#ifdef ISNAN
ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
ss << "arg0 = 0.0;\n\t\t\t";
ss << "arg1 = 0.0;\n\t\t\t";
ss << "--cnt;\n\t\t";
ss << "}\n\t\t";
ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
ss << "arg0 = 0.0;\n\t\t\t";
ss << "arg1 = 0.0;\n\t\t\t";
ss << "--cnt;\n\t\t";
ss << "}\n\t\t";
#endif
ss << "++cnt;\n\t\t";
ss << "vXSum += arg0;\n\t\t";
ss << "vYSum += arg1;\n\t";
ss << "}\n\t";
} else {
ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t";
ss << "arg0 = " << vSubArguments[0]
->GenSlidingWindowDeclRef() << ";\n\t\t";
ss << "arg1 = " << vSubArguments[1]
->GenSlidingWindowDeclRef() << ";\n\t\t";
ss << "++cnt;\n\t\t";
ss << "vXSum += arg0;\n\t\t";
ss << "vYSum += arg1;\n\t";
ss << "}\n\t";
} else {
ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t";
ss << "arg0 = " << vSubArguments[0]
->GenSlidingWindowDeclRef() << ";\n\t\t";
ss << "arg1 = " << vSubArguments[1]
->GenSlidingWindowDeclRef() << ";\n\t\t";
#ifdef ISNAN
ss << "if(isNan(arg0) || isNan(arg1) || (i + gid0 >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i + gid0 >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
ss << "arg0 = 0.0;\n\t\t\t";
ss << "arg1 = 0.0;\n\t\t\t";
ss << "--cnt;\n\t\t";
ss << "}\n\t\t";
ss << "if(isNan(arg0) || isNan(arg1) || (i + gid0 >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i + gid0 >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
ss << "arg0 = 0.0;\n\t\t\t";
ss << "arg1 = 0.0;\n\t\t\t";
ss << "--cnt;\n\t\t";
ss << "}\n\t\t";
#endif
ss << "++cnt;\n\t\t";
ss << "vXSum += arg0;\n\t\t";
ss << "vYSum += arg1;\n\t";
ss << "}\n\t";
}
ss << "if(cnt < 1) {\n\t\t";
ss << "return DBL_MIN;\n\t";
ss << "++cnt;\n\t\t";
ss << "vXSum += arg0;\n\t\t";
ss << "vYSum += arg1;\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 << "vXSum = 0.0;\n\t\t";
ss << "vYSum = 0.0;\n\t\t";
ss << "for (int i = ";
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";
}
ss << "if(cnt < 1) {\n\t\t";
ss << "return DBL_MIN;\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 << "vXSum = 0.0;\n\t\t";
ss << "vYSum = 0.0;\n\t\t";
ss << "for (int i = ";
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
ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
ss << "arg0 = vXMean;\n\t\t\t\t";
ss << "arg1 = vYMean;\n\t\t\t";
ss << "}\n\t\t\t";
ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
ss << "arg0 = vXMean;\n\t\t\t\t";
ss << "arg1 = vYMean;\n\t\t\t";
ss << "}\n\t\t\t";
#endif
ss << "vXSum += pow(arg0 - vXMean, 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 << "}\n\t\t";
} else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) {
ss << "0; i < gid0 + " << nCurWindowSizeX << "; i++) {\n\t\t\t";
ss << "arg0 = " << vSubArguments[0]
->GenSlidingWindowDeclRef() << ";\n\t\t\t";
ss << "arg1 = " << vSubArguments[1]
->GenSlidingWindowDeclRef() << ";\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 << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
ss << "}\n\t\t";
} else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) {
ss << "0; i < gid0 + " << 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
ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
ss << "arg0 = vXMean;\n\t\t\t\t";
ss << "arg1 = vYMean;\n\t\t\t";
ss << "}\n\t\t\t";
ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
ss << "arg0 = vXMean;\n\t\t\t\t";
ss << "arg1 = vYMean;\n\t\t\t";
ss << "}\n\t\t\t";
#endif
ss << "vXSum += pow(arg0 - vXMean, 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 << "}\n\t\t";
} else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
ss << "0; 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";
ss << "vXSum += pow(arg0 - vXMean, 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 << "}\n\t\t";
} else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
ss << "0; 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
ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
ss << "arg0 = vXMean;\n\t\t\t\t";
ss << "arg1 = vYMean;\n\t\t\t";
ss << "}\n\t\t\t";
ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
ss << "arg0 = vXMean;\n\t\t\t\t";
ss << "arg1 = vYMean;\n\t\t\t";
ss << "}\n\t\t\t";
#endif
ss << "vXSum += pow(arg0 - vXMean, 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 << "}\n\t\t";
} else {
ss << "0; 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";
ss << "vXSum += pow(arg0 - vXMean, 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 << "}\n\t\t";
} else {
ss << "0; 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
ss << "if(isNan(arg0) || isNan(arg1) || (i + gid0 >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i + gid0 >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
ss << "arg0 = vXMean;\n\t\t\t\t";
ss << "arg1 = vYMean;\n\t\t\t";
ss << "}\n\t\t\t";
ss << "if(isNan(arg0) || isNan(arg1) || (i + gid0 >= ";
ss << pCurDVRX->GetArrayLength() << ") || (i + gid0 >=";
ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
ss << "arg0 = vXMean;\n\t\t\t\t";
ss << "arg1 = vYMean;\n\t\t\t";
ss << "}\n\t\t\t";
#endif
ss << "vXSum += ((arg0 - vXMean)*(arg0 - vXMean));\n\t\t\t";
ss << "vYSum += ((arg1 - vYMean)*(arg1 - vYMean));\n\t\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 << "vXSum += ((arg0 - vXMean)*(arg0 - vXMean));\n\t\t\t";
ss << "vYSum += ((arg1 - vYMean)*(arg1 - vYMean));\n\t\t\t";
ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\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{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments)
}
void OpNegbinomdist::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;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{
if (i)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
ss << ")\n";
ss << "{\n\t";
ss << "double f,s,p;\n\t";
ss << " int gid0=get_global_id(0);\n\t";
if (i)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
ss << ")\n";
ss << "{\n\t";
ss << "double f,s,p;\n\t";
ss << " int gid0=get_global_id(0);\n\t";
#ifdef ISNAN
FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
const formula::SingleVectorRefToken*tmpCurDVR0= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur0);
FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
const formula::SingleVectorRefToken*tmpCurDVR1= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur1);
FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
const formula::SingleVectorRefToken*tmpCurDVR2= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur2);
ss<< "int buffer_f_len = ";
ss<< tmpCurDVR0->GetArrayLength();
ss << ";\n\t";
ss<< "int buffer_s_len = ";
ss<< tmpCurDVR1->GetArrayLength();
ss << ";\n\t";
ss<< "int buffer_p_len = ";
ss<< tmpCurDVR2->GetArrayLength();
ss << ";\n\t";
FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
const formula::SingleVectorRefToken*tmpCurDVR0= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur0);
FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
const formula::SingleVectorRefToken*tmpCurDVR1= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur1);
FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
const formula::SingleVectorRefToken*tmpCurDVR2= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur2);
ss<< "int buffer_f_len = ";
ss<< tmpCurDVR0->GetArrayLength();
ss << ";\n\t";
ss<< "int buffer_s_len = ";
ss<< tmpCurDVR1->GetArrayLength();
ss << ";\n\t";
ss<< "int buffer_p_len = ";
ss<< tmpCurDVR2->GetArrayLength();
ss << ";\n\t";
#endif
#ifdef ISNAN
ss<<"if((gid0)>=buffer_p_len || isNan(";
ss << vSubArguments[2]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t";
ss<<"p = 0;\n\telse \n\t\t";
ss<<"if((gid0)>=buffer_p_len || isNan(";
ss << vSubArguments[2]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t";
ss<<"p = 0;\n\telse \n\t\t";
#endif
ss << " p = "<<vSubArguments[2]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " p = "<<vSubArguments[2]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
#ifdef ISNAN
ss<<"if((gid0)>=buffer_s_len || isNan(";
ss << vSubArguments[1]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t";
ss<<"s = 0;\n\telse \n\t\t";
ss<<"if((gid0)>=buffer_s_len || isNan(";
ss << vSubArguments[1]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t";
ss<<"s = 0;\n\telse \n\t\t";
#endif
ss << " s = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " s = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
#ifdef ISNAN
ss<<"if((gid0)>=buffer_f_len || isNan(";
ss << vSubArguments[0]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t";
ss<<"f = 0;\n\telse \n\t\t";
ss<<"if((gid0)>=buffer_f_len || isNan(";
ss << vSubArguments[0]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t";
ss<<"f = 0;\n\telse \n\t\t";
#endif
ss << " f = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " double q = 1.0 - p;\n\t";
ss << " double fFactor = pow(p,s);\n\t";
ss << " for(int i=0; i<f; i++)\n\t";
ss << " {\n\t";
ss << " fFactor *= ((double)i+s)/((double)i+1.0)*q;\n\t";
ss << " }\n\t";
ss << " double tmp=fFactor;\n\t";
ss << " return tmp;\n";
ss << "}\n";
}
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)
ss << " f = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " double q = 1.0 - p;\n\t";
ss << " double fFactor = pow(p,s);\n\t";
ss << " for(int i=0; i<f; i++)\n\t";
ss << " {\n\t";
ss << " fFactor *= ((double)i+s)/((double)i+1.0)*q;\n\t";
ss << " }\n\t";
ss << " double tmp=fFactor;\n\t";
ss << " return tmp;\n";
ss << "}\n";
}
void OpPearson::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
FormulaToken* pCur = vSubArguments[1]->GetFormulaToken();
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();
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++)
{
if (i)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
ss << ")\n";
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";
if (i)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
ss << ")\n";
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
FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
const formula::DoubleVectorRefToken*tmpCurDVR0= dynamic_cast<const
formula::DoubleVectorRefToken *>(tmpCur0);
FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
const formula::DoubleVectorRefToken*tmpCurDVR0= dynamic_cast<const
formula::DoubleVectorRefToken *>(tmpCur0);
FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
const formula::DoubleVectorRefToken*tmpCurDVR1= dynamic_cast<const
formula::DoubleVectorRefToken *>(tmpCur1);
FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
const formula::DoubleVectorRefToken*tmpCurDVR1= dynamic_cast<const
formula::DoubleVectorRefToken *>(tmpCur1);
ss<< "int buffer_fInx_len = ";
ss<< tmpCurDVR0->GetArrayLength();
ss << ";\n\t";
ss<< "int buffer_fInx_len = ";
ss<< tmpCurDVR0->GetArrayLength();
ss << ";\n\t";
ss<< "int buffer_fIny_len = ";
ss<< tmpCurDVR1->GetArrayLength();
ss << ";\n\t";
ss<< "int buffer_fIny_len = ";
ss<< tmpCurDVR1->GetArrayLength();
ss << ";\n\t";
#endif
ss << "for(int i=0; i<"<<CurWindowSize<<"; i++)\n\t";
ss << "{\n\t";
ss << "for(int i=0; i<"<<CurWindowSize<<"; i++)\n\t";
ss << "{\n\t";
#ifdef ISNAN
ss<<"if((gid0+i)>=buffer_fInx_len || isNan(";
ss << vSubArguments[0]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t";
ss<<"fInx = 0;\n\telse \n\t";
ss<<"if((gid0+i)>=buffer_fInx_len || isNan(";
ss << vSubArguments[0]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t";
ss<<"fInx = 0;\n\telse \n\t";
#endif
ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
#ifdef ISNAN
ss<<"if((gid0+i)>=buffer_fIny_len || isNan(";
ss << vSubArguments[1]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t";
ss<<"fIny = 0;\n\telse \n\t";
ss<<"if((gid0+i)>=buffer_fIny_len || isNan(";
ss << vSubArguments[1]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t";
ss<<"fIny = 0;\n\telse \n\t";
#endif
ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " double fValX = fInx;\n\t";
ss << " double fValY = fIny;\n\t";
ss << " fSumX += fValX;\n\t";
ss << " fSumY += fValY;\n\t";
ss << " fCount = fCount + 1;\n\t";
ss << "}\n\t";
ss << "const double fMeanX = fSumX / fCount;\n\t";
ss << "const double fMeanY = fSumY / fCount;\n\t";
ss << "for(int i=0; i<"<<CurWindowSize<<"; i++)\n\t";
ss << "{\n\t";
ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " const double fValX = fInx;\n\t";
ss << " const double fValY = fIny;\n\t";
ss << " fSumDeltaXDeltaY += (fValX - fMeanX) * (fValY - fMeanY);\n\t";
ss << " fSumSqrDeltaX += (fValX - fMeanX) * (fValX - fMeanX);\n\t";
ss << " fSumSqrDeltaY += (fValY - fMeanY) * (fValY - fMeanY);\n\t";
ss << "}\n\t";
ss << "double tmp = ( fSumDeltaXDeltaY / ";
ss << "sqrt( fSumSqrDeltaX * fSumSqrDeltaY));\n\t";
ss << "return tmp;\n";
ss << "}\n";
}
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)
{
FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
const formula::SingleVectorRefToken*tmpCurDVR= dynamic_cast<const
ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " double fValX = fInx;\n\t";
ss << " double fValY = fIny;\n\t";
ss << " fSumX += fValX;\n\t";
ss << " fSumY += fValY;\n\t";
ss << " fCount = fCount + 1;\n\t";
ss << "}\n\t";
ss << "const double fMeanX = fSumX / fCount;\n\t";
ss << "const double fMeanY = fSumY / fCount;\n\t";
ss << "for(int i=0; i<"<<CurWindowSize<<"; i++)\n\t";
ss << "{\n\t";
ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " const double fValX = fInx;\n\t";
ss << " const double fValY = fIny;\n\t";
ss << " fSumDeltaXDeltaY += (fValX - fMeanX) * (fValY - fMeanY);\n\t";
ss << " fSumSqrDeltaX += (fValX - fMeanX) * (fValX - fMeanX);\n\t";
ss << " fSumSqrDeltaY += (fValY - fMeanY) * (fValY - fMeanY);\n\t";
ss << "}\n\t";
ss << "double tmp = ( fSumDeltaXDeltaY / ";
ss << "sqrt( fSumSqrDeltaX * fSumSqrDeltaY));\n\t";
ss << "return tmp;\n";
ss << "}\n";
}
void OpGammaLn::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++)
{
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 << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{
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";
#ifdef ISNAN
ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t";
ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t";
#endif
ss << "double tmp=lgamma(arg0);\n\t";
ss << "return tmp;\n";
ss << "}\n";
}
virtual std::string BinFuncName(void) const { return "GammaLn"; }
};
ss << "double tmp=lgamma(arg0);\n\t";
ss << "return tmp;\n";
ss << "}\n";
}
class OpGauss:public Normal{
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments)
void OpGauss::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();
const formula::SingleVectorRefToken*tmpCurDVR= dynamic_cast<const
formula::SingleVectorRefToken *>(tmpCur);
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"(";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{
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";
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";
#ifdef ISNAN
ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t";
ss<< "if(isNan(arg0)||(gid0>=";
ss<<tmpCurDVR->GetArrayLength();
ss<<"))\n\t\t";
ss<<"arg0 = 0;\n\t";
#endif
ss << "double tmp=0.5 *erfc(-arg0 * 0.7071067811865475)-0.5;\n\t";
ss << "return tmp;\n";
ss << "}\n";
}
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)
ss << "double tmp=0.5 *erfc(-arg0 * 0.7071067811865475)-0.5;\n\t";
ss << "return tmp;\n";
ss << "}\n";
}
void OpGeoMean::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
FormulaToken *pCur = vSubArguments[0]->GetFormulaToken();
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();
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++)
{
if (i)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
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";
if (i)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
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
ss<< "if(isNan(arg0)||((gid0+i)>=";
ss<<pCurDVR->GetArrayLength();
ss<<"))\n\t{";
ss<<"length--;\n\t";
ss<<"continue;\n\t}\n\t";
ss<< "if(isNan(arg0)||((gid0+i)>=";
ss<<pCurDVR->GetArrayLength();
ss<<"))\n\t{";
ss<<"length--;\n\t";
ss<<"continue;\n\t}\n\t";
#endif
ss << "nVal += log(arg0);\n\t";
ss <<"}\n\t";
ss<<"tmp = exp(nVal/length);\n\t";
ss << "return tmp;\n";
ss << "}";
}
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)
ss << "nVal += log(arg0);\n\t";
ss <<"}\n\t";
ss<<"tmp = exp(nVal/length);\n\t";
ss << "return tmp;\n";
ss << "}";
}
void OpHarMean::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
FormulaToken *pCur = vSubArguments[0]->GetFormulaToken();
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();
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++)
{
if (i)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
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";
if (i)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
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
ss<< "if(isNan(arg0)||((gid0+i)>=";
ss<<pCurDVR->GetArrayLength();
ss<<"))\n\t{";
ss<<"length--;\n\t";
ss<<"continue;\n\t}\n\t";
ss<< "if(isNan(arg0)||((gid0+i)>=";
ss<<pCurDVR->GetArrayLength();
ss<<"))\n\t{";
ss<<"length--;\n\t";
ss<<"continue;\n\t}\n\t";
#endif
ss << "nVal += (1.0/arg0);\n\t}\n\t";
ss<<"tmp = length/nVal;\n\t";
ss << "return tmp;\n";
ss << "}";
}
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)
ss << "nVal += (1.0/arg0);\n\t}\n\t";
ss<<"tmp = length/nVal;\n\t";
ss << "return tmp;\n";
ss << "}";
}
void OpRsq::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
FormulaToken* pCur = vSubArguments[1]->GetFormulaToken();
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();
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++)
{
if (i)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
ss << ")\n";
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";
if (i)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
ss << ")\n";
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
FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
const formula::DoubleVectorRefToken*tmpCurDVR0= dynamic_cast<const
formula::DoubleVectorRefToken *>(tmpCur0);
FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
const formula::DoubleVectorRefToken*tmpCurDVR1= dynamic_cast<const
formula::DoubleVectorRefToken *>(tmpCur1);
ss<< "int buffer_fInx_len = ";
ss<< tmpCurDVR0->GetArrayLength();
ss << ";\n\t";
ss<< "int buffer_fIny_len = ";
ss<< tmpCurDVR1->GetArrayLength();
ss << ";\n\t";
FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
const formula::DoubleVectorRefToken*tmpCurDVR0= dynamic_cast<const
formula::DoubleVectorRefToken *>(tmpCur0);
FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
const formula::DoubleVectorRefToken*tmpCurDVR1= dynamic_cast<const
formula::DoubleVectorRefToken *>(tmpCur1);
ss<< "int buffer_fInx_len = ";
ss<< tmpCurDVR0->GetArrayLength();
ss << ";\n\t";
ss<< "int buffer_fIny_len = ";
ss<< tmpCurDVR1->GetArrayLength();
ss << ";\n\t";
#endif
ss << "for(int i=0; i<"<<nCurWindowSize<<"; i++)\n\t";
ss << "{\n\t";
ss << "for(int i=0; i<"<<nCurWindowSize<<"; i++)\n\t";
ss << "{\n\t";
#ifdef ISNAN
ss<<"if((gid0+i)>=buffer_fInx_len || isNan(";
ss << vSubArguments[0]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t";
ss<<"fInx = 0;\n\telse \n\t";
ss<<"if((gid0+i)>=buffer_fInx_len || isNan(";
ss << vSubArguments[0]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t";
ss<<"fInx = 0;\n\telse \n\t";
#endif
ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
#ifdef ISNAN
ss<<"if((gid0+i)>=buffer_fIny_len || isNan(";
ss << vSubArguments[1]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t";
ss<<"fIny = 0;\n\telse \n\t";
ss<<"if((gid0+i)>=buffer_fIny_len || isNan(";
ss << vSubArguments[1]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t";
ss<<"fIny = 0;\n\telse \n\t";
#endif
ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " double fValX = fInx;\n\t";
ss << " double fValY = fIny;\n\t";
ss << " fSumX += fValX;\n\t";
ss << " fSumY += fValY;\n\t";
ss << " fCount = fCount + 1;\n\t";
ss << "}\n\t";
ss << "const double fMeanX = fSumX / fCount;\n\t";
ss << "const double fMeanY = fSumY / fCount;\n\t";
ss << "for(int i=0; i<"<<nCurWindowSize<<"; i++)\n\t";
ss << "{\n\t";
ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " const double fValX = fInx;\n\t";
ss << " const double fValY = fIny;\n\t";
ss << " fSumDeltaXDeltaY += (fValX - fMeanX) * (fValY - fMeanY);\n\t";
ss << " fSumSqrDeltaX += (fValX - fMeanX) * (fValX - fMeanX);\n\t";
ss << " fSumSqrDeltaY += (fValY - fMeanY) * (fValY - fMeanY);\n\t";
ss << "}\n\t";
ss << "double tmp = ( fSumDeltaXDeltaY / sqrt( fSumSqrDeltaX * fSumSqrDeltaY));\n\t";
ss << "return (tmp * tmp);\n";
ss << "}\n";
}
virtual std::string BinFuncName(void) const { return "OpRsq"; }
};
ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " double fValX = fInx;\n\t";
ss << " double fValY = fIny;\n\t";
ss << " fSumX += fValX;\n\t";
ss << " fSumY += fValY;\n\t";
ss << " fCount = fCount + 1;\n\t";
ss << "}\n\t";
ss << "const double fMeanX = fSumX / fCount;\n\t";
ss << "const double fMeanY = fSumY / fCount;\n\t";
ss << "for(int i=0; i<"<<nCurWindowSize<<"; i++)\n\t";
ss << "{\n\t";
ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " ;\n\t";
ss << " const double fValX = fInx;\n\t";
ss << " const double fValY = fIny;\n\t";
ss << " fSumDeltaXDeltaY += (fValX - fMeanX) * (fValY - fMeanY);\n\t";
ss << " fSumSqrDeltaX += (fValX - fMeanX) * (fValX - fMeanX);\n\t";
ss << " fSumSqrDeltaY += (fValY - fMeanY) * (fValY - fMeanY);\n\t";
ss << "}\n\t";
ss << "double tmp = ( fSumDeltaXDeltaY / sqrt( fSumSqrDeltaX * fSumSqrDeltaY));\n\t";
ss << "return (tmp * tmp);\n";
ss << "}\n";
}
}}
#endif
/* 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 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#ifndef OPBASE
#define OPBASE
#ifndef SC_OPENCL_OPBASE_HXX
#define SC_OPENCL_OPBASE_HXX
#include "formulagroup.hxx"
#include "document.hxx"
#include "formulacell.hxx"
#include "tokenarray.hxx"
#include "compiler.hxx"
#include "interpre.hxx"
#include "formula/vectortoken.hxx"
#include "clcc/clew.h"
#include<list>
#include <list>
#include <iostream>
#include <sstream>
#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