Scheduler-test: fine-tuning of result presentation (Gnuplot)

Visual tweaks specific to this measurement setup
 * include a numeric representation of the regression line
 * include descriptive axis labels
 * improve the key names to clarify their meaning
 * heuristic code for the x-ticks
Package these customisations as a helper function into the measurement tool
This commit is contained in:
Fischlurch 2024-04-08 18:44:46 +02:00
parent 8e33194882
commit 3517ab6965
4 changed files with 129 additions and 54 deletions

View file

@ -93,7 +93,7 @@ set style line 3 linetype 2 linewidth 2 linecolor rgb '#0B7FCC'
set style line 4 linetype 6 linewidth 2 linecolor rgb '#37999D'
set style line 5 linetype 7 linewidth 2 linecolor rgb '#248269'
set style line 6 linetype 13 linewidth 2 linecolor rgb '#00C443'
set style line 7 linetype 12 linewidth 2 linecolor rgb '#B86E1C'
set style line 7 linetype 12 linewidth 2 linecolor rgb '#EBE83E'
set style line 8 linetype 5 linewidth 2 linecolor rgb '#762C14'
set style line 9 linetype 4 linewidth 2 linecolor rgb '#AA0519'
@ -150,8 +150,7 @@ ${if Xrange}
set xrange [${Xrange}] ${endif
}${if Yrange}
set yrange [${Yrange}] ${endif
}
set key autotitle columnheader tmargin
}set key autotitle columnheader tmargin
)~";
@ -172,7 +171,10 @@ ${else
}# regression line function derived from data
regLine(x) = STATS_slope * x + STATS_intercept
${end if
}
}#
regLabel = sprintf("Model: %3.2f·p + %3.2f", STATS_slope, STATS_intercept)
set key horizontal width -4
${if Xtics
}set xtics ${Xtics}
${else}${if Xrange}${else
@ -193,14 +195,14 @@ if (plots > 1) {
#
####---------Scatter-Regression-Plot-------------
plot $RunData using 1:2 with points linestyle 1, \
regLine(x) with line linestyle 9
regLine(x) with line linestyle 9 title regLabel
if (plots > 1) {
# switch off decorations for secondary diagram
unset arrow 10
unset arrow 11
set border 2+8
set key bmargin
set key bmargin vertical
${if Y2range}
set yrange [${Y2range}]
${endif}

View file

@ -32,7 +32,6 @@
#include "lib/time/timevalue.hpp"
#include "lib/format-string.hpp"
#include "lib/format-cout.hpp"
#include "lib/gnuplot-gen.hpp"
#include "lib/test/diagnostic-output.hpp"//////////////////////////TODO work in distress
//#include "lib/format-string.hpp"
#include "lib/test/transiently.hpp"
@ -391,11 +390,11 @@ namespace test {
cpuLoad.calibrate();
//////////////////////////////////////////////////////////////////TODO for development only
MARK_TEST_FUN
TestChainLoad testLoad{64};
testLoad.configure_isolated_nodes()
.buildTopology()
.printTopologyDOT()
.printTopologyStatistics();
// TestChainLoad testLoad{64};
// testLoad.configure_isolated_nodes()
// .buildTopology()
// .printTopologyDOT()
// .printTopologyStatistics();
struct Setup
: StressRig, bench::LoadPeak_ParamRange_Evaluation
@ -418,10 +417,8 @@ namespace test {
auto results = StressRig::with<Setup>()
.perform<bench::ParameterRange> (2,64);
auto csv = results.renderCSV();
cout << csv <<endl;
cout << "───═══───═══───═══───═══───═══───═══───═══───═══───═══───═══───"<<endl;
cout << lib::gnuplot_gen::scatterRegression(csv);
cout << Setup::renderGnuplot (results);
}

View file

@ -141,24 +141,21 @@
#define VAULT_GEAR_TEST_STRESS_TEST_RIG_H
#include "vault/common.hpp"
#include "test-chain-load.hpp"
#include "lib/binary-search.hpp"
//#include "test-chain-load.hpp"
//#include "lib/test/transiently.hpp"
#include "lib/test/transiently.hpp"
#include "vault/gear/scheduler.hpp"
#include "lib/time/timevalue.hpp"
//#include "lib/iter-explorer.hpp"
#include "lib/meta/function.hpp"
#include "lib/format-string.hpp"
#include "lib/format-cout.hpp"//////////////////////////TODO RLY?
#include "lib/format-cout.hpp"
#include "lib/gnuplot-gen.hpp"
#include "lib/stat/data.hpp"
#include "lib/util.hpp"
//#include <functional>
#include <algorithm>
#include <utility>
//#include <memory>
//#include <string>
#include <vector>
#include <tuple>
#include <array>
@ -551,14 +548,14 @@ namespace test {
Column<double> time {"result time"};
Column<double> conc {"concurrency"};
Column<double> jobtime {"avg jobtime"};
Column<double> overhead{"overhead"};
Column<double> impeded {"avg impeded"};
auto allColumns()
{ return std::tie(param
,time
,conc
,jobtime
,overhead
,impeded
);
}
};
@ -573,8 +570,30 @@ namespace test {
data.param = param;
data.time = stat.coveredTime / 1000;
data.conc = stat.avgConcurrency;
data.jobtime = stat.activeTime/stat.activationCnt;
data.overhead = stat.timeAtConc(1) / stat.activationCnt; ////OOO not really clear if sensible
data.jobtime = stat.activeTime / stat.activationCnt;
data.impeded = (stat.timeAtConc(1) + stat.timeAtConc(0))/stat.activationCnt;
}
static string
renderGnuplot (Table const& results)
{
using namespace lib::gnuplot_gen;
string csv = results.renderCSV();
Param maxParam = * std::max_element (results.param.data.begin(), results.param.data.end());
Param xtics = maxParam > 500? 50
: maxParam > 200? 20
: maxParam > 100? 10
: 5;
return scatterRegression(
ParamRecord().set (KEY_CSVData, csv)
.set (KEY_TermSize, "600,600")
.set (KEY_Xtics, int64_t(xtics))
.set (KEY_Xlabel, "load size ⟶ number of jobs")
.set (KEY_Ylabel, "active time ⟶ ms")
.set (KEY_Y2label, "concurrent threads ⟶")
.set (KEY_Y3label, "avg job time ⟶ µs")
);
}
};
//

View file

@ -111897,7 +111897,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1708651353088" ID="ID_9850721" MODIFIED="1708651367397" TEXT="erg&#xe4;nzende Me&#xdf;methode : lineare Regression">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1708651381229" ID="ID_34422716" MODIFIED="1708651432845" TEXT="Ansatz: Verhaltesmuster durch anderen Me&#xdf;-Ansatz best&#xe4;tigen">
<node COLOR="#435e98" CREATED="1708651381229" ID="ID_34422716" MODIFIED="1712594284191" TEXT="Ansatz: Verhaltesmuster durch anderen Me&#xdf;-Ansatz best&#xe4;tigen">
<icon BUILTIN="idea"/>
<node CREATED="1708651455035" ID="ID_154910298" MODIFIED="1708651476794" TEXT="das Kriterium &#xbb;Schedule gebrochen&#xab; ist sehr spezifisch">
<icon BUILTIN="messagebox_warning"/>
@ -111941,7 +111941,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1708652417482" ID="ID_350523685" MODIFIED="1708652439760" TEXT="brauche daf&#xfc;r ein anderes Me&#xdf;werkzeug">
<node COLOR="#338800" CREATED="1708652417482" ID="ID_350523685" MODIFIED="1712594063905" TEXT="brauche daf&#xfc;r ein anderes Me&#xdf;werkzeug">
<icon BUILTIN="yes"/>
<node CREATED="1708652645156" ID="ID_1558350785" MODIFIED="1708652664818" TEXT="&#xbb;ParameterRangeBench&#xab;">
<icon BUILTIN="info"/>
@ -112033,8 +112033,18 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<linktarget COLOR="#66a0bc" DESTINATION="ID_1813891417" ENDARROW="Default" ENDINCLINATION="221;-14;" ID="Arrow_ID_305160226" SOURCE="ID_1762169754" STARTARROW="None" STARTINCLINATION="246;-21;"/>
</node>
<node CREATED="1712238458491" ID="ID_112442438" MODIFIED="1712238472711" TEXT="darauf statistische Auswertungen / lineare Regression"/>
<node CREATED="1712238473499" ID="ID_109820250" MODIFIED="1712238539719" TEXT="Darstellung als Gnuplot">
<arrowlink COLOR="#4a8bb7" DESTINATION="ID_561451802" ENDARROW="Default" ENDINCLINATION="330;-389;" ID="Arrow_ID_787725069" STARTARROW="None" STARTINCLINATION="191;23;"/>
<node COLOR="#435e98" CREATED="1712238473499" ID="ID_109820250" MODIFIED="1712594272496">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
Darstellung als <b>Gnuplot</b>-Diagramm aufbereitet
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#4a8bb7" DESTINATION="ID_561451802" ENDARROW="Default" ENDINCLINATION="330;-389;" ID="Arrow_ID_787725069" STARTARROW="None" STARTINCLINATION="67;4;"/>
</node>
</node>
</node>
@ -112057,9 +112067,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1712241515362" ID="ID_326943240" MODIFIED="1712241527541" TEXT="kann durchaus auch regul&#xe4;res Schedule sein"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710079791943" ID="ID_1402055509" MODIFIED="1710080437833" TEXT="Integration">
<linktarget COLOR="#9d4168" DESTINATION="ID_1402055509" ENDARROW="Default" ENDINCLINATION="-761;122;" ID="Arrow_ID_397225736" SOURCE="ID_1781115298" STARTARROW="None" STARTINCLINATION="-165;-9;"/>
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1710079791943" ID="ID_1402055509" MODIFIED="1712594169086" TEXT="Integration der Auswertung und Darstellung">
<linktarget COLOR="#3486b2" DESTINATION="ID_1402055509" ENDARROW="Default" ENDINCLINATION="-776;46;" ID="Arrow_ID_397225736" SOURCE="ID_1781115298" STARTARROW="None" STARTINCLINATION="-165;-9;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1710079800390" FOLDED="true" ID="ID_746814828" MODIFIED="1711983575595" TEXT="meine Statistik- und CSV Hilfsmittel von Yoshimi-Test einbringen">
<linktarget COLOR="#1a2cc4" DESTINATION="ID_746814828" ENDARROW="Default" ENDINCLINATION="-1079;-52;" ID="Arrow_ID_1221012838" SOURCE="ID_1377396763" STARTARROW="None" STARTINCLINATION="1439;113;"/>
<icon BUILTIN="button_ok"/>
@ -114722,8 +114732,8 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1712165247528" ID="ID_1095964212" MODIFIED="1712190796632" TEXT="Regression berechnen und visualisieren">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1712165247528" ID="ID_1095964212" MODIFIED="1712594038147" TEXT="Regression berechnen und visualisieren">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1712180140911" ID="ID_1277334109" MODIFIED="1712190777261" TEXT="mu&#xdf; Parameter-&#xdc;beragbe und Daten-R&#xfc;ckgabe &#xfc;berarbeiten">
<icon BUILTIN="button_ok"/>
<node CREATED="1712180159277" ID="ID_1547350046" MODIFIED="1712180172746" TEXT="bisher: std::pair&lt;PAR, zeit&gt;"/>
@ -114732,7 +114742,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1712183753046" ID="ID_1287892532" MODIFIED="1712183793104" TEXT="DataFile als RVO-Parameter einf&#xfc;hren"/>
<node CREATED="1712183793908" ID="ID_1299689687" MODIFIED="1712183813221" TEXT="Referenz darauf anstatt dem Tupel in die runTest(data) geben"/>
</node>
<node BACKGROUND_COLOR="#c8b6b6" COLOR="#690f14" CREATED="1712183881848" ID="ID_277756370" MODIFIED="1712539750718" TEXT="Probleme dabei...">
<node BACKGROUND_COLOR="#c8b6b6" COLOR="#690f14" CREATED="1712183881848" FOLDED="true" ID="ID_277756370" MODIFIED="1712539750718" TEXT="Probleme dabei...">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1712183893055" ID="ID_1518548729" MODIFIED="1712183902505" TEXT="Table-Def mu&#xdf; &#xf6;ffentlich werden"/>
<node CREATED="1712183903573" ID="ID_1522610699" MODIFIED="1712183933315" TEXT="der &#xbb;offen gelassene&#xab; Parameter-Typ PAR macht das alles etwas kniffelig"/>
@ -114799,7 +114809,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1712185076777" ID="ID_1271427599" MODIFIED="1712185113759" TEXT="overhead"/>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1712190824923" ID="ID_1753510801" MODIFIED="1712190852825" TEXT="unklar: &#xbb;overhead&#xab;-Messung">
<node BACKGROUND_COLOR="#ccae9d" COLOR="#990033" CREATED="1712190824923" ID="ID_1753510801" MODIFIED="1712594013171" TEXT="unklar: &#xbb;overhead&#xab;-Messung">
<icon BUILTIN="help"/>
<node CREATED="1712190864143" ID="ID_438624459" MODIFIED="1712190868082" TEXT="Aussagekraft unklar"/>
<node CREATED="1712235705069" ID="ID_1990935438" MODIFIED="1712235716317" TEXT="diverse Auswertungen m&#xf6;glich"/>
@ -114825,6 +114835,38 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<icon BUILTIN="info"/>
<node CREATED="1712235962435" ID="ID_169942944" MODIFIED="1712235968597" TEXT="nach einigem Knobeln...."/>
<node CREATED="1712235969257" ID="ID_269326004" MODIFIED="1712235980940" TEXT="ergibt das sinnvolle und weitgehend konstante Werte"/>
<node CREATED="1712593669702" ID="ID_717375896" MODIFIED="1712593698781" TEXT="dabei bleibts &#x2014; ist tats&#xe4;chlich relevant">
<icon BUILTIN="yes"/>
</node>
<node COLOR="#5b280f" CREATED="1712593700081" ID="ID_300205071" MODIFIED="1712593718579" TEXT="overhead k&#xf6;nnte man auch pro Job angeben &#x2014; ist aber nicht sinnvoll">
<icon BUILTIN="button_cancel"/>
<node CREATED="1712593727818" ID="ID_837101544" MODIFIED="1712593992752" TEXT="zum einen: dann m&#xfc;&#xdf;te man die Ordinate explizit kappen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Denn es gibt stets einige wenige <i>ganz dramatische Ausrei&#223;er, </i>die sonst die Skala so verschieben w&#252;rden, da&#223; man die eigentlichen Me&#223;werte nicht mehr sieht; ich m&#252;&#223;te also eigens wieder Anpassungs-Code schreiben, und mir eine Heuristik einfallen lassen, um die Skala zu kappen &#8212; unn&#246;tiger Aufwand f&#252;r eine nebenbei mit aufgenommene Gr&#246;&#223;e
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1712593740845" ID="ID_479430012" MODIFIED="1712593891254" TEXT="und au&#xdf;erdem: das sagt wenig &#xfc;ber die &#xbb;Arbeitsphase&#xab; aus">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...denn der Umstand, da&#223; der Overhead / Job weitgehend konstant ist, zeigt, da&#223; wir hier einen separaten Setup-Effekt haben, vermutlich n&#228;mlich vor allem die Job-Planungs-Zeit. Da wir demgegen&#252;ber <i>in der aktiven Phase sehr gut linear sind, </i>kann man diesen zus&#228;tzlichen Overhead zun&#228;chst mal als Artefakt der Me&#223;anordnung beiseite lassen (und sp&#228;ter dann mal eigens untersuchen)
</p>
</body>
</html>
</richcontent>
</node>
</node>
</node>
<node CREATED="1712235662399" ID="ID_1565221854" MODIFIED="1712235681102" TEXT="&#x201e;overhead&#x201c; ist nicht der richtige Begriff">
<node CREATED="1712235820166" ID="ID_1638446802" MODIFIED="1712235905469" TEXT="L&#xf6;sung sucht Problem">
@ -114849,7 +114891,9 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<icon BUILTIN="yes"/>
<node CREATED="1712236415206" ID="ID_494152831" MODIFIED="1712236443530" TEXT="Namen flexibilisieren"/>
<node CREATED="1712236421664" ID="ID_1114332459" MODIFIED="1712236430361" TEXT="mehrere Felder erm&#xf6;glichen"/>
<node CREATED="1712236446082" ID="ID_502918899" MODIFIED="1712236504775" TEXT="Subclassing? / mehr Baukastenprinzip?"/>
<node BACKGROUND_COLOR="#c8c0b6" CREATED="1712236446082" ID="ID_502918899" MODIFIED="1712593648305" TEXT="Subclassing? / mehr Baukastenprinzip?">
<icon BUILTIN="forward"/>
</node>
</node>
</node>
</node>
@ -115049,8 +115093,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<b>Fazit</b>: knapp am Abgrund vorbei
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<node CREATED="1712539492581" ID="ID_1123688435" MODIFIED="1712539854967" TEXT="es bleibt eine fragile und komplexe L&#xf6;sung">
<arrowlink COLOR="#485b90" DESTINATION="ID_88618902" ENDARROW="Default" ENDINCLINATION="-10;50;" ID="Arrow_ID_693388546" STARTARROW="None" STARTINCLINATION="173;12;"/>
</node>
@ -115066,8 +115109,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
und sind <i>leicht anpassbar</i>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<linktarget COLOR="#458191" DESTINATION="ID_1981096404" ENDARROW="Default" ENDINCLINATION="-160;25;" ID="Arrow_ID_784328672" SOURCE="ID_1714941979" STARTARROW="None" STARTINCLINATION="131;9;"/>
<icon BUILTIN="forward"/>
</node>
@ -115080,7 +115122,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
</node>
<node COLOR="#338800" CREATED="1712190783314" ID="ID_561451802" MODIFIED="1712238531623" TEXT="Gnuplot-Skript generieren">
<linktarget COLOR="#4a8bb7" DESTINATION="ID_561451802" ENDARROW="Default" ENDINCLINATION="330;-389;" ID="Arrow_ID_787725069" SOURCE="ID_109820250" STARTARROW="None" STARTINCLINATION="191;23;"/>
<linktarget COLOR="#4a8bb7" DESTINATION="ID_561451802" ENDARROW="Default" ENDINCLINATION="330;-389;" ID="Arrow_ID_787725069" SOURCE="ID_109820250" STARTARROW="None" STARTINCLINATION="67;4;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1712364733453" ID="ID_1252919239" MODIFIED="1712539694378" TEXT="setup in HIlfsfunktion im Stress-Test-Rig verlagen">
<icon BUILTIN="button_ok"/>
@ -115089,15 +115131,30 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
<node COLOR="#435e98" CREATED="1712539707366" ID="ID_1463647276" MODIFIED="1712539724078" TEXT="steht im Code zusammen mit der Datenauswertung"/>
</node>
<node CREATED="1712364714975" ID="ID_1343230425" MODIFIED="1712364731729" TEXT="Anpassungen">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1712364780151" ID="ID_1769816620" MODIFIED="1712364932636" TEXT="Regressions-Parameter anzeigen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#435e98" CREATED="1712364714975" ID="ID_1343230425" MODIFIED="1712594028138" TEXT="Anpassungen">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="info"/>
<node COLOR="#338800" CREATED="1712364780151" ID="ID_1769816620" MODIFIED="1712593593058" TEXT="Regressions-Parameter anzeigen">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1712587560954" ID="ID_1623350813" MODIFIED="1712593591737" TEXT="sprintf()-Funktion verwenden">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1712364901190" ID="ID_1416417622" MODIFIED="1712364932644" TEXT="sinnvolles tick-spacing f&#xfc;r diese Messung">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1712587574785" ID="ID_190382735" MODIFIED="1712593591736" TEXT="in einen zus&#xe4;tzlichen Key(Label)">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1712364920076" ID="ID_719755566" MODIFIED="1712364932645" TEXT="Achsenbeschriftungen vorbelegen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1712587585787" ID="ID_1456505633" MODIFIED="1712593591735" TEXT="diesen in eine 2. Spalte packen">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1712364901190" ID="ID_1416417622" MODIFIED="1712593595023" TEXT="sinnvolles tick-spacing f&#xfc;r diese Messung">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1712593595872" ID="ID_477321972" MODIFIED="1712593601847" TEXT="werte maxParam aus">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#435e98" CREATED="1712593602512" ID="ID_795700203" MODIFIED="1712593621972" TEXT="w&#xe4;hle gestuft 5 .. 10 .. 20 .. 50"/>
</node>
<node COLOR="#338800" CREATED="1712364920076" ID="ID_719755566" MODIFIED="1712593624367" TEXT="Achsenbeschriftungen vorbelegen">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
@ -115342,9 +115399,9 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<icon BUILTIN="forward"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710080381906" ID="ID_1781115298" MODIFIED="1710080445458" TEXT="brauche einfache Darstellbarkeit der Ergebnisse">
<arrowlink COLOR="#9d4168" DESTINATION="ID_1402055509" ENDARROW="Default" ENDINCLINATION="-761;122;" ID="Arrow_ID_397225736" STARTARROW="None" STARTINCLINATION="-165;-9;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#b6c8c1" COLOR="#338800" CREATED="1710080381906" ID="ID_1781115298" MODIFIED="1712594169086" TEXT="brauche einfache Darstellbarkeit der Ergebnisse">
<arrowlink COLOR="#3486b2" DESTINATION="ID_1402055509" ENDARROW="Default" ENDINCLINATION="-776;46;" ID="Arrow_ID_397225736" STARTARROW="None" STARTINCLINATION="-165;-9;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>