We just discussed this in the developer meeting. Our idea would be that the
input of the search component should be canonical. Abstract tasks do not have to
preserve this, but have to provide a mechanism to provide a canonical version of
itself on demand. If some piece of code depends on a canonical representation
(e.g. because this allows for a more efficient implementation), it would
explicitly ask the abstract task for such a representation.
An abstract task that is already canonical (e.g. a cost transformation of the
root task) would just return itself. Otherwise, it can create an explicit
canonical representation of itself. To avoid unnecessary explicit tasks, an
abstract task should have a method "is_canonical()" (or similar). If there are
nested abstract tasks, it is then for example possible to only explicitly
represent the final (outermost) task.
If someone starts working on this issue, it would in my opinion be perfectly
fine to split the issue into a part for the translator/preprocessor and one or
several parts for the search component.
|