23 #include <ginac/add.h>
24 #include <ginac/inifcns.h>
25 #include <ginac/mul.h>
26 #include <ginac/operators.h>
27 #include <ginac/power.h>
28 #include <ginac/print.h>
29 #include <ginac/registrar.h>
30 #include <ginac/relational.h>
31 #include <ginac/wildcard.h>
39 #include "../ast/expression.hpp"
41 #include <ast/parser/parse.hpp>
46 using namespace GiNaC;
52 REGISTER_FUNCTION(der3, dummy())
54 static ex
der2_derivative(const ex& x, const ex& y,
unsigned diff_param) {
return der3(x); }
58 static ex
der_derivative(const ex& x, const ex& y,
unsigned diff_param) {
return der2(x, y); }
62 REGISTER_FUNCTION(pre, dummy())
68 if (p.op(1).match(-1)) {
69 c.s <<
"(1/(" << p.op(0) <<
"))";
71 c.s <<
"((" << p.op(0) <<
")^" << p.op(1) <<
")";
78 unsigned power_prec = m.precedence();
79 if (level >= power_prec) c.s <<
'(';
80 if (m.op(1).match(pow(wild(), -1))) {
81 c.s <<
"(" << m.op(0) <<
"/" << m.op(1).op(0) <<
")";
82 }
else if (m.op(0).match(pow(wild(), -1))) {
83 c.s <<
"(" << m.op(1) <<
"/" << m.op(0).op(0) <<
")";
85 c.s << m.op(0) <<
"*" << m.op(1);
87 if (level >= power_prec) c.s <<
')';
92 unsigned power_prec = s.precedence();
93 if (level >= power_prec) c.s <<
'(';
94 if (s.op(0).match(-wild()) && !s.op(1).match(-wild())) {
95 c.s << s.op(1) <<
"-" << s.op(0).op(0);
97 c.s << s.op(0) <<
"+" << s.op(1);
99 if (level >= power_prec) c.s <<
')';
102 ConvertToGiNaC::ConvertToGiNaC(
Option<Expression> exp) : _replaceDer(true), _generateIndexes(false), _exp(exp) {}
112 static ex
var_derivative(
const ex& x,
const ex& y,
unsigned diff_param) {
return der(x, y); }
126 std::size_t found = str.find(
"[");
127 if (found == std::string::npos) {
130 std::size_t
end = str.find(
"]");
132 ret.erase(found,
end);
152 cerr <<
"BinOp not converted to GiNaC " << b << endl;
159 AST_Expression_ComponentReference cr = der->arguments()->front()->getAsComponentReference();
160 string s = cr->name();
161 s.insert(0,
"__der_");
162 AST_Expression_ComponentReference new_cr =
169 string s = cr->name();
173 map<string, symbol>::iterator i =
_directory.find(s);
177 symbol c = symbol(s);
178 return _directory.insert(make_pair(s, c)).first->second;
184 map<string, symbol>::iterator i =
_directory.find(cr);
188 symbol c = symbol(cr);
189 return _directory.insert(make_pair(cr, c)).first->second;
196 map<string, symbol>::iterator i =
_directory.find(s);
214 switch (e->expressionType()) {
216 return ex(e->getAsReal()->val());
218 return ex(e->getAsInteger()->val());
221 if (v->isParameter() || v->isDiscrete() || v->isConstant() || v->isForType())
222 return getSymbol(e->getAsComponentReference());
223 else if (v->builtIn() && !v->name().compare(
"time"))
232 AST_Expression ed = e->getAsDerivative()->arguments()->front();
233 switch (ed->expressionType()) {
235 AST_Expression_ComponentReference cr = ed->getAsComponentReference();
239 cerr <<
"Derivate argument " << ed <<
" not converted to GiNaC" << endl;
245 AST_Expression_Call c = e->getAsCall();
246 if (
toStr(c->name()) ==
"sin") {
248 }
else if (
toStr(c->name()) ==
"cos") {
250 }
else if (
toStr(c->name()) ==
"log") {
252 }
else if (
toStr(c->name()) ==
"pre") {
254 }
else if (
toStr(c->name()) ==
"der2") {
256 switch (ed->expressionType()) {
258 AST_Expression_ComponentReference cr = ed->getAsComponentReference();
262 cerr <<
"Derivate argument " << ed <<
" not converted to GiNaC" << endl;
265 }
else if (
toStr(c->name()) ==
"der3") {
267 }
else if (
toStr(c->name()) ==
"sum") {
269 }
else if (
toStr(c->name()) ==
"product") {
271 }
else if (
toStr(c->name()) ==
"min") {
273 }
else if (
toStr(c->name()) ==
"max") {
275 }
else if (
toStr(c->name()) ==
"__INNER_PRODUCT") {
277 }
else if (
toStr(c->name()) ==
"pow") {
278 AST_ExpressionList el = c->arguments();
282 }
else if (
toStr(c->name()) ==
"sqrt") {
283 AST_ExpressionList el = c->arguments();
286 }
else if (
toStr(c->name()) ==
"exp") {
291 cerr <<
"Function call : " << c->name()->c_str() <<
" not converted to GiNaC" << endl;
296 AST_Expression el =
AST_ListFirst(e->getAsOutput()->expressionList());
297 return ex((
apply(el)));
300 cerr <<
"Expression: " << e <<
" not converted to GiNaC" << endl;
310 stringstream s(ios_base::out), der_s(ios_base::out);
315 if (s.str().find(
"__der_") == 0) {
316 string ss = s.str().erase(0, 6);
317 der_s <<
"der(" << ss <<
")";
318 e = parseExpression(der_s.str().c_str(), &r);
320 e = parseExpression(s.str().c_str(), &r);
322 assert(e !=
nullptr && r == 0);