autowrap doesn't understand CodeBlock yet. Ideally your last element in the CodeBlock would be an expression, and autowrap would assign that (and it would give a better error message if it isn't). I opened https://github.com/sympy/sympy/issues/15336 for this.
I'm not sure if is a more proper way to do what you want. autowrap is fairly complicated, so I can't figure out how to do it, but I suspect it is possible. Aaron Meurer On Wed, Oct 3, 2018 at 10:50 PM Nathaniel Virgo <[email protected]> wrote: > > This would probably be a better solution to the problem in my previous mail, > if it can be done. I've posted the same text as a question on Stack Overflow > at > https://stackoverflow.com/questions/52638892/using-assignment-with-autowrap-in-sympy. > > I am writing some code that uses sympy to construct a complicated > mathematical expression, then uses the autowrap function to compile it and > evaluate it repeatedly. > > Unfortunately, my expressions are becoming exponentially large in some cases. > To prevent this, I want to generate expressions that contain assignment > statements. That is, I want to end up with something like (pseudocode) > > x1 = f(a,a); > x2 = f(x1,x1); > x3 = f(x2,x2); > x4 = f(x3,x3); > > instead of > > f(f(f(a,a),f(a,a)),f(f(a,a),f(a,a))),f(f(a,a),f(a,a)),f(f(a,a),f(a,a)))) > > in which every subexpression has been substituted twice. > > There seems to be a mechanism for this, in the form of > sympy.codegen.ast.CodeBlock. However, I can't seem to work out how to get > this to work with autowrap, if indeed it can. > > If I attempt to do > > >>> f = autowrap(ast.CodeBlock(ast.Assignment(y,sym.sin(x))),backend='cython') > > then I get a long stack trace ending with > > wrapped_code_12.c:5:22: error: use of undeclared identifier 'y' > autofunc_result = y = sin(x); > ^ > 1 error generated. > error: command '/usr/bin/clang' failed with exit status 1 > > which suggests to me that using a CodeBlock directly inside autowrap isn't > the right way to do it. (I get a similar error using the Fortran backend.) > > The question is, is there a right way to do it? Can I use CodeBlock in > autowrap, or is there some other way that I can generate intermediate > variables with autowrap rather than always having my sympy expressions fully > expanded out? > > > Best regards > > Nathaniel > > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/sympy. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/265d7681-3377-4dbe-8997-7d12fd662b19%40googlegroups.com. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/sympy. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAKgW%3D6L4L9o5675tjKZGa5bw%3D-92oiZLv_EGuLmOPF-4OJs5wA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
