Week 1
As I had discussed with Ondřej, my goal for the first couple of weeks would be to get a basic assignment and print statement working for aSymbolicExpression for instance the Symbol class from SymPy. So I had to support something like the following:
from lpython import S
from sympy import Symbol
def main0():
x: S = Symbol('x')
print(x)
main0()
This task would comprise of the following few steps
- Supporting imports from
SymPyforCPython - Introducing the
SymbolicExpressionttype - Introducing
SymbolicSymbolas an intrinsic function - Adding support in
visit_printandvisit_assignmentto handle symbolic expressions
I managed to raise a pull request #1846 and address the first 3 steps and I am halfway through with the 4th step. Hence we currently have a decent Abstract Semantic Representation (ASR) of our program above. It goes as follows:
[(=
(Var 2 x)
(IntrinsicFunction
SymbolicSymbol
[(StringConstant
"x"
(Character 1 1 () [])
)]
0
(SymbolicExpression)
()
)
()
)
(Print
()
[(Var 2 x)]
()
()
)]
Well as of now, I can’t claim that I have cracked the solution for the 4th step. As discussed in my weekly meeting with Ondřej, we are still not fully sure as to how we could support the above program in the backend. We are still exploring the most probable and easily achievable approaches . While framing my GSoC proposal, we were more inclined towards framing a pass which would make function calls to SymEngine's C interface. But as we were brainstorming during our meet we realized some potential downsides to this approach and hence we tried framing a somewhat newer approach for the same, which goes as follows:
- Skip implementing
instantiate_SymbolicSymboland the pass to replace the intrinsic function node. - Take inspiration from how assignment statements work for the
Complexttype in LPython and try extending thevisit_assignmentfunction for symbolic expressions accordingly. - Introduce
symengine_strfunction similar to howprint_ffor handling print statements.
I am halway through this approach and I feel this would be the correct way to go. I will try to resolve these in the 2nd week of my coding period.Finally, I would like to point out some tasks which need to be addressed in Week 2 or the upcoming weeks
- Finish
generate_SymbolicSymbolfunction implementation (kept as TODO for now) - Finish
SymbolicSymbol::verify_argsfunction implementation (kept as TODO for now) - Finish
eval_SymbolicSymbolfunction implementation (kept as TODO for now)
Thank You for going through the blog. I hope you like it. Stick around for what’s next to come. Moving into Week 2!