diff --git a/pystencils/simp/assignment_collection.py b/pystencils/simp/assignment_collection.py index 5d57addce4e4ea740b0eb045142cb8d2bea5c797..79611f6753e578953f41360a4556460bbb9cfd1f 100644 --- a/pystencils/simp/assignment_collection.py +++ b/pystencils/simp/assignment_collection.py @@ -3,6 +3,7 @@ from copy import copy from typing import List, Optional, Dict, Any, Set, Sequence, Iterator, Iterable, Union from pystencils.assignment import Assignment from pystencils.sympyextensions import fast_subs, count_operations, sort_assignments_topologically +import pystencils class AssignmentCollection: @@ -360,6 +361,25 @@ class AssignmentCollection: self.sub_expressions = [Assignment(k, v) for k, v in sub_expressions_dict.items()] + def has_exclusive_writes(self): + """ + Simple check for exclusive (non-overlapping) writes. + I.e. AssignmentCollection can be executed safely in parallel without caring about race conditions. + """ + + assignments = self.main_assignments + write_field_accesses = [a.lhs for a in assignments if isinstance(a.lhs, pystencils.Field.Access)] + + exclusive_writes = set() + for a in write_field_accesses: + + if (a.field, a.index) in exclusive_writes: + return False + else: + exclusive_writes.add((a.field, a.index)) + + return True + class SymbolGen: """Default symbol generator producing number symbols ζ_0, ζ_1, ..."""