Dispatcher-Pipeline: coordination of base tick and prerequisite expansion

- had to fix a logical inconsistency in the underlying Expander implementation
  in TreeExplorer: the source-pipeline was pulled in advance on expansion,
  in order to "consume" the expanded element immediately; now we retain
  this element (actually inaccessible) until all of the immediate
  children are consumed; thus the (visible) state of the PipeFrameTick
  stays at the frame number corresponding to the top-level frame Job,
  while possibly expanding a complete tree of flexible prerequisites

This test now gives a nice visualisation of the interconnected states
in the Job-Planning pipeline. This can be quite complex, yet I still think
that this semi-functional approach with a stateful pipeline and expand functors
is the cleanest way to handle this while encapsulating all details
This commit is contained in:
Fischlurch 2023-06-14 18:12:41 +02:00
parent 08dfe1007c
commit f84517547b
4 changed files with 262 additions and 33 deletions

View file

@ -644,7 +644,8 @@ namespace lib {
* of this Expander (decorator) is to integrate those "nested child iterators" seamlessly
* into the overall iteration process; once a child iterator is exhausted, it will be
* popped and iteration continues with the previous child iterator or finally with
* the source iterator wrapped by this decorator.
* the source iterator wrapped by this decorator. The source pipeline is only pulled
* once the expanded children are exhausted.
* @remark since we allow a lot of leeway regarding the actual form and definition of the
* _expansion functor_, there is a lot of minute technical details, mostly confined
* within the _FunTraits traits. For the same reason, we need to prepare two different
@ -689,14 +690,14 @@ namespace lib {
expandChildren()
{
REQUIRE (this->checkPoint(), "attempt to expand an empty explorer");
REQUIRE (invariant());
ResIter expanded{ hasChildren()? expandChild_(*expansions_)
: expandRoot_(*this)};
incrementCurrent(); // consume current head element (but don't clean-up)
if (not isnil(expanded))
expansions_.push (move(expanded));
expansions_.push (move(expanded)); // note: source of expansion retained
else
dropExhaustedChildren(); // clean-up only here to preserve the logical depth
iterNext(); // expansion unsuccessful, thus consume source immediately
ENSURE (invariant());
}
@ -773,6 +774,12 @@ namespace lib {
protected:
bool
hasChildren() const
{
return 0 < depth();
}
/** @internal accessor for downstream layers to allow close collaboration */
ResIter&
accessCurrentChildIter()
@ -785,13 +792,10 @@ namespace lib {
dropExhaustedChildren()
{
while (not invariant())
++expansions_;
}
bool
hasChildren() const
{
return 0 < depth();
{
++expansions_; // pop expansion stack (to reinstate invariant)
incrementCurrent(); // consume source of innermost expansion
}
}
};

View file

@ -213,14 +213,24 @@ namespace test {
}
/** @test build and verify the exploration function to discover job prerequisites */
/** @test build and verify the exploration function to discover job prerequisites
* - use a setup where the master ExitNode requires a prerequisite ExitNode to be pulled
* - mark the pipeline-IDs, so that both nodes can be distinguished in the resulting Jobs
* - the `expandPrerequisites()` builder function uses JobTicket::getPrerequisites()
* - and this »expander« function is unfolded recursively such that first the source
* appears in the iterator, and as next step the child prerequisites, possibly to
* be unfolded further recursively
* - by design of the iterator pipeline, it is always possible to access the `PipeFrameTick`
* - this corresponds to the top-level JobTicket, which will produce the final frame
* - putting all these information together, proper working can be visualised.
*/
void
exploreJobTickets()
{
MockDispatcher dispatcher{MakeRec() // define a single segment for the complete time axis
.attrib("mark", 11) // the »master job« for each frame has pipeline-ID ≔ 11
.scope(MakeRec()
.attrib("mark",22) // add a »prerequisite job« with pipeline-ID ≔ 22
.attrib("mark",22) // add a »prerequisite job« marked with pipeline-ID ≔ 22
.genNode())
.genNode()};

View file

@ -1148,7 +1148,7 @@ namespace test{
/** @test ability to wrap and handle IterSource based iteration.
* Contrary to the preceding test case, here the point is to _base the whole pipleine_
* Contrary to the preceding test case, here the point is to _base the whole pipeline_
* on a data source accessible through the IterSource (VTable based) interface. The notable
* point with this technique is the ability to use some _extended sub interface of IterSource_
* and to rely on this interface to implement some functor bound into the TreeExplorer pipeline.
@ -1168,19 +1168,19 @@ namespace test{
virtual PrivateSource* expandChildren() const =0;
};
class VerySpecivicIter
class VerySpecificIter
: public WrappedLumieraIter<NumberSequence
, PrivateSource >
{
public:
VerySpecivicIter(uint start)
VerySpecificIter(uint start)
: WrappedLumieraIter(NumberSequence{start})
{ }
virtual PrivateSource*
expandChildren() const override
{
return new VerySpecivicIter{*wrappedIter() - 2};
return new VerySpecificIter{*wrappedIter() - 2};
}
uint
@ -1194,7 +1194,7 @@ namespace test{
// simple standard case: create a new heap allocated IterSource implementation.
// TreeExplorer will take ownership (by smart-ptr) and build a Lumiera Iterator front-End
CHECK ("7-6-5-4-3-2-1" == materialise (
treeExplore(new VerySpecivicIter{7})));
treeExplore(new VerySpecificIter{7})));
// missing source detected
@ -1203,7 +1203,7 @@ namespace test{
// attach to an IterSource living here in local scope...
VerySpecivicIter vsit{5};
VerySpecificIter vsit{5};
// ...and build a child expansion on top, which calls through the PrivateSource-API
// Effectively this means we do not know the concrete type of the "expanded children" iterator,
@ -1219,17 +1219,17 @@ namespace test{
CHECK (4 == vsit.currentVal());
CHECK (0 == ii.depth());
ii.expandChildren(); // note: calls through source's VTable to invoke VerySpecificIter::expandChildren()
ii.expandChildren(); // note: calls through source's VTable to invoke VerySpecificIter::expandChildren()
CHECK (1 == ii.depth());
CHECK (2 == *ii);
++ii;
CHECK (1 == *ii);
CHECK (3 == vsit.currentVal());
CHECK (4 == vsit.currentVal()); // note: as long as expanded children are alive, the source pipeline is not pulled further
CHECK (1 == ii.depth());
++ii;
CHECK (0 == ii.depth());
CHECK (0 == ii.depth()); // ... but now the children were exhausted and thus also the source advanced
CHECK (3 == *ii);
CHECK (3 == vsit.currentVal());
++ii;

View file

@ -55602,6 +55602,205 @@
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1686757225113" FOLDED="true" ID="ID_1735448615" MODIFIED="1686757642923" TEXT="Koordination Quell-Pipeline bei Expansion">
<icon BUILTIN="button_ok"/>
<node CREATED="1686757298364" ID="ID_21721602" MODIFIED="1686757336765" TEXT="relevant, da explizit die Quell-Pipeline / &#xbb;StateCore&#xab; sichtbar bleibt">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1686757343809" ID="ID_1434845387" MODIFIED="1686757369648" TEXT="Symptome">
<icon BUILTIN="info"/>
<node CREATED="1686757371055" ID="ID_1827960339" MODIFIED="1686757384974" TEXT="expandChildren schaltet auch sofort die Basis-Pipeline weiter"/>
<node CREATED="1686757385767" ID="ID_755880918" MODIFIED="1686757420451" TEXT="wenn die Kinder verbraucht sind, wird die bereits weitergeschaltete Basis-Pipeline sichtbar"/>
<node COLOR="#435e98" CREATED="1686757428518" ID="ID_1278230520" MODIFIED="1686757502868" TEXT="konkretes Beispiel">
<icon BUILTIN="forward"/>
<node CREATED="1686757433466" ID="ID_526100016" MODIFIED="1686757438562" TEXT="Frame-Dispatcher-Pipeline"/>
<node CREATED="1686757485358" ID="ID_390992774" MODIFIED="1686757494673" TEXT="JobPlanningSetup_test::exploreJobTickets()"/>
<node CREATED="1686708460080" ID="ID_1791894372" MODIFIED="1686708540153">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
<font color="#801111" face="Monospaced" size="2">FAIL___expectation___________ </font>
</p>
<p>
<font color="#801111" face="Monospaced" size="2">expect:J(11|200ms)-J(22|200ms)-J(11|240ms)-J(22|240ms)-J(11|280ms)-J(22|280ms) </font>
</p>
<p>
<font color="#801111" face="Monospaced" size="2">actual:J(11|200ms)-J(22|</font><font color="#ff0000" face="Monospaced" size="2">240</font><font color="#801111" face="Monospaced" size="2">ms)-J(11|240ms)-J(22|</font><font color="#ff0000" face="Monospaced" size="2">280</font><font color="#801111" face="Monospaced" size="2">ms)-J(11|280ms)-J(22|</font><font color="#ff0000" face="Monospaced" size="2">320</font><font color="#801111" face="Monospaced" size="2">ms) </font>
</p>
</body>
</html></richcontent>
<icon BUILTIN="info"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#4343af" CREATED="1686749596410" ID="ID_660032494" MODIFIED="1686757331988">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p style="text-align: center">
L&#246;sung: Quelle erst weiter iterieren,
</p>
<p style="text-align: center">
wenn wirklich notwendig
</p>
</body>
</html></richcontent>
<linktarget COLOR="#4a85b5" DESTINATION="ID_660032494" ENDARROW="Default" ENDINCLINATION="-821;104;" ID="Arrow_ID_1758558464" SOURCE="ID_1861299504" STARTARROW="None" STARTINCLINATION="956;47;"/>
<icon BUILTIN="idea"/>
<node COLOR="#338800" CREATED="1686749659842" ID="ID_128221783" MODIFIED="1686756787780" TEXT="Ansatz: incrementCurrent() &#x27f6; verschieben in dropExhaustedChildren()">
<icon BUILTIN="button_ok"/>
<node CREATED="1686749721562" ID="ID_804693591" MODIFIED="1686749744086">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
Bedeutung der <b>Invariante</b>
</p>
</body>
</html></richcontent>
<icon BUILTIN="info"/>
<node CREATED="1686749871599" ID="ID_810008134" MODIFIED="1686749946830" TEXT="wenn &#xfc;berhaupt entfaltet wurde, liegt auch ein KInd bereit"/>
<node CREATED="1686749949462" ID="ID_419936745" MODIFIED="1686749970031" TEXT="man k&#xf6;nnte auch sagen: Kind-Iteration hat Vorrang bis zur Ersch&#xf6;pfung"/>
<node CREATED="1686749996449" ID="ID_923043359" MODIFIED="1686750064046">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
<u>technisch</u>:
</p>
<ul>
<li>
entweder Expansions-Stack ist leer
</li>
<li>
oder der oberste Iterator auf dem Stack ist nichtleer
</li>
</ul>
</body>
</html></richcontent>
<icon BUILTIN="forward"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1686750400101" ID="ID_1494367031" MODIFIED="1686751896580" TEXT="wozu dient(e) das vorauseilende Inkrementieren des Vorg&#xe4;ngers?">
<font NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="help"/>
<node CREATED="1686750461874" ID="ID_1920000064" MODIFIED="1686750491477" TEXT="um das expandierte Quell-Element sofort zu verwerfen"/>
<node CREATED="1686751833197" ID="ID_1444579002" MODIFIED="1686751857463" TEXT="damit auch: stets einen klaren Status haben"/>
<node CREATED="1686751901767" ID="ID_754804911" MODIFIED="1686751928448" TEXT="(naiv) zus&#xe4;tzliche Status-Variable vermeiden"/>
</node>
<node COLOR="#435e98" CREATED="1686751932235" ID="ID_1269020997" MODIFIED="1686757570575" TEXT="Alternative: auf den operationalen Status verlassen">
<icon BUILTIN="idea"/>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1686751984221" ID="ID_1676806677" MODIFIED="1686752536819" TEXT="das ist nicht sch&#xf6;n aber hier vertretbar">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Und zwar wegen der Objektorientierung: die gesamte Logik ist verkapselt, und nur wenige Operationen sind f&#252;r abgeleitete Klassen zug&#228;nglich; im Besonderen ist incrementCurrent() private und das ist der einzige Weg um an die Iteration des Quell-Iterators zu kommen, aber genau dort wird auch dropExhaustedChildren aufgerufen()
</p>
</body>
</html></richcontent>
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1686752539218" ID="ID_737156085" MODIFIED="1686752560042" TEXT="die Invariante wird in jeder Operation wieder hergestellt"/>
<node CREATED="1686752561157" ID="ID_1590943755" MODIFIED="1686752573856" TEXT="das bedingt das Aufruffen der Aufr&#xe4;um-Aktion"/>
<node CREATED="1686752575419" ID="ID_1015024147" MODIFIED="1686752652969">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
insofern kann das Verwerfen des Quell-Objekts verz&#246;gert werden,
</p>
<p>
solange bis die daraus resultierenden Kinder aufgebraucht sind;
</p>
<p>
da wir ohnehin einen Stack ben&#246;tigen, l&#228;&#223;t sich dieser Status
</p>
<p>
auch verschachtelt aufrechterhalten
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node COLOR="#338800" CREATED="1686752682867" ID="ID_1430157017" MODIFIED="1686752803422" TEXT="F&#xfc;r die Pipeline insgesamt ist dies sichtbare verhalten logischer">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<ul>
<li>
Expansion: Quell wird noch nicht angefa&#223;t, aber Kind-Iterator wird bereitgelegt und daraus ggfs. das erste Element exponiert
</li>
<li>
Wenn eine Kind-Ebene leer wird, wird sie verworfen &#8212; <i>und erst an dieser Stelle </i>&#160;wird <b>das n&#228;chste Quell-Element<i>&#160;</i></b>wirklich ben&#246;tigt
</li>
</ul>
</body>
</html></richcontent>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1686755589510" ID="ID_1548186297" MODIFIED="1686756785363" TEXT="Spezialfall beachten: wenn Expansion leeres Ergebnis liefert">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1686755609035" ID="ID_1318211867" MODIFIED="1686755643933" TEXT="streng logisch m&#xfc;&#xdf;te man auch das erst auf den Stack legen..."/>
<node CREATED="1686755644695" ID="ID_187524722" MODIFIED="1686755645459" TEXT="und dann dropExhaustedChildren()"/>
<node CREATED="1686755684401" ID="ID_328751898" MODIFIED="1686755965125" TEXT="stattdessen: nur in diesem Fall iterNext()">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
bisher stand hier das dropExhaustedChildren(), aber das f&#228;llt in disem Fall leer durch, wenn wir uns bereits wieder auf Basis-Level befinden &#8212; was bisher kein Problem war, denn es war bereits das Quell-Element konsumiert worden. Da wir aber diesen Fall klar zu fassen bekommen direkt in expandChildren()&#160;&#160;(weil eben die Expansion sich leer ergibt), k&#246;nnen wir explizit in diesem Fall das Konsumieren der Quelle direkt machen. Ist im Ergebnis sogar logischer.
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1686757573863" ID="ID_135133706" MODIFIED="1686757618838" TEXT="&#xfc;berarbeitete Implementierung ist nun sogar konsistenter geworden">
<linktarget COLOR="#38bbd1" DESTINATION="ID_135133706" ENDARROW="Default" ENDINCLINATION="-42;106;" ID="Arrow_ID_485074689" SOURCE="ID_742355681" STARTARROW="None" STARTINCLINATION="261;13;"/>
<icon BUILTIN="ksmiletris"/>
</node>
</node>
<node COLOR="#338800" CREATED="1686756791749" ID="ID_1725472093" MODIFIED="1686756944993" TEXT="sehr gut: das ge&#xe4;nderte Verhalten war auch in einem Testfall sichtbar">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...ich hatte es seinerzeit wohl bemerkt, aber f&#252;r nicht relevant bzw sogar &#8222;eigentlich logisch&#8220; gehalten...&#160;&#160;jedenfalls war es im Testfall&#160; <font face="Monospaced" color="#2823a5">verify_IterSource()</font>&#160; dokumentiert, da dort auch die Source-Pipeline (hinter dem IterSource-Interface) sichtbar ist und mit beobachtet wird. Dieser Fall (Zeile 1229) hat nun angesprochen und wurde entsprechend korrigiert
</p>
</body>
</html></richcontent>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1686757519200" ID="ID_742355681" MODIFIED="1686757624654" TEXT="&#xdc;berarbeitung der Implementierungs-Logik im Expander">
<arrowlink COLOR="#38bbd1" DESTINATION="ID_135133706" ENDARROW="Default" ENDINCLINATION="-42;106;" ID="Arrow_ID_485074689" STARTARROW="None" STARTINCLINATION="261;13;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1686757630758" ID="ID_272013045" MODIFIED="1686757636109" TEXT="Testsuite GR&#xdc;N">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>
<node CREATED="1535893137527" ID="ID_994961372" MODIFIED="1535893142488" TEXT="Verwendungen">
@ -64555,8 +64754,8 @@
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686696361018" ID="ID_320473769" MODIFIED="1686696804492" TEXT="generischen Rahmen + front-End schaffen">
<linktarget COLOR="#5954b6" DESTINATION="ID_320473769" ENDARROW="Default" ENDINCLINATION="-1037;63;" ID="Arrow_ID_34332665" SOURCE="ID_725756209" STARTARROW="None" STARTINCLINATION="-1213;-50;"/>
<linktarget COLOR="#5954b6" DESTINATION="ID_320473769" ENDARROW="Default" ENDINCLINATION="-929;56;" ID="Arrow_ID_593145833" SOURCE="ID_1712895163" STARTARROW="None" STARTINCLINATION="-1213;-50;"/>
<linktarget COLOR="#5954b6" DESTINATION="ID_320473769" ENDARROW="Default" ENDINCLINATION="-1037;63;" ID="Arrow_ID_34332665" SOURCE="ID_725756209" STARTARROW="None" STARTINCLINATION="-1213;-50;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1686696687820" ID="ID_576907632" MODIFIED="1686696698610" TEXT="Entwurf: AllocatorHandle">
<icon BUILTIN="pencil"/>
@ -75138,7 +75337,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1681742836996" ID="ID_1224963303" MODIFIED="1686698178114" TEXT="expander function to explore prerequisite JobTickets">
<node COLOR="#435e98" CREATED="1681742836996" FOLDED="true" ID="ID_1224963303" MODIFIED="1686698178114" TEXT="expander function to explore prerequisite JobTickets">
<icon BUILTIN="full-4"/>
<node COLOR="#338800" CREATED="1685803059992" ID="ID_1436607523" MODIFIED="1685925254772" TEXT="expander-Funktor(einfach)">
<icon BUILTIN="button_ok"/>
@ -75231,14 +75430,14 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686698185293" ID="ID_611682817" MODIFIED="1686698192373" TEXT="Verifikation im Test">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1686698185293" ID="ID_611682817" MODIFIED="1686757781839" TEXT="Verifikation im Test">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1686705330560" ID="ID_603570215" MODIFIED="1686705437819" TEXT="analog zu vorherigem Testfall + expandPrerequisites()">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1686705344942" ID="ID_1723569587" MODIFIED="1686707637095" TEXT="erst mal erstes Element der Pipeline verifizieren">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1686705447273" ID="ID_221817969" MODIFIED="1686707595983" TEXT="mark kommt nicht an">
<node COLOR="#435e98" CREATED="1686705447273" FOLDED="true" ID="ID_221817969" MODIFIED="1686707595983" TEXT="mark kommt nicht an">
<icon BUILTIN="broken-line"/>
<node COLOR="#435e98" CREATED="1686705467174" ID="ID_1522933004" MODIFIED="1686708560481" TEXT="Debugger">
<icon BUILTIN="info"/>
@ -75270,7 +75469,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1686705365836" ID="ID_138010755" MODIFIED="1686707642210" TEXT="Visualisierung f&#xfc;r das jeweils aktuelle JobTicket">
<node COLOR="#338800" CREATED="1686705365836" ID="ID_138010755" MODIFIED="1686757687312" TEXT="Visualisierung f&#xfc;r das jeweils aktuelle JobTicket">
<richcontent TYPE="NOTE"><html>
<head>
@ -75281,11 +75480,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<icon BUILTIN="pencil"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1686708389268" ID="ID_285309447" MODIFIED="1686708455385" TEXT="grunds&#xe4;tzlich kommen die Daten jetzt wie erwartet an">
<icon BUILTIN="ksmiletris"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1686708410704" ID="ID_441152759" MODIFIED="1686708443003" TEXT="Koordination der Gesamt-Pipeline funktioniert nicht richtig">
<node COLOR="#435e98" CREATED="1686708410704" FOLDED="true" ID="ID_441152759" MODIFIED="1686757689878" TEXT="Koordination der Gesamt-Pipeline funktioniert nicht richtig">
<icon BUILTIN="broken-line"/>
<node CREATED="1686708460080" ID="ID_990579031" MODIFIED="1686708540153">
<richcontent TYPE="NODE"><html>
@ -75306,13 +75505,29 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1686708564668" ID="ID_1705252197" MODIFIED="1686708592362" TEXT="schaltet da der Tick-Generator zu fr&#xfc;h weiter?">
<node COLOR="#435e98" CREATED="1686708564668" ID="ID_1705252197" MODIFIED="1686749574616" TEXT="schaltet da der Tick-Generator zu fr&#xfc;h weiter?">
<icon BUILTIN="help"/>
<node CREATED="1686708691354" ID="ID_429578844" MODIFIED="1686708711789" TEXT="weil das expand() in die Iterate-Operation eingeh&#xe4;ngt ist..."/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1686708741452" ID="ID_1456716715" MODIFIED="1686708761451" TEXT="aber warum schaltet dann der n&#xe4;chste Wert von der Basissequenz nicht weiter?">
<icon BUILTIN="help"/>
<node CREATED="1686749244896" ID="ID_792673014" MODIFIED="1686749263390" TEXT="und weil in expandChildren stets sofort incrementCurrent() aufgerufen wird"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1686749294140" ID="ID_1511416899" MODIFIED="1686749591908" TEXT="deshalb wird die Basis-Pipeline bereits vorgreifend weitergeschaltet">
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1686757130262" ID="ID_1861299504" MODIFIED="1686757271045" TEXT="logische Inkonsistenz in der Expander-Implementierung">
<arrowlink COLOR="#4a85b5" DESTINATION="ID_660032494" ENDARROW="Default" ENDINCLINATION="-821;104;" ID="Arrow_ID_1758558464" STARTARROW="None" STARTINCLINATION="956;47;"/>
<icon BUILTIN="broken-line"/>
</node>
<node COLOR="#338800" CREATED="1686757667127" ID="ID_803521582" MODIFIED="1686757673328" TEXT="Implementierung &#xfc;berarbeitet">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1686757673981" ID="ID_1339385656" MODIFIED="1686757678536" TEXT="alle Tests GR&#xdc;N">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1686757716091" ID="ID_1984151542" MODIFIED="1686757736741" TEXT="Pipeline funktioniert nun konsistent, incl. End-Bedingung">
<icon BUILTIN="button_ok"/>
<node CREATED="1686757754298" ID="ID_1544300725" MODIFIED="1686757772691" TEXT="200ms ... 300ms"/>
<node CREATED="1686757773327" ID="ID_1310335603" MODIFIED="1686757774227" TEXT="J(11|200ms)-J(22|200ms)-J(11|240ms)-J(22|240ms)-J(11|280ms)-J(22|280ms)"/>
</node>
</node>
</node>