ExprNode: simplification of external function nodes clone() and toStatic() methods

master
Sébastien Villemot 2023-03-22 16:04:38 +01:00
parent bff80c0eaf
commit 2f111f5055
No known key found for this signature in database
GPG Key ID: 2CECE9350ECEBE4A
2 changed files with 20 additions and 66 deletions

View File

@ -7469,6 +7469,24 @@ AbstractExternalFunctionNode::substituteLogTransform(int orig_symb_id, int aux_s
return buildSimilarExternalFunctionNode(arguments_subst, datatree);
}
expr_t
AbstractExternalFunctionNode::toStatic(DataTree &static_datatree) const
{
vector<expr_t> static_arguments;
for (auto argument : arguments)
static_arguments.push_back(argument->toStatic(static_datatree));
return buildSimilarExternalFunctionNode(static_arguments, static_datatree);
}
expr_t
AbstractExternalFunctionNode::clone(DataTree &datatree) const
{
vector<expr_t> dynamic_arguments;
for (auto argument : arguments)
dynamic_arguments.push_back(argument->clone(datatree));
return buildSimilarExternalFunctionNode(dynamic_arguments, datatree);
}
expr_t
ExternalFunctionNode::composeDerivatives(const vector<expr_t> &dargs)
{
@ -7724,15 +7742,6 @@ ExternalFunctionNode::writeJsonExternalFunctionOutput(vector<string> &efout,
}
}
expr_t
ExternalFunctionNode::toStatic(DataTree &static_datatree) const
{
vector<expr_t> static_arguments;
for (auto argument : arguments)
static_arguments.push_back(argument->toStatic(static_datatree));
return static_datatree.AddExternalFunction(symb_id, static_arguments);
}
void
ExternalFunctionNode::computeXrefs(EquationInfo &ei) const
{
@ -7741,15 +7750,6 @@ ExternalFunctionNode::computeXrefs(EquationInfo &ei) const
argument->computeXrefs(ei);
}
expr_t
ExternalFunctionNode::clone(DataTree &datatree) const
{
vector<expr_t> dynamic_arguments;
for (auto argument : arguments)
dynamic_arguments.push_back(argument->clone(datatree));
return datatree.AddExternalFunction(symb_id, dynamic_arguments);
}
expr_t
ExternalFunctionNode::buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_datatree) const
{
@ -8070,32 +8070,12 @@ FirstDerivExternalFunctionNode::writeBytecodeExternalFunctionOutput(BytecodeWrit
}
}
expr_t
FirstDerivExternalFunctionNode::clone(DataTree &datatree) const
{
vector<expr_t> dynamic_arguments;
for (auto argument : arguments)
dynamic_arguments.push_back(argument->clone(datatree));
return datatree.AddFirstDerivExternalFunction(symb_id, dynamic_arguments,
inputIndex);
}
expr_t
FirstDerivExternalFunctionNode::buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_datatree) const
{
return alt_datatree.AddFirstDerivExternalFunction(symb_id, alt_args, inputIndex);
}
expr_t
FirstDerivExternalFunctionNode::toStatic(DataTree &static_datatree) const
{
vector<expr_t> static_arguments;
for (auto argument : arguments)
static_arguments.push_back(argument->toStatic(static_datatree));
return static_datatree.AddFirstDerivExternalFunction(symb_id, static_arguments,
inputIndex);
}
void
FirstDerivExternalFunctionNode::computeXrefs(EquationInfo &ei) const
{
@ -8364,32 +8344,12 @@ SecondDerivExternalFunctionNode::writeJsonExternalFunctionOutput(vector<string>
efout.push_back(ef.str());
}
expr_t
SecondDerivExternalFunctionNode::clone(DataTree &datatree) const
{
vector<expr_t> dynamic_arguments;
for (auto argument : arguments)
dynamic_arguments.push_back(argument->clone(datatree));
return datatree.AddSecondDerivExternalFunction(symb_id, dynamic_arguments,
inputIndex1, inputIndex2);
}
expr_t
SecondDerivExternalFunctionNode::buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_datatree) const
{
return alt_datatree.AddSecondDerivExternalFunction(symb_id, alt_args, inputIndex1, inputIndex2);
}
expr_t
SecondDerivExternalFunctionNode::toStatic(DataTree &static_datatree) const
{
vector<expr_t> static_arguments;
for (auto argument : arguments)
static_arguments.push_back(argument->toStatic(static_datatree));
return static_datatree.AddSecondDerivExternalFunction(symb_id, static_arguments,
inputIndex1, inputIndex2);
}
void
SecondDerivExternalFunctionNode::computeXrefs(EquationInfo &ei) const
{

View File

@ -1416,7 +1416,7 @@ public:
void collectDynamicVariables(SymbolType type_arg, set<pair<int, int>> &result) const override;
double eval(const eval_context_t &eval_context) const noexcept(false) override;
void writeBytecodeOutput(BytecodeWriter &code_file, ExprNodeBytecodeOutputType output_type, const temporary_terms_t &temporary_terms, const temporary_terms_idxs_t &temporary_terms_idxs, const deriv_node_temp_terms_t &tef_terms) const override = 0;
expr_t toStatic(DataTree &static_datatree) const override = 0;
expr_t toStatic(DataTree &static_datatree) const override;
void computeXrefs(EquationInfo &ei) const override = 0;
BinaryOpNode *normalizeEquationHelper(const set<expr_t> &contain_var, expr_t rhs) const override;
int maxEndoLead() const override;
@ -1453,7 +1453,7 @@ public:
void writePrhs(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, const temporary_terms_idxs_t &temporary_terms_idxs, const deriv_node_temp_terms_t &tef_terms) const;
expr_t replaceTrendVar() const override;
expr_t detrend(int symb_id, bool log_trend, expr_t trend) const override;
expr_t clone(DataTree &datatree) const override = 0;
expr_t clone(DataTree &datatree) const override;
expr_t removeTrendLeadLag(const map<int, expr_t> &trend_symbols_map) const override;
bool isInStaticForm() const override;
expr_t replaceVarsInEquation(map<VariableNode *, NumConstNode *> &table) const override;
@ -1493,10 +1493,8 @@ public:
const temporary_terms_idxs_t &temporary_terms_idxs,
deriv_node_temp_terms_t &tef_terms) const override;
void writeBytecodeOutput(BytecodeWriter &code_file, ExprNodeBytecodeOutputType output_type, const temporary_terms_t &temporary_terms, const temporary_terms_idxs_t &temporary_terms_idxs, const deriv_node_temp_terms_t &tef_terms) const override;
expr_t toStatic(DataTree &static_datatree) const override;
void computeXrefs(EquationInfo &ei) const override;
expr_t buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_datatree) const override;
expr_t clone(DataTree &datatree) const override;
};
class FirstDerivExternalFunctionNode : public AbstractExternalFunctionNode
@ -1532,10 +1530,8 @@ public:
const temporary_terms_t &temporary_terms,
const temporary_terms_idxs_t &temporary_terms_idxs,
deriv_node_temp_terms_t &tef_terms) const override;
expr_t toStatic(DataTree &static_datatree) const override;
void computeXrefs(EquationInfo &ei) const override;
expr_t buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_datatree) const override;
expr_t clone(DataTree &datatree) const override;
};
class SecondDerivExternalFunctionNode : public AbstractExternalFunctionNode
@ -1573,10 +1569,8 @@ public:
const temporary_terms_t &temporary_terms,
const temporary_terms_idxs_t &temporary_terms_idxs,
deriv_node_temp_terms_t &tef_terms) const override;
expr_t toStatic(DataTree &static_datatree) const override;
void computeXrefs(EquationInfo &ei) const override;
expr_t buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_datatree) const override;
expr_t clone(DataTree &datatree) const override;
};
/* Common superclass for nodes that have the following two characteristics: