22 #include <boost/optional/optional_io.hpp>
28 #include <ast/parser/parse.hpp>
37 #include <util/visitors/get_index_variables.hpp>
38 #include <util/visitors/is_recursive_def.hpp>
39 #include <util/visitors/replace_der.hpp>
40 #include <util/visitors/revert_index.hpp>
51 return new ClassicPrinter(eq);
53 return new OutputPrinter(eq);
55 return new AlgebraicPrinter(eq);
57 return new DependencyPrinter(eq);
59 return new ZeroCrossingPrinter(eq);
61 return new DerivativePrinter(eq);
80 buffer <<
"_eval" << eq.
lhs();
95 buffer <<
"_eq_" <<
_id;
118 buffer <<
"(" << order <<
")";
148 :
EquationPrinter(eq), _fact_init(2), _id(eq.id()), _range(eq.range()), _lhs(eq.lhs()), _rhs(eq.rhs())
150 initializeDerivatives();
157 stringstream apply_buffer;
158 GetIndexVariables index_usage;
161 apply_buffer <<
"#define _apply_usage" <<
equationId();
165 for (
auto index :
usage) {
166 apply_buffer <<
TAB << index.first <<
" = " <<
_range->getDimensionVar(index.second) <<
";";
167 apply_buffer << ((i + 1 <= size) ?
"\\" :
"");
168 apply_buffer << endl;
171 buffer << apply_buffer.str();
180 ExpressionDerivator ed;
181 ReplaceDer replace_der;
184 AST_Expression exp2 = ed.derivate(exp1,
_rhs);
186 AST_Expression exp3 = ed.derivate(exp2,
_rhs);
194 if (config.generateDerivatives()) {
196 int order = config.order() - 1;
199 for (
int i = 0; i < order; i++) {
200 buffer << tabs <<
prefix() <<
lhs(init + i) <<
" = ";
206 buffer <<
")/" << fact;
223 FunctionPrinter printer;
234 buffer << tabs <<
prefix() <<
lhs() <<
" = " <<
_rhs <<
";" << endl;
253 buffer << endl <<
_range.get().end();
263 buffer <<
"_out_exp_" <<
_id;
276 arguments =
_range->getDimensionVarsString();
319 buffer <<
"_alg_eq_" <<
_id;
324 : DerivativePrinter(eq),
328 _var_idx(Index(eq.lhs())),
329 _parallel(ModelConfig::instance().modelAnnotations().parallel()){};
335 buffer << tabs <<
"if (map[" <<
_var_idx <<
"] > NOT_ASSIGNED) {" << endl;
346 buffer <<
TAB <<
TAB <<
"}" << endl;
356 static constexpr
int FIRST_ORDER = 1;
357 static constexpr
int SECOND_ORDER = 2;
364 if (PRINT_EQ_RANGE) {
366 arguments =
_range.get().indexes();
375 buffer << tabs <<
prefix() <<
lhs(FIRST_ORDER) <<
" = " <<
_rhs <<
";" << endl;
379 if (PRINT_EQ_RANGE) {
380 buffer <<
_range.get().end();
390 buffer <<
"_event_" <<
_id;