Skip to content

new_merged of AssignmentCollections is broken

When merging two AssignmentCollections, both containing an alias subexpression with the same alias that themselves depend on another Assignment, the resulting merged dict is broken.

import pystencils as ps
import sympy as sp


a, b, res1, res2 = sp.symbols("a b res1 res2")

ac = ps.AssignmentCollection([ps.Assignment(res1, b)],
                             [ps.Assignment(a, 20),
                              ps.Assignment(b, a)])


ac2 = ps.AssignmentCollection([ps.Assignment(res2, b)],
                              [ps.Assignment(a, 10),
                               ps.Assignment(b, a)])

merged_ac = ac.new_merged(ac2).new_without_subexpressions()


print(f"ac:\n {ac}")
print(f"ac2:\n {ac2}")
print(f"merged:\n {merged_ac}")

assert ps.Assignment(res1, 20) in new_merged.main_assignments
assert ps.Assignment(res2, 10) in new_merged.main_assignments

Executing this code results in:

ac:
 Subexpressions:
	a ← 20
	b ← a
Main Assignments:
	res1 ← b

ac2:
 Subexpressions:
	a ← 10
	b ← a
Main Assignments:
	res2 ← b

merged:
 Subexpressions:
Main Assignments:
	res1 ← 20
	res2 ← 20  ### 10 should be here

In the merging-process the replacement of the rhs happens too late, so the expressions are treated as equal, although their rhs should already have been replaced.

Edited by Alexander Reinauer