ecmwf-ifs / loki

Freely programmable source-to-source translation for Fortran
https://sites.ecmwf.int/docs/loki/
Apache License 2.0
29 stars 12 forks source link

Edge case: vector section mapping conflicts with (rebuild of) Conditional #380

Open MichaelSt98 opened 2 hours ago

MichaelSt98 commented 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

...
    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)!

Thus, this bug can be resolved by

MichaelSt98 commented 2 hours ago

@mlange05 as discussed offline