12#include <rtl/string.hxx>
15#include <unordered_map>
24 const char* m, std::string fn,
int ln ) :
25 mMessage(
m), mFile(
std::move(fn)), mLineNumber(ln) {}
28 mFunction(
std::move(function)), mError(error), mFile(
std::move(file)), mLineNumber(
line)
38 mFile(
std::move(fn)), mLineNumber(ln) {}
41 mParameterCount(parameterCount), mFile(
std::move(file)), mLineNumber(ln) {}
49 return std::string(
"");
55 return std::string(
"");
73 return std::string(
"");
112 assert(
string !=
nullptr );
113 if( string->length == 0 )
116 stringIdsMap =
new std::unordered_map<const rtl_uString*, int>;
117 std::unordered_map<const rtl_uString*, int>::iterator it =
stringIdsMap->find(
string );
155 ss <<
"__global double *" <<
mSymName;
187 return pCurDVR->GetRefRowSize();
202 return std::string(
"");
232 assert( arg <
int( vSubArguments.size()));
233 FormulaToken *token = vSubArguments[arg]->GetFormulaToken();
234 if( token ==
nullptr )
242 ss <<
" double " <<
name <<
" = NAN;\n";
244 ss <<
" bool " <<
name <<
"_is_string = false;\n";
248 ss <<
" " <<
name <<
" = ";
249 ss << vSubArguments[arg]->GenSlidingWindowDeclRef(
true ) <<
";\n";
252 ss <<
" " <<
name <<
"_is_string = ";
253 ss << vSubArguments[arg]->GenIsString(
true ) <<
";\n";
259 ss <<
" if( isnan( " <<
name <<
" ))\n";
260 ss <<
" " <<
name <<
" = 0;\n";
271 ss <<
" double " <<
name <<
" = " << token->
GetDouble() <<
";\n";
273 ss <<
" bool " <<
name <<
"_is_string = "
274 << vSubArguments[arg]->GenIsString() <<
";\n";
282 ss <<
" double " <<
name <<
" = 0.0;\n";
284 ss <<
" bool " <<
name <<
"_is_string = "
285 << vSubArguments[arg]->GenIsString() <<
";\n";
292 ss <<
" double " <<
name <<
" = ";
293 ss << vSubArguments[arg]->GenSlidingWindowDeclRef() <<
";\n";
295 ss <<
" bool " <<
name <<
"_is_string = "
296 << vSubArguments[arg]->GenIsString() <<
";\n";
303 OString buf =
"arg" + OString::number(arg);
304 GenerateArg( buf.getStr(), arg, vSubArguments, ss, empty, generateType );
310 if( arg <
int(vSubArguments.size()))
313 ss <<
" double " <<
name <<
" = " << def <<
";\n";
319 assert( firstArg >= 0 );
320 assert( firstArg <= lastArg );
321 assert( lastArg <
int( vSubArguments.size()));
322 for(
int i = firstArg;
327 if( token ==
nullptr )
336 ss <<
" double arg = ";
337 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
342 ss <<
" if( isnan( arg ))\n";
348 ss <<
" if( isnan( arg ))\n";
349 ss <<
" continue;\n";
361 ss <<
" double arg = ";
362 ss << vSubArguments[
i]->GenSlidingWindowDeclRef() <<
";\n";
366 ss <<
" if( isnan( arg ))\n";
374 ss <<
" if( !isnan( arg ))\n";
385 ss <<
" double arg = " << token->
GetDouble() <<
";\n";
393 ss <<
" double arg = 0.0;\n";
403 ss <<
" double arg = ";
404 ss << vSubArguments[
i]->GenSlidingWindowDeclRef() <<
";\n";
426 assert( arg1 >= 0 && arg1 <
int (vSubArguments.size()));
427 assert( arg2 >= 0 && arg2 <
int (vSubArguments.size()));
428 assert( arg1 != arg2 );
429 FormulaToken *token1 = vSubArguments[arg1]->GetFormulaToken();
430 if( token1 ==
nullptr )
432 FormulaToken *token2 = vSubArguments[arg2]->GetFormulaToken();
433 if( token2 ==
nullptr )
448 if(nCurWindowSize1 != nCurWindowSize2)
475 ss <<
" double arg1 = ";
476 ss << vSubArguments[arg1]->GenSlidingWindowDeclRef(!checkBounds) <<
";\n";
477 ss <<
" double arg2 = ";
478 ss << vSubArguments[arg2]->GenSlidingWindowDeclRef(!checkBounds) <<
";\n";
482 ss <<
" if( isnan( arg1 ))\n";
483 ss <<
" arg1 = 0;\n";
484 ss <<
" if( isnan( arg2 ))\n";
485 ss <<
" arg2 = 0;\n";
490 ss <<
" if( isnan( arg1 ) || isnan( arg2 ))\n";
491 ss <<
" continue;\n";
501 assert( arg >= 0 && arg <
int (vSubArguments.size()));
502 FormulaToken *token = vSubArguments[arg]->GetFormulaToken();
503 if( token ==
nullptr )
509 ss <<
" double " <<
name <<
" = NAN;\n";
512 ss <<
" int i = 0;\n";
517 ss <<
" " <<
name <<
" = " << vSubArguments[arg]->GenSlidingWindowDeclRef(
true) <<
";\n";
522 ss <<
" if( isnan( " <<
name <<
" ))\n";
523 ss <<
" " <<
name <<
" = 0;\n";
537 std::string startDiff;
538 if( firstElementDiff )
539 startDiff = std::string(
" + " ) + firstElementDiff;
540 ss <<
" for (int i = ";
544 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
550 ss <<
" && i < gid0+" << nCurWindowSize <<
"; i++)\n";
555 ss <<
"0" << startDiff <<
"; i + gid0 < " << pDVR->
GetArrayLength();
556 ss <<
" && i < " << nCurWindowSize <<
"; i++)\n";
561 ss <<
"0" << startDiff <<
"; i < " << pDVR->
GetArrayLength() <<
"; i++)\n";
569 ss <<
"\ndouble " << sSymName;
571 for (
size_t i = 0;
i < vSubArguments.size();
i++)
575 vSubArguments[
i]->GenSlidingWindowDecl(ss);
585 ss <<
"double tmp = " <<
GetBottom() <<
";\n\t";
586 ss <<
"int gid0 = get_global_id(0);\n\t";
588 std::vector<std::string> argVector;
589 for (
size_t i = 0;
i < vSubArguments.size();
i++)
590 argVector.push_back(vSubArguments[
i]->GenSlidingWindowDeclRef());
591 ss <<
Gen(argVector);
593 ss <<
"return tmp;\n";
600 for (
size_t i = 0;
i < vSubArguments.size();
i++)
612 if (vSubArguments[
i]->GetFormulaToken()->GetType() ==
617 ss <<
" if(singleIndex>=";
621 ss << vSubArguments[
i]->GenSlidingWindowDeclRef(
true);
625 ss <<
"=0;\n else \n";
629 ss << vSubArguments[
i]->GenSlidingWindowDeclRef(
true);
632 if (vSubArguments[
i]->GetFormulaToken()->GetType() ==
637 ss <<
" if(doubleIndex>=";
641 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
645 ss <<
"=0;\n else \n";
649 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
653 vSubArguments[
i]->GetFormulaToken()->GetOpCode() !=
ocPush)
657 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
661 ss <<
"=0;\n else \n";
665 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
673 SubArguments& vSubArguments,
int argumentNum,
const std::string& p )
681 vSubArguments[
i]->GenDeclRef(ss);
689 vSubArguments[
i]->GenDeclRef(ss);
690 if (vSubArguments[
i]->GetFormulaToken()->GetType() ==
692 ss <<
"[" <<
p.c_str() <<
"]";
693 else if (vSubArguments[
i]->GetFormulaToken()->GetType() ==
695 ss <<
"[get_group_id(1)]";
702 ss <<
" int k = gid0;\n";
703 for (
size_t i = 0;
i < vSubArguments.size();
i++)
716 ss <<
" loop = (" << nCurWindowSize <<
" - gid0)/";
717 ss << unrollSize <<
";\n";
721 ss <<
" loop = (" << nCurWindowSize <<
" + gid0)/";
722 ss << unrollSize <<
";\n";
727 ss <<
" loop = " << nCurWindowSize <<
"/" << unrollSize <<
";\n";
730 ss <<
" for ( int j = 0;j< loop; j++)\n";
735 ss <<
"gid0 + j * " << unrollSize <<
";\n";
739 ss <<
"j * " << unrollSize <<
";\n";
744 ss <<
" int doubleIndex = i+gid0;\n";
748 ss <<
" int doubleIndex = i;\n";
751 for (
int j = 0; j < unrollSize; j++)
753 ss << unrollstr.str();
755 ss <<
"doubleIndex++;\n";
758 ss <<
" for (int i = ";
761 ss <<
"gid0 + loop *" << unrollSize <<
"; i < ";
762 ss << nCurWindowSize <<
"; i++)\n";
766 ss <<
"0 + loop *" << unrollSize <<
"; i < gid0+";
767 ss << nCurWindowSize <<
"; i++)\n";
771 ss <<
"0 + loop *" << unrollSize <<
"; i < ";
772 ss << nCurWindowSize <<
"; i++)\n";
777 ss <<
" int doubleIndex = i+gid0;\n";
781 ss <<
" int doubleIndex = i;\n";
783 ss << unrollstr.str();
788 const std::string& sSymName,
SubArguments& vSubArguments )
792 ss <<
"double tmp = " <<
GetBottom() <<
";\n";
793 ss <<
"int gid0 = get_global_id(0);\n";
795 ss <<
"int nCount = 0;\n";
796 ss <<
"double tmpBottom;\n";
797 unsigned i = vSubArguments.size();
803 NR->GenReductionLoopHeader(ss, needBody);
810 NRS->GenReductionLoopHeader(ss, needBody);
817 bool bNeedBody =
false;
818 PNR->GenReductionLoopHeader(ss,
mnResultSize, bNeedBody);
826 SR->GenReductionLoopHeader(ss, needBody);
839 if (
ocPush == vSubArguments[
i]->GetFormulaToken()->GetOpCode())
843 ss <<
" tmpBottom = " <<
GetBottom() <<
";\n";
848 ss << vSubArguments[
i]->GenSlidingWindowDeclRef();
851 ss <<
" return 0;\n";
855 ss <<
Gen2(
"tmpBottom",
"tmp") <<
";\n";
860 ss <<
Gen2(vSubArguments[
i]->GenSlidingWindowDeclRef(),
"tmp");
866 ss <<
Gen2(vSubArguments[
i]->GenSlidingWindowDeclRef(),
"tmp");
874 " return CreateDoubleError(DivisionByZero);\n";
881 ss <<
"/(double)nCount";
static void CheckSubArgumentIsNan2(outputstream &ss, SubArguments &vSubArguments, int argumentNum, const std::string &p)
static void CheckSubArgumentIsNan(outputstream &ss, SubArguments &vSubArguments, int argumentNum)
static void GenTmpVariables(outputstream &ss, const SubArguments &vSubArguments)
static void UnrollDoubleVector(outputstream &ss, const outputstream &unrollstr, const formula::DoubleVectorRefToken *pCurDVR, int nCurWindowSize)
static void CheckAllSubArgumentIsNan(outputstream &ss, SubArguments &vSubArguments)
(Partially) abstract base class for an operand
virtual std::string GenStringSlidingWindowDeclRef(bool=false) const
When Mix, it will be called.
static int GetStringId(const rtl_uString *string)
virtual void DumpInlineFun(std::set< std::string > &, std::set< std::string > &) const
virtual std::string DumpOpName() const
formula::FormulaToken * GetFormulaToken() const
virtual bool NeedParallelReduction() const
virtual void GenDeclRef(outputstream &ss) const
Generate use/references to the argument.
const std::string & GetName() const
virtual void GenSlidingWindowFunction(outputstream &)
static void ClearStringIds()
DynamicKernelArgument(const DynamicKernelArgument &)=delete
delete copy constructor
FormulaTreeNodeRef mFormulaTree
virtual std::string GenDoubleSlidingWindowDeclRef(bool=false) const
When Mix, it will be called.
Handling a Double Vector that is used as a sliding window input to either a sliding window average or...
InvalidParameterCount(int parameterCount, std::string file, int ln)
virtual void GenSlidingWindowFunction(outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments) override
virtual std::string GetBottom()
virtual bool ZeroReturnZero()
virtual std::string Gen2(const std::string &, const std::string &) const
static std::string Gen(std::vector< std::string > &)
virtual bool takeString() const =0
virtual std::string BinFuncName() const
virtual bool forceStringsToZero() const
OpenCLError(std::string function, cl_int error, std::string file, int line)
Handling a Double Vector that is used as a sliding window input Performs parallel reduction based on ...
virtual bool isMinOrMax() const
virtual void GenSlidingWindowFunction(outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments) override
virtual bool isAverage() const
virtual bool HandleNaNArgument(outputstream &, unsigned, SubArguments &) const
void GenerateArg(const char *name, int arg, SubArguments &vSubArguments, outputstream &ss, EmptyArgType empty=EmptyIsZero, GenerateArgTypeType generateType=DoNotGenerateArgType)
static void GenerateDoubleVectorLoopHeader(outputstream &ss, const formula::DoubleVectorRefToken *pDVR, const char *firstElementDiff)
static void GenerateRangeArgElement(const char *name, int arg, const char *element, SubArguments &vSubArguments, outputstream &ss, EmptyArgType empty)
static void GenerateRangeArg(int arg, SubArguments &vSubArguments, outputstream &ss, EmptyArgType empty, const char *code)
void GenerateArgWithDefault(const char *name, int arg, double def, SubArguments &vSubArguments, outputstream &ss, EmptyArgType empty=EmptyIsZero)
void GenerateFunctionDeclaration(const std::string &sSymName, SubArguments &vSubArguments, outputstream &ss)
static void GenerateRangeArgPair(int arg1, int arg2, SubArguments &vSubArguments, outputstream &ss, EmptyArgType empty, const char *code, const char *firstElementDiff=nullptr)
static void GenerateRangeArgs(int firstArg, int lastArg, SubArguments &vSubArguments, outputstream &ss, EmptyArgType empty, const char *code)
std::vector< DynamicKernelArgumentRef > SubArguments
UnhandledToken(const char *m, std::string fn, int ln)
Unhandled(std::string fn, int ln)
VectorRefStringsToZero(const ScCalcConfig &config, const std::string &s, const FormulaTreeNodeRef &ft, int index=0)
Holds an input (read-only) argument reference to a SingleVectorRef.
VectorRef(const ScCalcConfig &config, const std::string &s, const FormulaTreeNodeRef &ft, int index=0)
virtual bool NeedParallelReduction() const override
virtual void GenSlidingWindowDecl(outputstream &ss) const override
When declared as input to a sliding window function.
virtual std::string GenSlidingWindowDeclRef(bool=false) const override
When referenced in a sliding window function.
virtual void GenDecl(outputstream &ss) const override
Generate declaration.
const std::string & GetName() const
virtual void DumpInlineFun(std::set< std::string > &, std::set< std::string > &) const override
cl_mem GetCLBuffer() const
virtual std::string DumpOpName() const override
virtual size_t GetWindowSize() const override
virtual ~VectorRef() override
virtual void GenSlidingWindowFunction(outputstream &) override
#define SAL_WARN_IF(condition, area, stream)
const char * errorString(cl_int nError)
static std::unordered_map< const rtl_uString *, int > * stringIdsMap
std::shared_ptr< FormulaTreeNode > FormulaTreeNodeRef
css::uno::Reference< css::linguistic2::XProofreadingIterator > get(css::uno::Reference< css::uno::XComponentContext > const &context)
Configuration options for formula interpreter.