Opened 10 years ago

Closed 3 years ago

#2800 closed defect (fixed)

Improve Expression traversal

Reported by: sjoelund.se Owned by: sjoelund.se
Priority: high Milestone: 1.16.0
Component: Frontend Version: trunk
Keywords: Cc: adrpo, leonardo, perost

Description

We need to improve expression traversal performance in a few steps.

Do not pass everything as a tuple. This causes stress on the GC. The functions should instead have the prototype:

partial function FuncExpType
  input DAE.Exp inExp;
  input Type_a inTypeA;
  output DAE.Exp outExp;
  output Type_a outA;
end FuncExpType;

We need to remove some duplicate code like traverseExpWithoutRelations. If traverseExp needs more functionality, pass it as an extra argument (keep traverseExp as it is; use intermediate functions instead).

If possible, add support for functions that do not modify the expressions or extra arguments, like:

partial function FuncExpType2
  input DAE.Exp inExp;
  input Type_a inTypeA;
  output DAE.Exp outExp;
end FuncExpType2;

or

partial function FuncExpType3
  input DAE.Exp inExp;
  input Type_a inTypeA;
  output DAE.Exp outExp;
end FuncExpType3;

or

partial function FuncExpType4
  input DAE.Exp inExp;
  output DAE.Exp outExp;
end FuncExpType4;

This can be done by passing additional arguments to the worker function.

Change History (4)

comment:1 Changed 10 years ago by sjoelund.se

Does anyone have more suggestions? I am working on the first (and second) ones.

comment:2 Changed 10 years ago by sjoelund.se

  • Owner changed from somebody to sjoelund.se
  • Status changed from new to accepted

comment:3 Changed 10 years ago by sjoelund.se

I am thinking of maybe having something like:

traverseExp(e, TOPDOWN(topDownFunc), extraArg);

function traverseExp
  ...
algorithm
  (e,continue,extraArg) := evalTraversalFunctionTopDown(e, funcUnion, extraArg);
  if not continue
    return;
  end if;
  (e,extraArg) := match (...)
    ...
    case BINARY(e1,op,e2)
      equation
        (e1_1,extraArg) = traverseExp(e1,funcUnion,extraArg);
        (e2_2,extraArg) = traverseExp(e1,funcUnion,extraArg);
        e = if referenceEq(e1,e1_1) and referenceEq(e2,e2_1) then e else BINARY(e1,op,e2);
      then (e,extraArg)
    ...
  end match;
  (e,extraArg) := evalTraversalFunctionBottomUp(e, funcUnion, extraArg);
end traverseExp;

This is (much) simpler to maintain (you can create many of the weird special traversal routines we have right now), but I am afraid it might slow down execution. Any thoughts?

Last edited 10 years ago by sjoelund.se (previous) (diff)

comment:4 Changed 3 years ago by perost

  • Milestone changed from Future to 1.16.0
  • Resolution set to fixed
  • Status changed from accepted to closed

The traversal functions in the old frontend are still a bit of a mess, but for the new frontend we have e.g. Expression.map/fold where extra arguments can be given using function partial application. There's also e.g. Expression.mapShallow that only traverses one level down for when more control is needed. So lets consider this fixed.

Note: See TracTickets for help on using tickets.