C code from IndexedBase

159 views
Skip to first unread message

Nico Schlömer

unread,
Apr 14, 2016, 2:59:46 AM4/14/16
to sympy
From an object like `sin(u[k]) + u0[k]` I would like to get the corresponding C code as a string. Since `k` is a variable, I cannot use `MatrixSymbol`, but there's always `IndexedBase` of course. With
```
u = IndexedBase('u')
u0 = IndexedBase('u0')
k = Symbol('k')
y = sin(u[k]) + u0[k]
```
things are looking good, but then
```
from sympy.utilities.codegen import codegen
[(c_name, c_code), (h_name, c_header)] = codegen(("f", y), "C")
```
tells you
```
sympy.tensor.indexed.IndexException: 
Range is not defined for all indices in: u[k]
```
I could perhaps go through all `IndexedBase` instances in `y` and `.subs`titute them with a variable with the string `u[k]`, but that feels hackish.

Any hints?

Nico Schlömer

unread,
Apr 14, 2016, 3:25:09 AM4/14/16
to sympy
It seems that, unfortunately, the information of whether or not a variable is an IndexedBase object is discarded when using it in an expression. Check
```
from sympy import *

u = IndexedBase('u')
k = Symbol('k')
y = u[k]

print(isinstance(u, IndexedBase))

for s in y.free_symbols:
    print(s, isinstance(s, IndexedBase))
```
Hm...

Nico Schlömer

unread,
Apr 14, 2016, 3:31:38 AM4/14/16
to sympy
Once again, atoms to the rescue.
```
y.atoms(IndexedBase)
```
will give you all IndexedBase object from an expression.

Francesco Bonazzi

unread,
Apr 14, 2016, 1:41:44 PM4/14/16
to sympy
Have you tried to use Idx instead of Symbol for the index?

k = Idx("k", 4)

4 is the range.

In this case, k ranges from 0 to 4-1 = 3.

Aaron Meurer

unread,
Apr 19, 2016, 12:27:07 PM4/19/16
to sy...@googlegroups.com
I would consider this to be a bug. You should open an issue for it.

If you use Idx as Francesco suggests, there is a different error

ValueError: lhs indices must match non-dummy rhs indices in sin(u[k]) + u0[k]

which also looks like a bug.

Aaron Meurer
> --
> 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 sympy+un...@googlegroups.com.
> To post to this group, send email to sy...@googlegroups.com.
> 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/61a4dd23-0b06-4559-9da8-10f666464fc5%40googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages