10 #include <muParser/muParser.h>
23 "title" :
"VuoMathExpressionParser",
31 "VuoDictionary_VuoText_VuoReal",
32 "VuoGradientNoiseCommon",
53 message(error.GetMsg())
55 size_t positionIndex = message.find(
" at position ");
56 if (positionIndex != string::npos)
57 message = message.substr(0, positionIndex);
121 return degrees * 0.0174532925;
129 return radians * 57.2957795;
137 return floor(x + .5);
151 static double clamp(
double x,
double minVal,
double maxVal)
153 return MIN(
MAX(x, minVal), maxVal);
159 static double step(
double edge,
double x)
161 return x < edge ? 0 : 1;
167 static double smoothstep(
double edge0,
double edge1,
double x)
169 double t =
clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
170 return t * t * (3.0 - 2.0 * t);
176 static double mix(
double x,
double y,
double a)
178 return x * (1. - a) + y * a;
217 mu::Parser *muParser = (mu::Parser *)p;
219 muParser->DefineConst(
"pi", (
double)3.14159265359);
220 muParser->DefineConst(
"PI", (
double)3.14159265359);
222 muParser->DefineOprt(
"%", fmod, mu::prMUL_DIV, mu::oaLEFT,
true);
225 muParser->DefineFun(
"deg2rad",
deg2rad,
true);
226 muParser->DefineFun(
"rad2deg",
rad2deg,
true);
243 muParser->DefineFun(
"floor", ::floor,
true);
244 muParser->DefineFun(
"ceil", ::ceil,
true);
245 muParser->DefineFun(
"trunc", ::trunc,
true);
248 muParser->DefineFun(
"fract",
fract,
true);
249 muParser->DefineFun(
"clamp",
clamp);
250 muParser->DefineFun(
"step",
step);
251 muParser->DefineFun(
"smoothstep",
smoothstep);
252 muParser->DefineFun(
"mix",
mix);
258 muParser->DefineFun(
"perlin2d",
perlin2d,
true);
259 muParser->DefineFun(
"perlin3d",
perlin3d,
true);
260 muParser->DefineFun(
"perlin4d",
perlin4d,
true);
263 muParser->DefineFun(
"simplex2d",
simplex2d,
true);
264 muParser->DefineFun(
"simplex3d",
simplex3d,
true);
265 muParser->DefineFun(
"simplex4d",
simplex4d,
true);
290 throw mu::ParserError(
"Too many variables");
307 outputVariableNames(outputVariableNames_)
309 this->variableCount = 0;
313 muParser.SetVarFactory(addVariable,
this);
314 muParser.SetExpr(expression);
315 muParser.GetUsedVar();
317 if (! outputVariableNames.empty())
319 string baseName =
"result";
320 if (muParser.GetNumResults() == 1)
322 if (outputVariableNames[0].empty())
323 outputVariableNames[0] = baseName;
327 for (
size_t i = 0; i < outputVariableNames.size(); ++i)
329 if (outputVariableNames[i].empty())
335 oss << baseName << suffix;
338 }
while (find(outputVariableNames.begin(), outputVariableNames.end(), name) != outputVariableNames.end());
339 outputVariableNames[i] = name;
345 for (map<string, size_t>::iterator i = variableNamesAndIndices.begin(); i != variableNamesAndIndices.end(); ++i)
346 if (find(outputVariableNames.begin(), outputVariableNames.end(), i->first) == outputVariableNames.end())
347 inputVariableNames.push_back(i->first);
349 std::sort(inputVariableNames.begin(), inputVariableNames.end());
357 return string(1, mu::Parser().GetArgSep());
369 vector<string> expressionParts;
371 size_t partStartIndex, searchStartIndex, assignmentIndex;
372 partStartIndex = searchStartIndex = 0;
373 while ((assignmentIndex = expression.find(
"=", searchStartIndex)) != string::npos)
375 char charBefore = expression[assignmentIndex - 1];
376 char charAfter = expression[assignmentIndex + 1];
377 if (charBefore ==
'<' || charBefore ==
'>' || charBefore ==
'!')
378 searchStartIndex = assignmentIndex + 1;
379 else if (charAfter ==
'=')
380 searchStartIndex = assignmentIndex + 2;
383 string part = expression.substr(partStartIndex, assignmentIndex - partStartIndex);
384 expressionParts.push_back(part);
385 partStartIndex = searchStartIndex = assignmentIndex + 1;
389 string part = expression.substr(partStartIndex);
390 expressionParts.push_back(part);
392 return expressionParts;
404 if (parser.
muParser.GetNumResults() > 1)
411 catch (mu::ParserError &e)
418 if (expressionParts.size() > 2)
431 for (
unsigned long i = 1; i <= count; ++i)
450 vector<string> &inputVariableNames,
string &outputVariableName,
455 if (expressionParts.size() > 1)
457 string outputExpression = expressionParts.front();
465 if (! outputVariableName.empty() && find(inputVariableNames.begin(), inputVariableNames.end(), outputVariableName) != inputVariableNames.end())
478 vector<string> &inputVariableNames, vector<string> &outputVariableNames,
481 map<string, vector<unsigned long> > expressionsForInputVariable;
482 map<string, vector<unsigned long> > expressionsForOutputVariable;
485 for (
unsigned long i = 1; i <= count; ++i)
489 vector<string> currInputVariableNames;
490 string currOutputVariableName;
499 for (vector<string>::iterator j = currInputVariableNames.begin(); j != currInputVariableNames.end(); ++j)
500 expressionsForInputVariable[*j].push_back(i);
501 expressionsForOutputVariable[currOutputVariableName].push_back(i);
503 inputVariableNames.insert(inputVariableNames.end(), currInputVariableNames.begin(), currInputVariableNames.end());
505 if (! currOutputVariableName.empty() && find(outputVariableNames.begin(), outputVariableNames.end(), currOutputVariableName) != outputVariableNames.end())
512 outputVariableNames.push_back(currOutputVariableName);
515 set<string> allVariableNames;
516 allVariableNames.insert(inputVariableNames.begin(), inputVariableNames.end());
517 allVariableNames.insert(outputVariableNames.begin(), outputVariableNames.end());
518 for (set<string>::iterator i = allVariableNames.begin(); i != allVariableNames.end(); ++i)
520 if (find(inputVariableNames.begin(), inputVariableNames.end(), *i) != inputVariableNames.end() &&
521 find(outputVariableNames.begin(), outputVariableNames.end(), *i) != outputVariableNames.end())
525 vector<unsigned long> expressionsForVariable( expressionsForInputVariable[*i].size() + expressionsForOutputVariable[*i].size() );
526 merge( expressionsForInputVariable[*i].begin(), expressionsForInputVariable[*i].end(),
527 expressionsForOutputVariable[*i].begin(), expressionsForOutputVariable[*i].end(),
528 expressionsForVariable.begin() );
529 vector<unsigned long>::iterator endIter = unique( expressionsForVariable.begin(), expressionsForVariable.end() );
530 expressionsForVariable.resize( distance( expressionsForVariable.begin(), endIter ) );
560 vector<string> inputVariableNames;
561 string outputVariableName;
565 vector<string> outputVariableNames(1, outputVariableName);
584 vector<string> inputVariableNames;
585 vector<string> outputVariableNames;
590 string joinedExpression;
593 for (
unsigned long i = 1; i <= count; ++i)
596 joinedExpression += assignmentExpression;
598 joinedExpression += separator;
617 return inputVariables;
633 return outputVariables;
654 for (
int i = 0; i < inputCount; ++i)
659 size_t index = variableIter->second;
665 double *results = mi->
muParser.Eval(outputCount);
673 for (
int i = 0; i < outputCount; ++i)
677 valuesArray[i] = results[i];
699 for (
int i = 0; i < inputCount; ++i)
704 size_t index = variableIter->second;
735 for (
unsigned long i = 0; i < xValueCount; ++i)
738 *xLC = xValueReals[i];
740 *xUC = xValueReals[i];
747 resultReals[i] = mi->
muParser.Eval(outputCount)[0];