32 std::vector<double>
val;
33 void eval(
double *result)
override
35 for (
int i = 0; i <
type().
dim(); i++)
38 void eval(
const char **)
override
54 const char *
val{
nullptr};
55 void eval(
double *)
override
59 void eval(
const char **result)
override
74 std::set<KSeExpr::DExpression *> ret;
76 std::set<KSeExpr::DExpression *> workList = gv->
users;
77 while (!workList.empty()) {
89 std::set<KSeExpr::DExpression *> ret;
91 std::set<KSeExpr::DExpression *> workList;
92 workList.insert(expr);
93 while (!workList.empty()) {
103 std::set<KSeExpr::DExpression *> tmpOperandExprs;
104 std::set<KSeExpr::GlobalVal *> tmpOperandVars;
137 if (operandExpr->name() ==
name) {
138 tmpOperandExprs.insert(operandExpr);
139 operandExpr->val->users.insert(
const_cast<DExpression *
>(
this));
140 return operandExpr->val;
145 if (operandVar->varName ==
name) {
146 tmpOperandVars.insert(operandVar);
147 operandVar->users.insert(
const_cast<DExpression *
>(
this));
159 const double *ret =
evalFP();
161 fpVal->
val.assign(ret, ret + fpVal->val.size());
176 delete AllExternalVar;
181 std::pair<std::set<GlobalVal *>::iterator,
bool> ret;
195 std::pair<std::set<DExpression *>::iterator,
bool> ret;
203 auto initSize =
static_cast<unsigned>(thisvar->
users.size());
207 std::set<DExpression *> ret = getAffectedExpr(thisvar);
218 auto *thisvar =
dynamic_cast<GlobalFP *
>(*handle);
219 assert(thisvar &&
"set value to variable with incompatible types.");
221 assert(dim == thisvar->val.size());
222 for (
unsigned i = 0; i < dim; ++i)
223 thisvar->val[i] = values[i];
231 auto *thisvar =
dynamic_cast<GlobalStr *
>(*handle);
232 assert(thisvar &&
"set value to variable with incompatible types.");
233 thisvar->val = values;
238 auto *thisvar =
dynamic_cast<GlobalFP *
>(*handle);
239 assert(thisvar &&
"set value to variable with incompatible types.");
241 assert(dim == thisvar->val.size());
242 for (
unsigned i = 0; i < dim; ++i)
243 thisvar->val[i] = values[i];
246 std::set<DExpression *> ret = getAffectedExpr(thisvar);
253 auto *thisvar =
dynamic_cast<GlobalStr *
>(*handle);
254 assert(thisvar &&
"set value to variable with incompatible types.");
255 thisvar->val = values;
258 std::set<DExpression *> ret = getAffectedExpr(thisvar);
267 ret &= AllExpr->isValid();
276 std::set<DExpression *> all = getTransitiveOperandExpr(de);
279 std::vector<DExpression *>::iterator it;
281 std::vector<DExpression *> ret1(all.size());
282 it = std::set_intersection(all.begin(), all.end(),
exprToEval.begin(),
exprToEval.end(), ret1.begin());
283 ret1.resize(it - ret1.begin());
285 std::vector<DExpression *> ret2(ret1.size());
286 it = std::set_difference(ret1.begin(), ret1.end(),
exprEvaled.begin(),
exprEvaled.end(), ret2.begin());
287 ret2.resize(it - ret2.begin());
292 return std::make_pair(eh, ret2);
298 for (
auto & I : eeh.second)
301 auto *thisvar =
dynamic_cast<GlobalFP *
>((*eeh.first)->val);
311 for (
auto & I : eeh.second)
314 auto *thisvar =
dynamic_cast<GlobalStr *
>((*eeh.first)->val);
const std::string & name() const
std::set< GlobalVal * > operandVars
std::set< DExpression * > operandExprs
ExprVarRef * resolveVar(const std::string &name) const override
DExpression(const std::string &varName, Expressions &context, const std::string &e, const ExprType &type=ExprType().FP(3), EvaluationStrategy be=defaultEvaluationStrategy)
bool isFP() const
Direct is predicate checks.
abstract class for implementing variable references
virtual ExprType type() const
returns (current) type
void addError(const ErrorCode error, const std::vector< std::string > ids, const int startPos, const int endPos) const
const double * evalFP(VarBlock *varBlock=nullptr) const
void prepIfNeeded() const
EvaluationStrategy
Types of evaluation strategies that are available.
const char * evalStr(VarBlock *varBlock=nullptr) const
ExprType _desiredReturnType
std::set< DExpression * > exprEvaled
void setLoopVariable(VariableSetHandle handle, double *values, unsigned dim)
std::set< DExpression * > AllExprs
const std::vector< double > & evalFP(ExprEvalHandle eeh)
std::set< GlobalVal * > AllExternalVars
std::set< DExpression * > exprToEval
VariableHandle addExternalVariable(const std::string &variableName, ExprType seTy)
VariableSetHandle getLoopVarSetHandle(VariableHandle vh)
ExprHandle addExpression(const std::string &varName, ExprType seTy, const std::string &expr)
const char * evalStr(ExprEvalHandle eeh)
void setVariable(VariableHandle handle, double *values, unsigned dim)
ExprEvalHandle getExprEvalHandle(ExprHandle eh)
GlobalVal(const std::string &varName, const KSeExpr::ExprType &et)
std::set< DExpression * > users
std::pair< ExprHandle, std::vector< DExpression * > > ExprEvalHandle
std::set< GlobalVal * >::iterator VariableHandle
std::set< DExpression * >::iterator ExprHandle
std::set< GlobalVal * >::iterator VariableSetHandle
void eval(const char **) override
void eval(double *result) override
returns this variable's value by setting result
std::vector< double > val
GlobalFP(const std::string &varName, int dim)
GlobalStr(const std::string &varName)
void eval(const char **result) override
void eval(double *) override
returns this variable's value by setting result