Chain-Load: combine all exit-hashes into a single global hash

...during development of the Chain-Load, it became clear that we'll often
need a collection of small trees rather than one huge graph. Thus a rule
for pruning nodes and finishing graphs was added. This has the consequence
that there might now be several exit nodes scattered all over the graph;
we still want one single global hash value to verify computations,
thus those exit hashes must now be picked up from the nodes and
combined into a single value.

All existing hash values hard coded into tests must be updated
This commit is contained in:
Fischlurch 2023-12-09 02:36:14 +01:00
parent 9e25283b72
commit fe6f2af7bb
6 changed files with 194 additions and 50 deletions

View file

@ -366,6 +366,7 @@ namespace lib {
namespace iter_explorer { // Implementation of Iterator decorating layers...
constexpr auto ACCEPT_ALL = [](auto){return true;};
constexpr auto IDENTITY = [](auto it){return *it;};
/**
* @internal technical details of binding a functor into the IterExplorer.

View file

@ -213,6 +213,21 @@ namespace meta{
template<typename FUN, uint a>
using has_Arity = std::bool_constant<_Fun<FUN>::ARITY == a>;
template<typename FUN>
using is_NullaryFun = has_Arity<FUN,0>;
template<typename FUN>
using is_UnaryFun = has_Arity<FUN,1>;
template<typename FUN>
using is_BinaryFun = has_Arity<FUN,2>;
/**
* Meta-function to check that some _function like_ entity

View file

@ -1165,6 +1165,11 @@ namespace test{
return _Fmt{"○%s●"} % *it; // accessor: format into a string
})
== "○9●○8●○7●○6●○5●○4●○3●○2●○1●"_expect);
// a predefined IDENTITY accessor takes values from the pipeline as-is
CHECK (explore(CountDown{9})
.reduce(iter_explorer::IDENTITY, std::minus<int>(), expectedSum(9))
== 0);
}

View file

@ -109,13 +109,13 @@ SHOW_EXPR(offset())
Scheduler scheduler{bFlow, watch};
SHOW_EXPR(testLoad.getHash())
CHECK (testLoad.getHash() == 0x5306191657DA4105);
CHECK (testLoad.getHash() == 0xD2F292D864CF8086);
SHOW_EXPR(offset())
testLoad.setupSchedule(scheduler)
.launch_and_wait();
SHOW_EXPR(offset())
SHOW_EXPR(testLoad.getHash())
CHECK (testLoad.getHash() == 0x5306191657DA4105);
CHECK (testLoad.getHash() == 0xD2F292D864CF8086);
}
@ -217,7 +217,7 @@ SHOW_EXPR(testLoad.getHash())
CHECK (graph.topLevel() == 31);
CHECK (graph.getSeed() == 0);
CHECK (graph.getHash() == 0x5CDF544B70E59866);
CHECK (graph.getHash() == 0xB3445F1240A1B05F);
auto* node = & *graph.allNodes();
CHECK (node->hash == graph.getSeed());
@ -246,9 +246,15 @@ SHOW_EXPR(testLoad.getHash())
// got a complete chain using all allocated nodes
CHECK (steps == 31);
CHECK (steps == graph.topLevel());
CHECK (node->hash == graph.getHash());
CHECK (node->hash == 0x5CDF544B70E59866);
} // hash of the graph is hash of last node
// Since this graph has only a single exit-node,
// the global hash of the graph is derived from this hash
size_t globalHash{0};
boost::hash_combine (globalHash, node->hash);
CHECK (globalHash == graph.getHash());
CHECK (globalHash == 0xB3445F1240A1B05F);
}
@ -275,7 +281,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0xAE332109116C5100);
CHECK (graph.getHash() == 0x6EDD7B92F12E9A37);
auto stat = graph.computeGraphStatistics();
CHECK (stat.indicators[STAT_NODE].cnt == 32); // the 32 Nodes...
@ -294,7 +300,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0xCBD0807DF6C84637);
CHECK (graph.getHash() == 0x9E0C7D98B61E1789);
stat = graph.computeGraphStatistics();
CHECK (stat.levels == 8); // expands faster, with only 8 levels
@ -313,7 +319,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (gra_2.getHash() == 0xE629826A1A8DEB38);
CHECK (gra_2.getHash() == 0x28B121BE7F1F7362);
stat = gra_2.computeGraphStatistics();
CHECK (stat.levels == 37); // much more levels, as can be expected
@ -346,7 +352,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0x8454196BFA40CFE1);
CHECK (graph.getHash() == 0x1D201B70F18E995A);
auto stat = graph.computeGraphStatistics();
CHECK (stat.levels == 9); // This connection pattern filled 9 levels
@ -363,7 +369,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0x825696EA63E579A4);
CHECK (graph.getHash() == 0x8AF4BDAE5AA6880C);
stat = graph.computeGraphStatistics();
CHECK (stat.levels == 12); // This example runs a bit longer
@ -381,7 +387,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0xA850E6A4921521AB);
CHECK (graph.getHash() == 0x220A2E81F65146FC);
stat = graph.computeGraphStatistics();
CHECK (stat.levels == 12); // This graph has a similar outline
@ -415,8 +421,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0x12A49C0E413B573B);
CHECK (graph.getHash() == 0x11BB1409A61A9B78);
auto stat = graph.computeGraphStatistics();
CHECK (stat.levels == 8); // 8 Levels...
@ -438,7 +443,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0x82E39529C470E20A);
CHECK (graph.getHash() == 0x3DFA720156540247);
stat = graph.computeGraphStatistics();
CHECK (stat.indicators[STAT_SEED].cnt == 11); // the same number of 11 »Seed« events
@ -474,7 +479,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0xC4AE6EB741C22FCE);
CHECK (graph.getHash() == 0x660BD1CD261A990);
auto stat = graph.computeGraphStatistics();
CHECK (stat.levels == 32); // only a single line of connections...
@ -494,7 +499,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0xC515DB464FF76818);
CHECK (graph.getHash() == 0xAF4204DD69BB467C);
stat = graph.computeGraphStatistics();
CHECK (stat.levels == 15); //
@ -519,7 +524,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0xEF172CC4B0DE2334);
CHECK (graph.getHash() == 0xF14A09EEFFEC7B18);
stat = graph.computeGraphStatistics();
CHECK (stat.segments == 1); // ...the graph can evade severing altogether
@ -542,7 +547,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0xD0A27C9B81058637);
CHECK (graph.getHash() == 0x3965FAC3B9A2A545);
// NOTE: this example produced 10 disjoint graph parts,
// which however start and end interleaved
@ -572,7 +577,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0x1D56DF2FB0D4AF97);
CHECK (graph.getHash() == 0x20546083916F7521);
stat = graph.computeGraphStatistics();
CHECK (stat.levels == 9); // Generation carries on for 13 levels
@ -620,7 +625,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0xED40D07688A9905);
CHECK (graph.getHash() == 0xCAFA895DF9BDFB70);
auto stat = graph.computeGraphStatistics();
CHECK (stat.indicators[STAT_NODE].cL == "0.49970598"_expect); // The resulting distribution of nodes is stable and even
@ -649,7 +654,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0xD801FFCF44B202F4);
CHECK (graph.getHash() == 0x38788543EA81C664);
stat = graph.computeGraphStatistics();
CHECK (stat.levels == 78); //
@ -674,7 +679,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0xB9580850D637CD45);
CHECK (graph.getHash() == 0xBD309241A343FD43);
stat = graph.computeGraphStatistics();
CHECK (stat.levels == 104); //
@ -696,7 +701,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0xC8C23AF1A9729901);
CHECK (graph.getHash() == 0x44860825C80753C4);
stat = graph.computeGraphStatistics();
CHECK (stat.levels == 55); // much denser arrangement due to stronger interleaving
@ -717,7 +722,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0x2C66D34BA0680AF5);
CHECK (graph.getHash() == 0x202F5F3801CB3A0A);
stat = graph.computeGraphStatistics();
CHECK (stat.levels == 45); //
@ -742,7 +747,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0x4E6A586532A450FD);
CHECK (graph.getHash() == 0x9E124CA52972CC66);
stat = graph.computeGraphStatistics();
CHECK (stat.levels == 22); // ▶ resulting graph is very dense, hitting the parallelisation limit
@ -766,7 +771,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0x58A972A5154FEB95);
CHECK (graph.getHash() == 0xE0FF7A332B7335E5);
stat = graph.computeGraphStatistics();
CHECK (stat.levels == 27); //
@ -788,7 +793,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0x9B9E007964F751A2);
CHECK (graph.getHash() == 0xCD8B689C1514D40E);
stat = graph.computeGraphStatistics();
CHECK (stat.levels == 130); //
@ -809,7 +814,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0xE491294D0B7F3D4D);
CHECK (graph.getHash() == 0x7DA33206D0773991);
stat = graph.computeGraphStatistics();
CHECK (stat.levels == 21); // rather dense
@ -836,7 +841,7 @@ SHOW_EXPR(testLoad.getHash())
// .printTopologyDOT()
// .printTopologyStatistics()
;
CHECK (graph.getHash() == 0x8208F1B6517481F0);
CHECK (graph.getHash() == 0x259C7CA1B86E6C61);
stat = graph.computeGraphStatistics();
CHECK (stat.levels == 31); // rather high concurrency
@ -878,7 +883,23 @@ SHOW_EXPR(testLoad.getHash())
CHECK (8 == graph.allNodes().filter(isStartNode).count());
CHECK (15 == graph.allNodes().filter(isExitNode).count());
CHECK (graph.getHash() == 0xC4AE6EB741C22FCE);
// verify computation of the globally combined exit hash
auto exitHashes = graph.allNodes()
.filter(isExitNode)
.transform([](Node& n){ return n.hash; })
.effuse();
CHECK (15 == exitHashes.size());
size_t combinedHash{0};
for (uint i=0; i <15; ++i)
boost::hash_combine (combinedHash, exitHashes[i]);
CHECK (graph.getHash() == combinedHash);
CHECK (graph.getHash() == 0x59AC21CFAE268613);
// verify connectivity and local exit hashes
graph.allNodePtr().grouped<4>()
.foreach([&](auto group)
{ // verify wiring pattern
@ -900,7 +921,7 @@ SHOW_EXPR(testLoad.getHash())
CHECK (isInner(c));
CHECK (isExit(d));
CHECK (graph.nodeID(d) == 31);
CHECK (d->hash == graph.getHash());
CHECK (d->hash == 0xC4AE6EB741C22FCE);
} // this is the global exit node
});
@ -919,7 +940,7 @@ SHOW_EXPR(testLoad.getHash())
});
graph.recalculate();
CHECK (graph.getHash() == 0x548F240CE91A291C);
CHECK (graph.getHash() == 0xA76EA46C6C004CA2);
graph.allNodePtr().grouped<4>()
.foreach([&](auto group)
{ // verify hashes were recalculated
@ -934,15 +955,15 @@ SHOW_EXPR(testLoad.getHash())
else
{
CHECK (graph.nodeID(d) == 31);
CHECK (d->hash == graph.getHash());
CHECK (d->hash == 0x548F240CE91A291C);
}
});
// seeding and recalculation are reproducible
graph.setSeed(0).recalculate();
CHECK (graph.getHash() == 0xC4AE6EB741C22FCE);
CHECK (graph.getHash() == 0x59AC21CFAE268613);
graph.setSeed(55).recalculate();
CHECK (graph.getHash() == 0x548F240CE91A291C);
CHECK (graph.getHash() == 0xA76EA46C6C004CA2);
}

View file

@ -314,7 +314,6 @@ namespace test {
size_t size() const { return numNodes_; }
size_t topLevel() const { return unConst(this)->backNode()->level; }
size_t getSeed() const { return unConst(this)->frontNode()->hash; }
size_t getHash() const { return unConst(this)->backNode()->hash; } /////////////////////TODO combine hash of all exit nodes
auto
@ -328,6 +327,30 @@ namespace test {
return allNodes().asPtr();
}
auto
allExitNodes()
{
return allNodes().filter([](Node& n){ return isExit(n); });
}
auto
allExitHashes() const
{
return unConst(this)->allExitNodes().transform([](Node& n){ return n.hash; });
}
/** global hash is the combination of all exit node hashes != 0 */
size_t
getHash() const
{
auto combineBoostHashes = [](size_t h, size_t hx){ boost::hash_combine(h,hx); return h;};
return allExitHashes()
.filter([](size_t h){ return h != 0; })
.reduce(lib::iter_explorer::IDENTITY
,combineBoostHashes
);
}
/** @return the node's index number, based on its storage location */
size_t nodeID(Node const* n){ return n - frontNode(); };
size_t nodeID(Node const& n){ return nodeID (&n); };

View file

@ -96769,6 +96769,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1701374359524" ID="ID_173491994" MODIFIED="1701374378241" TEXT="pr&#xfc;fen: es wird tats&#xe4;chlich neu berechnet (und das Ergebnis ist identisch)">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1702170588580" ID="ID_1553144523" MODIFIED="1702170671431" TEXT="Abschnitt zur Berechnung des kombinierten Hash-Wertes aller Exit-Nodes">
<linktarget COLOR="#68cb83" DESTINATION="ID_1553144523" ENDARROW="Default" ENDINCLINATION="452;16;" ID="Arrow_ID_1386990069" SOURCE="ID_1604229914" STARTARROW="None" STARTINCLINATION="494;25;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1701661921354" ID="ID_1422491771" MODIFIED="1701838435138" TEXT="verify_scheduling_setup">
<icon BUILTIN="button_ok"/>
@ -99476,6 +99480,69 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node COLOR="#338800" CREATED="1702158518149" ID="ID_1079943297" MODIFIED="1702173712470" TEXT="Hash aus mehreren Exit-Nodes kombinieren">
<icon BUILTIN="button_ok"/>
<node COLOR="#5b280f" CREATED="1702158566367" ID="ID_523736559" MODIFIED="1702163792736" TEXT="Spezialfall-Behandlung: nur eine Exit-Node">
<icon BUILTIN="button_cancel"/>
<node CREATED="1702158584986" ID="ID_1490640057" MODIFIED="1702158609515" TEXT="dann soll explizit der Hash dieser Exit-Node als Gesamt-Hash dienen"/>
<node CREATED="1702158610318" ID="ID_250643227" MODIFIED="1702158635790" TEXT="damit sind wir zum urspr&#xfc;nglichen Entwurf R&#xfc;ckw&#xe4;rts-kompatibel"/>
<node COLOR="#5b280f" CREATED="1702163723992" ID="ID_895908177" MODIFIED="1702163789431" TEXT="wozu das??? dann &#xe4;ndert sich halt der hash WTF. KISS">
<icon BUILTIN="stop-sign"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1702158659394" ID="ID_592383297" MODIFIED="1702173916656" TEXT="Exit-Nodes finden">
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1702158665922" ID="ID_1677733500" MODIFIED="1702158696745" TEXT="ist aufwendig &#x2014; O(N)">
<icon BUILTIN="messagebox_warning"/>
<node COLOR="#435e98" CREATED="1702158704572" ID="ID_860505115" MODIFIED="1702158764150" TEXT="KISS und droof jeschissen"/>
<node COLOR="#435e98" CREATED="1702158741452" ID="ID_137157111" MODIFIED="1702158764150" TEXT="das hier ist reiner Test-Code">
<icon BUILTIN="yes"/>
</node>
</node>
<node COLOR="#338800" CREATED="1702158767685" ID="ID_1843778997" MODIFIED="1702170419055" TEXT="also for-each-Node-filtern">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1702170446814" ID="ID_118163071" MODIFIED="1702170464662" TEXT="und : alle hash == 0 ebenfalls filtern">
<icon BUILTIN="button_ok"/>
<node CREATED="1702170466509" ID="ID_1902880911" MODIFIED="1702170485872" TEXT="warum? weil dann hash=0 nach reset"/>
</node>
</node>
<node COLOR="#338800" CREATED="1702158826652" ID="ID_445258797" MODIFIED="1702170513133" TEXT="Kombiniere...">
<icon BUILTIN="button_ok"/>
<node CREATED="1702170489086" ID="ID_1519811215" MODIFIED="1702170498733" TEXT="das ist eine Reduce-Operation"/>
<node CREATED="1702170499407" ID="ID_1930433136" MODIFIED="1702170509842" TEXT="HA! hab ich neulich in IterExplorer eingebaut"/>
</node>
<node COLOR="#338800" CREATED="1702158838314" ID="ID_1693683780" MODIFIED="1702173710563" TEXT="Teste...">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1702170514679" ID="ID_1604229914" MODIFIED="1702173843102" TEXT="verwende den bestehenden verify_reseed_recalculate">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
das ist sinnvoll denn....
</p>
<ul>
<li>
dort haben wir eine einfache, aber nicht-triviale Struktur
</li>
<li>
genau in diesem Test (und nur dort) verifizieren wir explizit die Connectivity
</li>
<li>
und ebenfalls dort pr&#252;fen wir bereits jeden Einzel-Hash
</li>
</ul>
</body>
</html></richcontent>
<arrowlink COLOR="#68cb83" DESTINATION="ID_1553144523" ENDARROW="Default" ENDINCLINATION="452;16;" ID="Arrow_ID_1386990069" STARTARROW="None" STARTINCLINATION="494;25;"/>
<arrowlink COLOR="#68cb83" DESTINATION="ID_112427610" ENDARROW="Default" ENDINCLINATION="497;-22;" ID="Arrow_ID_352988310" STARTARROW="None" STARTINCLINATION="494;25;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1702170675769" ID="ID_14784180" MODIFIED="1702173707308" TEXT="alle anderen Hashes f&#xfc;r die Topologien neu ermitteln">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1699758530360" ID="ID_1331344948" MODIFIED="1700183601409" TEXT="Verlinkung">
<icon BUILTIN="button_ok"/>
@ -99562,6 +99629,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1701029224849" ID="ID_178091052" MODIFIED="1701029238572" TEXT="dann verstecken wir den aktuellen Seed im Aufrufparameter"/>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1702158486658" ID="ID_552605299" MODIFIED="1702158512159" TEXT="Konsequenz &#x27f9; es kann nun viele Exit-Nodes geben">
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node COLOR="#338800" CREATED="1699805890752" FOLDED="true" ID="ID_604823204" MODIFIED="1701476576187" TEXT="Limitierungen einhalten">
<icon BUILTIN="button_ok"/>
@ -100651,8 +100721,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1701117656420" ID="ID_1549878593" MODIFIED="1701117683318" TEXT="repeat-Funktion hier mit abdecken">
<icon BUILTIN="bell"/>
<node COLOR="#338800" CREATED="1701117656420" ID="ID_112427610" MODIFIED="1702173843103" TEXT="kombinierte Hash-Berechnung hier mit abdecken">
<linktarget COLOR="#68cb83" DESTINATION="ID_112427610" ENDARROW="Default" ENDINCLINATION="497;-22;" ID="Arrow_ID_352988310" SOURCE="ID_1604229914" STARTARROW="None" STARTINCLINATION="494;25;"/>
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1701117618701" ID="ID_1109241766" MODIFIED="1701117636221" TEXT="so ein Test ist nur einmal sinnvoll, um die Berechnung abzudecken">
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
@ -100662,8 +100733,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1700105555476" ID="ID_587761135" MODIFIED="1700105558876" TEXT="Scheduling">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701488317653" ID="ID_502099140" MODIFIED="1701488325489" TEXT="Art der Integration festlegen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1701488317653" ID="ID_502099140" MODIFIED="1702158167293" TEXT="Art der Integration festlegen">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1701488246119" ID="ID_518382795" LINK="#ID_53693227" MODIFIED="1701488287933" TEXT="Bezug zur &#xbb;Encodierung von Job-Argumenten&#xab;">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701490186822" ID="ID_658348473" MODIFIED="1701490206342" TEXT="#1295 job invocation parameter representation">
<icon BUILTIN="flag-yellow"/>
@ -100685,7 +100756,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1701490276188" ID="ID_1180825392" MODIFIED="1701490340494" TEXT="die 2.Feed-Activity ist derzeit leer">
<icon BUILTIN="hourglass"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1701490637565" ID="ID_96958310" MODIFIED="1701490654507" TEXT="jetzt implementieren &#x2014; oder weiter durchmogeln?">
<node COLOR="#435e98" CREATED="1701490637565" ID="ID_96958310" MODIFIED="1702173884651" TEXT="jetzt implementieren &#x2014; oder weiter durchmogeln?">
<icon BUILTIN="help"/>
<node CREATED="1701490659833" ID="ID_148739202" MODIFIED="1701490679838" TEXT="erwarte, da&#xdf; sich das Thema r&#xfc;ckw&#xe4;rts von der &#xbb;Node-Invocation&#xab; her kl&#xe4;rt">
<icon BUILTIN="info"/>
@ -100693,10 +100764,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1701490692653" ID="ID_67997206" MODIFIED="1701490757553" TEXT="alle bisherigen Tests packen die Verifikations-Payload in die InvocationInstanceID">
<icon BUILTIN="idea"/>
</node>
<node COLOR="#8b68cb" CREATED="1702173864062" ID="ID_1204469945" MODIFIED="1702173882135" TEXT="also erstmal weiter mogeln...">
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
<node CREATED="1701488366430" ID="ID_1676473919" MODIFIED="1701488373146" TEXT="Steuerung des Zugriffs">
</node>
<node COLOR="#435e98" CREATED="1701488366430" ID="ID_1676473919" MODIFIED="1702158165070" TEXT="Steuerung des Zugriffs">
<node CREATED="1701488374014" ID="ID_923328966" MODIFIED="1701488576222">
<richcontent TYPE="NODE"><html>
<head/>
@ -100744,7 +100818,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1701490522375" ID="ID_661863679" MODIFIED="1701490537754" TEXT="es gibt keinen offensichtlichen Zeit-Bezug">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1701490522375" ID="ID_661863679" MODIFIED="1702158153457" TEXT="es gibt keinen offensichtlichen Zeit-Bezug">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1701490556823" ID="ID_1224574723" MODIFIED="1701490575134" TEXT="die Nodes sollten nach Layer-Ordnung behandelt werden"/>
<node CREATED="1701490603497" ID="ID_1528195432" MODIFIED="1701490623330" TEXT="&#x27f9; bedeutet: aus der Zeit l&#xe4;&#xdf;t sich nicht die Node rekonstruieren"/>
@ -100784,7 +100858,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1701644821415" ID="ID_819606175" MODIFIED="1701644833217" TEXT="die &#xdc;bersetzung wird komplett in Helper-Funktionen verborgen"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701492130949" ID="ID_675763294" MODIFIED="1701493055702" TEXT="Abl&#xe4;ufe zum Aufruf">
<node COLOR="#435e98" CREATED="1701492130949" ID="ID_675763294" MODIFIED="1702158163395" TEXT="Abl&#xe4;ufe zum Aufruf">
<icon BUILTIN="info"/>
<node CREATED="1701492140931" ID="ID_1320296040" MODIFIED="1701492145760" TEXT="Szenario vorbereiten">
<node CREATED="1701492296608" ID="ID_704886543" MODIFIED="1701492301635" TEXT="Topologie generieren"/>
@ -100841,13 +100915,16 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1701492263484" ID="ID_907709182" MODIFIED="1701492290404" TEXT="hier geeignete Continuation-Closure vorsehen"/>
</node>
<node CREATED="1701492216738" ID="ID_70908232" MODIFIED="1701492227198" TEXT="auf Vollzugs-Notification warten">
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1701492802252" ID="ID_462409370" MODIFIED="1701492809108" TEXT="woher kommt die? wer macht die?">
<node COLOR="#435e98" CREATED="1701492802252" ID="ID_462409370" MODIFIED="1702158116231" TEXT="woher kommt die? wer macht die?">
<icon BUILTIN="help"/>
<node CREATED="1701492811689" ID="ID_1542455064" MODIFIED="1701492825844" TEXT="wir starten hier keine Threads">
<icon BUILTIN="stop-sign"/>
</node>
<node CREATED="1701492828257" ID="ID_1372403993" MODIFIED="1701492835845" TEXT="also kann es nur aus dem Meta-Job kommen"/>
<node CREATED="1701492899063" ID="ID_261543502" MODIFIED="1701492907570" TEXT="der k&#xf6;nnte eine Closure ausf&#xfc;hren oder eine Flag setzen"/>
<node COLOR="#338800" CREATED="1702158107618" ID="ID_1165563707" MODIFIED="1702158114247" TEXT="genau so umgesetzt">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#5b280f" CREATED="1701492932866" ID="ID_331874903" MODIFIED="1701805809979" TEXT="man k&#xf6;nnte hier fest ein wait()-notify() codieren">
<icon BUILTIN="button_cancel"/>
@ -100901,7 +100978,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1701549002234" ID="ID_1561610431" MODIFIED="1701735925477" TEXT="Design-Fragen zu kl&#xe4;ren">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1701550180973" ID="ID_809373895" MODIFIED="1701838329203" TEXT="wie verarbeiten wir Prerequisites?">
<node COLOR="#435e98" CREATED="1701550180973" FOLDED="true" ID="ID_809373895" MODIFIED="1701838329203" TEXT="wie verarbeiten wir Prerequisites?">
<icon BUILTIN="help"/>
<node CREATED="1701550315571" ID="ID_1778692014" MODIFIED="1701550322317" TEXT="Activity-Term-API">
<node CREATED="1701550323615" ID="ID_7308108" MODIFIED="1701550333725" TEXT="wir brauchen f&#xfc;r beide einen ActivityTerm"/>
@ -100942,7 +101019,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<font NAME="SansSerif" SIZE="11"/>
</node>
</node>
<node COLOR="#338800" CREATED="1701814584902" ID="ID_1483667434" MODIFIED="1701814756796" TEXT="&#x27f9; weitere Komponente: UninitialisedDynBlock">
<node COLOR="#338800" CREATED="1701814584902" FOLDED="true" ID="ID_1483667434" MODIFIED="1701814756796" TEXT="&#x27f9; weitere Komponente: UninitialisedDynBlock">
<icon BUILTIN="button_ok"/>
<node CREATED="1701814636846" ID="ID_1886070155" MODIFIED="1701814655345" TEXT="wie ein unique_ptr mit einem rohen Array"/>
<node CREATED="1701814656141" ID="ID_947012950" MODIFIED="1701814670398" TEXT="tricky... aligned heap storage">
@ -100974,10 +101051,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1701550085813" ID="ID_1532623231" MODIFIED="1701838325982" TEXT="wie greift der Meta-Job auf den Schedulerer zu?">
<node COLOR="#435e98" CREATED="1701550085813" FOLDED="true" ID="ID_1532623231" MODIFIED="1702158278242" TEXT="wie greift der Meta-Job auf den Schedulerer zu?">
<icon BUILTIN="help"/>
<node CREATED="1701630398320" ID="ID_519354189" MODIFIED="1701630417244" TEXT="der reale Meta-Planer-Job wird &#xfc;ber einen Scheduler-Service (DI) gehen"/>
<node CREATED="1701630418928" ID="ID_456698721" MODIFIED="1701630480580" TEXT="das w&#xfc;rde aber das Test-Setup verkomplizieren und behindern"/>
<node CREATED="1702158263717" ID="ID_592990587" MODIFIED="1702158276168" TEXT="also der Scheduler als direkte Referenz"/>
</node>
</node>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1701630880013" ID="ID_1011967668" MODIFIED="1701630892763" TEXT="es ist ein kontrolliertes Test-Setup">
@ -101397,7 +101475,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1702012060672" ID="ID_1038613808" MODIFIED="1702094473135" TEXT="Level-Berechnung pr&#xe4;ziser machen">
<arrowlink COLOR="#9e5576" DESTINATION="ID_53360642" ENDARROW="Default" ENDINCLINATION="396;-17;" ID="Arrow_ID_1980379788" STARTARROW="None" STARTINCLINATION="78;6;"/>
<arrowlink COLOR="#55619e" DESTINATION="ID_53360642" ENDARROW="Default" ENDINCLINATION="396;-17;" ID="Arrow_ID_1980379788" STARTARROW="None" STARTINCLINATION="78;6;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1702080547549" ID="ID_1932900692" MODIFIED="1702094466919" TEXT="Continuation bekommt tats&#xe4;chlich abgeschlossenen Level">
<linktarget COLOR="#6d7a8a" DESTINATION="ID_1932900692" ENDARROW="Default" ENDINCLINATION="-39;-66;" ID="Arrow_ID_943720507" SOURCE="ID_1161585807" STARTARROW="None" STARTINCLINATION="222;11;"/>
@ -101475,7 +101553,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1702012570378" ID="ID_53360642" MODIFIED="1702097659472" TEXT="damit aber auch bessere Zeit-Steuerung m&#xf6;glich">
<linktarget COLOR="#9e5576" DESTINATION="ID_53360642" ENDARROW="Default" ENDINCLINATION="396;-17;" ID="Arrow_ID_1980379788" SOURCE="ID_1038613808" STARTARROW="None" STARTINCLINATION="78;6;"/>
<linktarget COLOR="#55619e" DESTINATION="ID_53360642" ENDARROW="Default" ENDINCLINATION="396;-17;" ID="Arrow_ID_1980379788" SOURCE="ID_1038613808" STARTARROW="None" STARTINCLINATION="78;6;"/>
<linktarget COLOR="#698dd2" DESTINATION="ID_53360642" ENDARROW="Default" ENDINCLINATION="721;39;" ID="Arrow_ID_532387874" SOURCE="ID_1232068198" STARTARROW="None" STARTINCLINATION="218;-1266;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1702096181597" ID="ID_1821157031" MODIFIED="1702097660853" TEXT="wird bereits bei der Initialisierung vorberechnet">