Sequential scheduling of an algorithm set (native support)
This MR brings support for sequential scheduling of so designated algorithm sets. In contrast to the existent AtomicSequencer, this is a natively supported feature of the (Avalanche) scheduler. This new mechanism is more powerful than the AtomicSequencer, as it yields greater concurrency, and thus greater intra-event throughput. In particular, the new mechanism has the following pros:
- it will make sure the in-sequence algorithms are scheduled ASAP, i.e., as soon as their individual input dependencies are satisfied (in contrast to "atomic" sequencing, with its cumulative input dependencies).
- likewise, an out-sequence algorithm, which is data-dependent on the in-sequence one(s), will also be scheduled earlier (unless it depends on the last in-sequence algorithm).
- it doesn't degrade load balancing (no "superalgorithms").
The highlights are:
- in the graph of precedence rules, add explicit typing of a CF decision hub node as concurrent/sequential (before, it was always considered as concurrent);
- in AthSequencer, add 'Sequential' flag to configure a CF decision hub accordingly (default value is False);
- in GaudiSequencer - no changes, the corresponding CF decision hub will always be configured as concurrent, as before;
- make the CF graph traversals respect the concurrent/sequential nature of a CF decision hub.
I also took this occasion to:
- re-factor the bottom-up part of the CF graph traversal (recursive pattern -> graph visitor pattern);
- make few terminology updates:
- replace the notion of 'laziness', inherited historically from the GaudiSequencer, with a more accurate notion of 'prompt decision' (the change is internal to PrecedenceRulesGraph);
- rename the root CF decision hub: "EVENT LOOP" -> "RootDecisionHub".