Chain-Load: validate and improve statistics

- present the weight centres relative to overall level count
- detect sub-graphs and add statistics per subgraph
- include an evaluation for ''all nodes''
- include number of levels and subgraphs
This commit is contained in:
Fischlurch 2023-11-28 22:46:59 +01:00
parent 852a86bbda
commit dd6929ccc5
2 changed files with 179 additions and 103 deletions

View file

@ -652,6 +652,7 @@ namespace test {
/* ========= Graph Statistics Evaluation ========= */
const string STAT_NODE{"node"}; ///< all nodes
const string STAT_SEED{"seed"}; ///< seed node
const string STAT_EXIT{"exit"}; ///< exit node
const string STAT_INNR{"innr"}; ///< inner node
@ -660,8 +661,9 @@ namespace test {
const string STAT_LINK{"link"}; ///< 1:1 linking node
const string STAT_KNOT{"knot"}; ///< knot (joins and forks)
const std::array KEYS = {STAT_SEED,STAT_EXIT,STAT_INNR,STAT_FORK,STAT_JOIN,STAT_LINK,STAT_KNOT};
const std::array KEYS = {STAT_NODE,STAT_SEED,STAT_EXIT,STAT_INNR,STAT_FORK,STAT_JOIN,STAT_LINK,STAT_KNOT};
const uint CAT = KEYS.size();
const uint IDX_SEED = 1; // index of STAT_SEED
namespace {
template<class NOD>
@ -669,7 +671,8 @@ namespace test {
prepareEvaluaions()
{
return std::array<std::function<uint(NOD&)>, CAT>
{ [](NOD& n){ return isStart(n);}
{ [](NOD& ){ return 1; }
, [](NOD& n){ return isStart(n);}
, [](NOD& n){ return isExit(n); }
, [](NOD& n){ return isInner(n);}
, [](NOD& n){ return isFork(n); }
@ -697,9 +700,11 @@ namespace test {
double pLW{0}; ///< average per level and level-width
double cL {0}; ///< weight centre level for this indicator
double cLW{0}; ///< weight centre level width-reduced
double sL {0}; ///< weight centre on subgraph
double sLW{0}; ///< weight centre on subgraph width-reduced
void
addPoint (uint levelID, uint width, uint items)
addPoint (uint levelID, uint sublevelID, uint width, uint items)
{
REQUIRE (levelID == data.size()); // ID is zero based
REQUIRE (width > 0);
@ -709,18 +714,32 @@ namespace test {
pLW += items / double(width);
cL += levelID * items;
cLW += levelID * items/double(width);
sL += sublevelID * items;
sLW += sublevelID * items/double(width);
}
void
closeAverages (uint nodes)
closeAverages (uint nodes, uint levels, double avgheight)
{
uint levels = data.size();
REQUIRE (levels == data.size());
REQUIRE (levels > 0);
frac = cnt / double(nodes);
cL = pL? cL/pL :0; // weighted averages: normalise to weight sum
cLW = pLW? cLW/pLW :0;
sL = pL? sL/pL :0;
sLW = pLW? sLW/pLW :0;
pL /= levels; // simple averages : normalise to number of levels
pLW /= levels;
cL /= levels-1; // weight centres : as fraction of maximum level-ID
cLW /= levels-1;
ASSERT (avgheight >= 1.0);
if (avgheight > 1.0)
{ // likewise for weight centres relative to subgraph
sL /= avgheight-1; // height is 1-based, while the contribution was 0-based
sLW /= avgheight-1;
}
else
sL = sLW = 0.5;
}
};
@ -731,7 +750,11 @@ namespace test {
{
uint nodes{0};
uint levels{0};
uint segments{1};
uint maxheight{0};
double avgheight{0};
VecU width{};
VecU sublevel{};
std::array<Indicator, CAT> indicators;
@ -744,23 +767,27 @@ namespace test {
}
void
addPoint (uint levelWidth, LevelSums& particulars)
addPoint (uint levelWidth, uint sublevelID, LevelSums& particulars)
{
levels += 1;
nodes += levelWidth;
width.push_back (levelWidth);
sublevel.push_back (sublevelID);
ASSERT (levels == width.size());
ASSERT (0 < levels);
ASSERT (0 < levelWidth);
for (uint i=0; i< CAT; ++i)
indicators[i].addPoint (levels-1, levelWidth, particulars[i]);
indicators[i].addPoint (levels-1, sublevelID, levelWidth, particulars[i]);
}
void
closeAverages()
closeAverages (uint segs, uint maxSublevelID)
{
segments = segs;
maxheight = maxSublevelID + 1;
avgheight = levels / double(segments);
for (uint i=0; i< CAT; ++i)
indicators[i].closeAverages (nodes);
indicators[i].closeAverages (nodes,levels,avgheight);
}
private:
@ -768,6 +795,7 @@ namespace test {
reserve (uint lvls)
{
width.reserve (lvls);
sublevel.reserve(lvls);
for (uint i=0; i< CAT; ++i)
{
indicators[i] = Indicator{};
@ -798,16 +826,31 @@ namespace test {
auto classify = prepareEvaluaions<Node>();
Statistic stat(totalLevels);
LevelSums particulars{0};
size_t level{0};
size_t level{0},
sublevel{0},
maxsublevel{0};
size_t segs{0};
uint width{0};
auto detectSubgraphs = [&]{ // to be called when a level is complete
if (width==1 and particulars[IDX_SEED]==1)
{ // previous level actually started new subgraph
sublevel = 0;
++segs;
}
else
maxsublevel = max (sublevel,maxsublevel);
};
for (Node& node : allNodes())
{
if (level != node.level)
{ // record statistics for previous level
stat.addPoint (width, particulars);
{// Level completed...
detectSubgraphs();
// record statistics for previous level
stat.addPoint (width, sublevel, particulars);
// switch to next time-level
++level;
++sublevel;
ENSURE (level == node.level);
particulars = LevelSums{0};
width = 0;
@ -818,19 +861,48 @@ namespace test {
particulars[i] += classify[i](node);
}
ENSURE (level = topLevel());
stat.addPoint (width, particulars);
stat.closeAverages();
detectSubgraphs();
stat.addPoint (width, sublevel, particulars);
stat.closeAverages (segs, maxsublevel);
return stat;
}
/**
* Print a tabular summary of graph characteristics
* @remark explanation of indicators
* - »node« : accounting for all nodes
* - »seed« : seed nodes start a new subgraph or side chain
* - »exit« : exit nodes produce output and have no successor
* - »innr« : inner nodes have both predecessors and successors
* - »fork« : a node linked to more than one successor
* - »join« : a node consuming data from more than one predecessor
* - »link« : a node in a linear processing chain; one input, one output
* - »LEVL« : the overall number of distinct _time levels_ in the graph
* - »SEGS« : the number of completely disjoint partial subgraphs
* - »knot« : a node which both joins data and forks out to multiple successors
* - `frac` : the percentage of overall nodes falling into this category
* - `pL` : averaged per Level
* - `pLW` : count normalised to the width at that level and then averaged per Level
* - `γL` : weight centre of this kind of node, relative to the overall graph
* - `γLW` : the same, but using the level-width-normalised value
* - `γL` : weight centre, but relative to the current subgraph or segment
* - `γLW` : same but using level-width-normalised value
* Together, these values indicates how the simulated processing load
* is structured over time, assuming that the _»Levels« are processed consecutively_
* in temporal order. The graph can unfold or contract over time, and thus nodes can
* be clustered irregularly, which can be seen from the weight centres; for that
* reason, the width-normalised variants of the indicators are also accounted for,
* since a wider graph also implies that there are more nodes of each kind per level,
* even while the actual density of this kind did not increase.
*/
template<size_t numNodes, size_t maxFan>
inline TestChainLoad<numNodes,maxFan>&&
TestChainLoad<numNodes,maxFan>::printTopologyStatistics()
{
cout << "INDI cnt frac ∅pL ∅pLW γL γLW\n";
_Fmt line{"%s %3d %3.0f%% %4.2f %4.2f %5.1f %5.1f\n"};
cout << "INDI: cnt frac ∅pL ∅pLW γL◆ γLW◆ γL⬙ γLW⬙\n";
_Fmt line{"%4s: %3d %3.0f%% %4.2f %4.2f %4.2f %4.2f %4.2f %4.2f\n"};
Statistic stat = computeGraphStatistics();
for (uint i=0; i< CAT; ++i)
{
@ -842,8 +914,15 @@ namespace test {
% indi.pLW
% indi.cL
% indi.cLW
% indi.sL
% indi.sLW
;
}
cout << _Fmt{"LEVL: %3d\n"} % stat.levels;
cout << _Fmt{"SEGS: %3d h = ∅%3.1f / max.%2d\n"}
% stat.segments
% stat.avgheight
% stat.maxheight;
cout << "───═══───═══───═══───═══───═══───═══───═══───═══───═══───═══───"
<< endl;
return move(*this);

View file

@ -99280,8 +99280,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701014034892" ID="ID_866240930" MODIFIED="1701014041643" TEXT="Topologie-Kennzahlen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1701014034892" ID="ID_866240930" MODIFIED="1701207753709" TEXT="Topologie-Kennzahlen">
<icon BUILTIN="pencil"/>
<node CREATED="1701014048994" ID="ID_1678541468" MODIFIED="1701014062212" TEXT="globale Statistik">
<node CREATED="1701014092123" ID="ID_97178406" MODIFIED="1701014096623" TEXT="Anzahl...">
<node CREATED="1701014366015" ID="ID_94760001" MODIFIED="1701014369211" TEXT="Levels"/>
@ -99410,8 +99410,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1701015081865" ID="ID_1426934946" MODIFIED="1701015088816" TEXT="average"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1701016789541" ID="ID_677587050" MODIFIED="1701140137686" TEXT="Berechnung">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1701016789541" ID="ID_677587050" MODIFIED="1701207663094" TEXT="Berechnung">
<icon BUILTIN="button_ok"/>
<node CREATED="1701016800527" ID="ID_465492261" MODIFIED="1701125333044" TEXT="auf Erweiterbarkeit abzielen">
<richcontent TYPE="NOTE"><html>
<head/>
@ -99423,126 +99423,99 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1701125376983" ID="ID_1738324890" MODIFIED="1701140134675" TEXT="Daten-Record">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1701125376983" ID="ID_1738324890" MODIFIED="1701207665699" TEXT="Daten-Record">
<icon BUILTIN="button_ok"/>
<node CREATED="1701125441964" ID="ID_418000988" MODIFIED="1701125470010" TEXT="feste Datenfelder als uint und double"/>
<node CREATED="1701125474136" ID="ID_774880220" MODIFIED="1701125477483" TEXT="Benennungs-Schema">
<node CREATED="1701126033651" ID="ID_1862774018" MODIFIED="1701126080812" TEXT="forks[lev]">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Vector mit Z&#228;hldaten indiziert nach Level
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1701125550995" ID="ID_1031639785" MODIFIED="1701126098550" TEXT="forks_cnt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Gesamt-Anzahl der Forks
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1701125560924" ID="ID_669092405" MODIFIED="1701126154803" TEXT="forks_pL">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Forks per Level &#8709;
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1701125579683" ID="ID_1639658129" MODIFIED="1701126169319" TEXT="forks_pLW">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Forks per Level-Width &#8709;
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1701125941621" ID="ID_402557156" MODIFIED="1701126253934" TEXT="forks_cL">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Forks Level-&#947;-Schwerpunkt (centre)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1701125948023" ID="ID_5366972" MODIFIED="1701126246633" TEXT="forks_cLW">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Forks Level-Width-&#947; -Schwerpunkt (centre)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1701126282617" ID="ID_283726913" MODIFIED="1701126375947" TEXT="forks_pL_trend">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
lineare Regression der forks_pL &#252;ber den Level
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1701126387036" ID="ID_691366138" MODIFIED="1701126595772" TEXT="forks_ma">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
forks moving average &#252;ber den Level
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1701126601654" ID="ID_1465309970" MODIFIED="1701126630322" TEXT="forks_pW_ma">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
forks per width moving average (&#252;ber den Level)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node CREATED="1701127574637" ID="ID_923332375" MODIFIED="1701127579225" TEXT="Struktur">
@ -99550,15 +99523,16 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1701127580038" ID="ID_856358485" MODIFIED="1701127646988" TEXT="globals">
<node CREATED="1701127588184" ID="ID_1819109646" MODIFIED="1701127599814" TEXT="Node-Z&#xe4;hler"/>
<node CREATED="1701127600974" ID="ID_173189022" MODIFIED="1701127612041" TEXT="Vector der Level-Breiten"/>
<node CREATED="1701207671619" ID="ID_914162600" MODIFIED="1701207679469" TEXT="Vector der Sublevel-Nr"/>
</node>
<node CREATED="1701127623579" ID="ID_300642202" MODIFIED="1701127644053" TEXT="indicators">
<node CREATED="1701127648856" ID="ID_1223520264" MODIFIED="1701127657990" TEXT="die Map mit den Kennzahl-Subobjekten"/>
<node CREATED="1701127648856" ID="ID_1223520264" MODIFIED="1701207689997" TEXT="das Array mit den Kennzahl-Subobjekten"/>
<node CREATED="1701128902290" ID="ID_380186539" MODIFIED="1701128917823" TEXT="String-Keys als Konstanten im Header"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1701126784469" ID="ID_1887920945" MODIFIED="1701140211229" TEXT="Rechenweg">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1701126784469" FOLDED="true" ID="ID_1887920945" MODIFIED="1701207712508" TEXT="Rechenweg">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1701126789108" ID="ID_1733334637" MODIFIED="1701126799986" TEXT="das wird verdammt repetitiv">
<icon BUILTIN="stop-sign"/>
</node>
@ -99605,12 +99579,29 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1701127520281" ID="ID_327297411" MODIFIED="1701140158553" TEXT="Abschlu&#xdf;: Gesamtzahl &#x27fc; &#x2205;">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701184912655" ID="ID_283973311" MODIFIED="1701184946768" TEXT="Zerlegung in Teilgraphen ber&#xfc;cksichtigen">
<linktarget COLOR="#7327b4" DESTINATION="ID_283973311" ENDARROW="Default" ENDINCLINATION="-138;8;" ID="Arrow_ID_468448911" SOURCE="ID_1190320888" STARTARROW="None" STARTINCLINATION="124;-10;"/>
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1701184912655" ID="ID_283973311" MODIFIED="1701207554433" TEXT="Zerlegung in Teilgraphen ber&#xfc;cksichtigen">
<linktarget COLOR="#2775b4" DESTINATION="ID_283973311" ENDARROW="Default" ENDINCLINATION="-138;8;" ID="Arrow_ID_468448911" SOURCE="ID_1190320888" STARTARROW="None" STARTINCLINATION="99;9;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1701198175838" ID="ID_921347773" MODIFIED="1701207533844" TEXT="brauche dazu den Level im Subgraphen">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#435e98" CREATED="1701198195110" ID="ID_297257670" MODIFIED="1701207537364" TEXT="den kann man an einzeln stehenden Seed-Nodes erkennen">
<icon BUILTIN="idea"/>
</node>
<node COLOR="#435e98" CREATED="1701198624560" ID="ID_475628380" MODIFIED="1701207539518" TEXT="nicht ganz einfach in der bestehenden Auswertung">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1701207483556" ID="ID_212583475" MODIFIED="1701207490753" TEXT="Ansatz: r&#xfc;ckwirkend korrigieren"/>
<node CREATED="1701207491828" ID="ID_1756897120" MODIFIED="1701207498291" TEXT="mu&#xdf; besonders am Ende aufpassen"/>
<node CREATED="1701207499835" ID="ID_1014380318" MODIFIED="1701207513173" TEXT="dann auch Maximal-H&#xf6;he der Teilgraphen mit berechnen"/>
</node>
<node CREATED="1701207438659" ID="ID_216213386" MODIFIED="1701207461929" TEXT="(aua... da waren auch noch Logik-Fehler in der Level-Behandlung)">
<font NAME="SansSerif" SIZE="11"/>
<icon BUILTIN="smiley-oh"/>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1701127540653" ID="ID_838754026" MODIFIED="1701127562922" TEXT="Berechnung-2">
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1701127540653" ID="ID_838754026" MODIFIED="1701207655660" TEXT="Berechnung-2">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_838754026" ENDARROW="Default" ENDINCLINATION="-182;27;" ID="Arrow_ID_115599837" SOURCE="ID_1769689128" STARTARROW="None" STARTINCLINATION="96;-106;"/>
<icon BUILTIN="hourglass"/>
<node CREATED="1701127545038" ID="ID_1659639199" MODIFIED="1701127560980" TEXT="(abgeleitete Berechungen h&#xf6;herer Ordnung)">
<font NAME="SansSerif" SIZE="11"/>
@ -99632,21 +99623,39 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1701016792372" ID="ID_1251453714" MODIFIED="1701184833970" TEXT="Darstellung">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1701125319870" ID="ID_1457245227" MODIFIED="1701184853119" TEXT="Statistik-Report bereitstellen">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1701016792372" ID="ID_1251453714" MODIFIED="1701207658065" TEXT="Darstellung">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1701125319870" FOLDED="true" ID="ID_1457245227" MODIFIED="1701207738012" TEXT="Statistik-Report bereitstellen">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1701184854447" ID="ID_1823077805" MODIFIED="1701184862006" TEXT="Auswertungen pro Kategorie">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701184862856" ID="ID_85653289" MODIFIED="1701184866502" TEXT="Gesamtsummen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1701184862856" ID="ID_85653289" MODIFIED="1701198088372" TEXT="Gesamtsummen">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1701184867453" ID="ID_1190320888" MODIFIED="1701184954043" TEXT="Teilgraphen ber&#xfc;cksichtigen">
<arrowlink COLOR="#7327b4" DESTINATION="ID_283973311" ENDARROW="Default" ENDINCLINATION="-138;8;" ID="Arrow_ID_468448911" STARTARROW="None" STARTINCLINATION="124;-10;"/>
<icon BUILTIN="flag-pink"/>
<node COLOR="#338800" CREATED="1701198095024" ID="ID_1116378678" MODIFIED="1701198105373" TEXT="Schwerpunkt auf Level normieren">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1701184867453" ID="ID_1190320888" MODIFIED="1701207554433" TEXT="Teilgraphen ber&#xfc;cksichtigen">
<arrowlink COLOR="#2775b4" DESTINATION="ID_283973311" ENDARROW="Default" ENDINCLINATION="-138;8;" ID="Arrow_ID_468448911" STARTARROW="None" STARTINCLINATION="99;9;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node CREATED="1701207569778" ID="ID_1769689128" MODIFIED="1701207655659" TEXT="das sollte erstmal reichen....">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...grunds&#228;tzlich w&#228;ren die wichtigsten Zeitreihen im Statistik-Report da, so da&#223; man auch noch weitreichendere Auswertungen machen k&#246;nnte &#8212; sofern das hier mal f&#252;r mehr als f&#252;r einige Lasttests verwendet wird...
</p>
</body>
</html></richcontent>
<arrowlink DESTINATION="ID_838754026" ENDARROW="Default" ENDINCLINATION="-182;27;" ID="Arrow_ID_115599837" STARTARROW="None" STARTINCLINATION="96;-106;"/>
<icon BUILTIN="yes"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1701207740691" ID="ID_1314408023" MODIFIED="1701207749626" TEXT="im Test auf Plausibilit&#xe4;t pr&#xfc;fen">
<icon BUILTIN="pencil"/>
</node>
</node>
</node>
@ -99698,27 +99707,21 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node COLOR="#435e98" CREATED="1701058881832" ID="ID_348005830" MODIFIED="1701059018446">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
sollte <i>vergleichsweise </i>einfach zu implementieren sein
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...will sagen, ich mu&#223; da nicht lang &#252;berlegen und kann es mehr oder weniger runterschreiben (auch wenn's ein paar Stunden braucht)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node COLOR="#435e98" CREATED="1701058923620" ID="ID_1761514428" MODIFIED="1701059020156" TEXT="gleiches Bauschema wie beim Filter-Iter (pull one group eagerly)">
<icon BUILTIN="idea"/>
@ -99731,29 +99734,23 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1701117373814" ID="ID_340694208" MODIFIED="1701117498363" TEXT="weil Node als move-only deklariert ist (inhaltlich sinnvoll)">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...es w&#228;re zwar nicht notwendig, da in der Node-struct lauter pointer und einfache Werte gespeichert werden; aber eine Node-Kopie w&#228;re ein hochgradig inkonsistentes Gebilde, da dann die R&#252;ck-Referenzen nicht mehr stimmen w&#252;rden.
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1701117396795" ID="ID_887215905" MODIFIED="1701117581653" TEXT="und der grouped()-Mechanismus aber values speichern mu&#xdf;">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...das folgt aus dem Design von IterExplorer insgesamt. Es w&#228;re hochgradig gef&#228;hrlich, wenn man in der Gruppe Referenzen speichern w&#252;rde. Wenn &#252;berhaupt, dann mu&#223; das explizit so angefordert werden, indem man in der Pipeline mit Pointern arbeitet.
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
</node>