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
SymPy
forCPython
- Introducing the
SymbolicExpression
ttype - Introducing
SymbolicSymbol
as an intrinsic function - Adding support in
visit_print
andvisit_assignment
to 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_SymbolicSymbol
and the pass to replace the intrinsic function node. - Take inspiration from how assignment statements work for the
Complex
ttype in LPython and try extending thevisit_assignment
function for symbolic expressions accordingly. - Introduce
symengine_str
function similar to howprint_f
for 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_SymbolicSymbol
function implementation (kept as TODO for now) - Finish
SymbolicSymbol::verify_args
function implementation (kept as TODO for now) - Finish
eval_SymbolicSymbol
function 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!