It’s been an exciting week. My work on Fortran code generation made it into the official master branch of Sympy. This includes printing of free-form Fortran, a brand new FCodeGen object, and a module for indexed objects. The indexed objects allows generation of code involving arrays.
Also, Brian introduced me to the Python library called Theano. It “…allows you to define, optimize, and evaluate mathematical expressions involving multi-dimensional arrays efficiently.” Now, that description could very well have been a statement about my doings so far this summer. The Theano project has an emphasis on optimization, and is also able to perform calculations on a GPU if available, so it would be very nice if Theano could be used together with Sympy. After a little discussion with Brian and Ronan I was inspired to examine the possibility to use Theano as a back-end.
The expression tree structures in Theano and Sympy differ slightly, so I wrote a little module to convert the tree of a Sympy expression to a data structure with identical topology as the corresponding Theano expression. The idea is that expression trees on equivalent form can be converted between Sympy and Theano by a trivial mapping of the nodes. However, I was not able to follow this track further as I had to prioritize the review process of the Fortran code generation.
I’ve spent the rest of the time to bring the C generator up to par with the Fortran facilities. The current result is here, but it is not ready yet as the tests of array arguments are still XFAIL-ing. I don’t want to quick fix this by copying the approach I used for Fortran arrays, because there is need for a more robust implementation. This demands improvements in the indexed module, in particular functions to inspect and validate expressions. The code printers should rely on these functions to determine the correct implementation of the mathematical expressions.
The indexed module has become a central piece in my project as the way to represent arrays in Sympy. I think that the Indexed objects can be useful not only for generating loops in C and Fortran as I have done so far, but also for interfacing with other array-based systems, such as Theano, and also directly with Numpy. So improvements to the indexed module would benefit the interaction with all these array-based systems, and I should give it a high priority.