Open MichaelSt98 opened 2 hours ago
Reproducer:
from loki import Subroutine, Dimension, SCCDevectorTransformation fcode_kernel = """ SUBROUTINE kernel(start, end, nlon, q, flag1, flag2) INTEGER, INTENT(IN) :: start, end INTEGER, INTENT(IN) :: nlon REAL, INTENT(INOUT) :: q(nlon) INTEGER :: jl, i LOGICAL, INTENT(IN) :: FLAG1, FLAG2 IF (FLAG1) THEN call some_nested_kernel(q) ELSEIF (FLAG2) THEN DO jl = start, end q(jl, jk) = q(jl, jk-1) END DO ENDIF END SUBROUTINE kernel """ kernel = Subroutine.from_source(fcode_kernel) horizontal = Dimension(name='horizontal', index='jl', bounds=('start', 'end'), size='nlon') SCCDevectorTransformation(horizontal=horizontal, trim_vector_sections=True).process_kernel(kernel)
Executing LOKI_DEBUG=1 python3 reproducer.py yields
LOKI_DEBUG=1 python3 reproducer.py
... routine.body = NestedTransformer(section_mapper).visit(routine.body) ... pydantic_core._pydantic_core.ValidationError: 1 validation error for Conditional Assertion failed, [type=assertion_error, input_value=ArgsKwargs((), {'conditio...': None, 'label': None}), input_type=ArgsKwargs] -> s.__pydantic_validator__.validate_python(ArgsKwargs(args, kwargs), self_instance=s)
which is due to
-> s.__pydantic_validator__.validate_python(ArgsKwargs(args, kwargs), self_instance=s) (Pdb) p kwargs['else_body'][0] Section:: (Pdb) p kwargs['else_body'][0].body[0] Conditional::
being in conflict with Loki's Conditional post init assertion assert isinstance(self.else_body[0], Conditional)!
Conditional
assert isinstance(self.else_body[0], Conditional)
Thus, this bug can be resolved by
else_body
Section
@mlange05 as discussed offline
Reproducer:
Executing
LOKI_DEBUG=1 python3 reproducer.py
yieldswhich is due to
being in conflict with Loki's
Conditional
post init assertionassert isinstance(self.else_body[0], Conditional)
!Thus, this bug can be resolved by
else_body
to be aSection
(and the first element of it's body to be aConditional
)