Chain-Load: prepare infrastructure for computational load

Within Chain-Load, the infrastructure to add this crucial feature
is minimal: each node gets a `weight` parameter, which is assigned
using another RandomDraw-Rule (by default `weight==0`).

The actual computation load will be developed as a separate component
and tied in from the node calculation job functor.
This commit is contained in:
Fischlurch 2023-12-09 03:13:48 +01:00
parent fe6f2af7bb
commit fcfdf97853
3 changed files with 166 additions and 11 deletions

View file

@ -84,6 +84,7 @@ namespace test {
showcase_SeedChains();
showcase_PruneChains();
showcase_StablePattern();
verify_computation_load();
verify_reseed_recalculate();
verify_scheduling_setup();
}
@ -129,7 +130,7 @@ SHOW_EXPR(testLoad.getHash())
Node n0; // Default-created empty Node
CHECK (n0.hash == 0);
CHECK (n0.level == 0);
CHECK (n0.repeat == 0);
CHECK (n0.weight == 0);
CHECK (n0.pred.size() == 0 );
CHECK (n0.succ.size() == 0 );
CHECK (n0.pred == Node::Tab{0});
@ -860,6 +861,20 @@ SHOW_EXPR(testLoad.getHash())
/** @test WIP verify calibration of a configurable computational load.
* @todo WIP 12/23 🔁 define 🔁 implement
*/
void
verify_computation_load()
{
ComputationalLoad cpuLoad;
}
/** @test set and propagate seed values and recalculate all node hashes.
* @remark This test uses parameter rules with some expansion and a
* pruning rule with 60% probability. This setup is known to
@ -878,6 +893,7 @@ SHOW_EXPR(testLoad.getHash())
ChainLoad16 graph{32};
graph.expansionRule(graph.rule().probability(0.8).maxVal(1))
.pruningRule(graph.rule().probability(0.6))
.weightRule((graph.rule().probability(0.5)))
.buildToplolgy();
CHECK (8 == graph.allNodes().filter(isStartNode).count());
@ -907,12 +923,16 @@ SHOW_EXPR(testLoad.getHash())
auto& [a,b,c,d] = *group;
CHECK (isStart(a));
CHECK (isInner(b));
CHECK (not a->weight);
CHECK (not b->weight);
if (b->succ.size() == 2)
{
CHECK (isExit(c));
CHECK (isExit(d));
CHECK (c->hash == 0xAEDC04CFA2E5B999);
CHECK (d->hash == 0xAEDC04CFA2E5B999);
CHECK (c->weight == 4);
CHECK (d->weight == 4);
}
else
{ // the last chunk is wired differently

View file

@ -213,7 +213,7 @@ namespace test {
};
size_t hash;
size_t level{0}, repeat{0};
size_t level{0}, weight{0};
Tab pred{0}, succ{0};
Node(size_t seed =0)
@ -224,7 +224,7 @@ namespace test {
clear()
{
hash = 0;
level = repeat = 0;
level = weight = 0;
pred.clear();
succ.clear();
}
@ -296,6 +296,7 @@ namespace test {
Rule expansionRule_{};
Rule reductionRule_{};
Rule pruningRule_ {};
Rule weightRule_ {};
Node* frontNode() { return &nodes_[0]; }
Node* afterNode() { return &nodes_[numNodes_]; }
@ -387,6 +388,13 @@ namespace test {
return move(*this);
}
TestChainLoad&&
weightRule (Rule r)
{
weightRule_ = move(r);
return move(*this);
}
/** Abbreviation for starting rules */
static Rule rule() { return Rule(); }
@ -466,6 +474,7 @@ namespace test {
Transiently originalReductionRule{reductionRule_};
Transiently originalseedingRule {seedingRule_};
Transiently originalPruningRule {pruningRule_};
Transiently originalWeightRule {weightRule_};
// prepare building blocks for the topology generation...
auto moreNext = [&]{ return next->size() < maxFan; };
@ -495,6 +504,7 @@ namespace test {
for (Node* o : *curr)
{ // follow-up on all Nodes in current level...
o->calculate();
o->weight = apply (weightRule_,o);
if (apply (pruningRule_,o))
continue; // discontinue
size_t toSeed = apply (seedingRule_, o);
@ -613,7 +623,9 @@ namespace test {
for (Node& n : allNodes())
{
size_t i = nodeID(n);
nodes += node(i).label(toString(i)+": "+showHashLSB(n.hash))
string tag{toString(i)+": "+showHashLSB(n.hash)};
if (n.weight) tag +="."+toString(n.weight);
nodes += node(i).label(tag)
.style(i==0 ? BOTTOM
:isnil(n.pred)? SEED
:isnil(n.succ)? TOP
@ -1054,6 +1066,20 @@ namespace test {
/* ========= Configurable Computational Load ========= */
/**
* A calibratable CPU load to be invoked from a node job functor.
*/
class ComputationalLoad
{
public:
};
/* ========= Render Job generation and Scheduling ========= */
/**

View file

@ -96754,6 +96754,16 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="idea"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1702180165409" ID="ID_168687387" MODIFIED="1702180474436" TEXT="verify_computation_load">
<linktarget COLOR="#c26a36" DESTINATION="ID_168687387" ENDARROW="Default" ENDINCLINATION="-214;715;" ID="Arrow_ID_917319622" SOURCE="ID_257805938" STARTARROW="None" STARTINCLINATION="-169;-474;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1702180170904" ID="ID_1257116598" MODIFIED="1702180207372" TEXT="pr&#xfc;ft die konfigurierbare CPU-Last">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1702180201092" ID="ID_852013156" MODIFIED="1702180207372" TEXT="verifiziert den Eichungs-Proze&#xdf;">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node COLOR="#338800" CREATED="1701374229504" ID="ID_1338953492" MODIFIED="1701374413822" TEXT="reseed_recalculate">
<linktarget COLOR="#51c3bc" DESTINATION="ID_1338953492" ENDARROW="Default" ENDINCLINATION="-572;68;" ID="Arrow_ID_1159113647" SOURCE="ID_193483520" STARTARROW="None" STARTINCLINATION="-272;-345;"/>
<icon BUILTIN="button_ok"/>
@ -96773,6 +96783,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<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 COLOR="#338800" CREATED="1702170588580" ID="ID_1963766841" MODIFIED="1702180426043" TEXT="Einbindung des &#xbb;weight&#xab;-Parameters verifizieren">
<linktarget COLOR="#68cb83" DESTINATION="ID_1963766841" ENDARROW="Default" ENDINCLINATION="549;30;" ID="Arrow_ID_1920696609" SOURCE="ID_1603893065" STARTARROW="None" STARTINCLINATION="47;-145;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1701661921354" ID="ID_1422491771" MODIFIED="1701838435138" TEXT="verify_scheduling_setup">
<icon BUILTIN="button_ok"/>
@ -99417,8 +99431,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1699746891934" ID="ID_1003055056" MODIFIED="1699803875494" TEXT="Node">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1699746898954" ID="ID_1174327209" MODIFIED="1699803865847" TEXT="Datenstruktur">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1699746898954" ID="ID_1174327209" MODIFIED="1702180967086" TEXT="Datenstruktur">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1699746902068" ID="ID_1045369485" MODIFIED="1699754419615" TEXT="maxFan ist ein Template-Param">
<icon BUILTIN="idea"/>
</node>
@ -99433,15 +99447,18 @@ 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="1699803850765" ID="ID_1046832305" MODIFIED="1699813995892" TEXT="weitere Payload">
<linktarget COLOR="#16a827" DESTINATION="ID_1046832305" ENDARROW="Default" ENDINCLINATION="72;59;" ID="Arrow_ID_1961863856" SOURCE="ID_944363802" STARTARROW="None" STARTINCLINATION="-128;-105;"/>
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1699803850765" ID="ID_1046832305" MODIFIED="1702180966052" TEXT="weitere Payload">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1699803858055" ID="ID_598864815" MODIFIED="1699803859975" TEXT="hash">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1699813952833" ID="ID_1674807101" MODIFIED="1699813955421" TEXT="level">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1699803850765" ID="ID_1466090082" MODIFIED="1702180964375" TEXT="weight">
<linktarget COLOR="#16a827" DESTINATION="ID_1466090082" ENDARROW="Default" ENDINCLINATION="77;19;" ID="Arrow_ID_1920139323" SOURCE="ID_944363802" STARTARROW="None" STARTINCLINATION="-128;-105;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1699747423371" ID="ID_1818811688" MODIFIED="1699803681498" TEXT="Berechnung">
@ -99455,10 +99472,102 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699747521150" ID="ID_356376425" MODIFIED="1699747533637" TEXT="kann durch Repetitionen aufwendig gemacht werden">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1699813962931" ID="ID_944363802" MODIFIED="1699814010982" TEXT="repetition-Count in der Node speichern">
<arrowlink COLOR="#16a827" DESTINATION="ID_1046832305" ENDARROW="Default" ENDINCLINATION="72;59;" ID="Arrow_ID_1961863856" STARTARROW="None" STARTINCLINATION="-128;-105;"/>
<node COLOR="#338800" CREATED="1699813962931" ID="ID_944363802" MODIFIED="1702174785856" TEXT="repetition-Count in der Node speichern">
<arrowlink COLOR="#16a827" DESTINATION="ID_1466090082" ENDARROW="Default" ENDINCLINATION="77;19;" ID="Arrow_ID_1920139323" STARTARROW="None" STARTINCLINATION="-128;-105;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#5b280f" CREATED="1702174806912" ID="ID_624958935" MODIFIED="1702174820094" TEXT="eine Art Proof-of-Work verwenden">
<icon BUILTIN="button_cancel"/>
<node CREATED="1702174822197" ID="ID_242725180" MODIFIED="1702174986754" TEXT="das w&#xe4;re zwar cool, aber....">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
....wir m&#252;ssen hier niemandem etwas beweisen, &#252;ber die Grenzen des Unit-Testing hinausgehend:
</p>
<ul>
<li>
der Node-Hash beweist, da&#223; die Berechnung einer Node stattgefunden hat und die richtigen Ergebnisse der Vorl&#228;ufer aufgegriffen hat
</li>
<li>
ansonsten k&#246;nnen wir annehmen, da&#223; eine aufgerufene Funktion auch tats&#228;chlich l&#228;uft
</li>
<li>
und da&#223; eine Exception aus dem Job heraus einen&#160;Worker herunterf&#228;hrt und eine Scheduler-Emergency ausl&#246;st
</li>
</ul>
</body>
</html></richcontent>
</node>
<node CREATED="1702174987863" ID="ID_496745559" MODIFIED="1702175237022" TEXT="auch sehr praktische Gr&#xfc;nde sprechen dagegen">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<ul>
<li>
da die Topologie vom Hash abh&#228;ngen soll, bekommen wir es hier mit Eierlegenden und Hennen zu tun...
</li>
<li>
au&#223;erdem w&#252;rde dadurch bereits auch die Topologie-Konstruktion aufwendig
</li>
<li>
und jede &#196;nderung der Gewichte w&#252;rde die Topologie komplett &#228;ndern
</li>
</ul>
<p>
&#9654; das zuletzt genannte Argument hat den Ausschlag gegeben, auf Proof-of-Work zu verzichten, denn es ist ausgesprochen m&#252;hsam, eine bestimmte gew&#252;nschte Topologie zu &#8222;finden&#8220; &#8212; jedwede &#196;nderung wirkt chaotisch (genauso wie bereits die geringste Seed-&#196;nderung eine komplett andere Form zufolge hat)
</p>
</body>
</html></richcontent>
<icon BUILTIN="clanbomber"/>
<icon BUILTIN="stop-sign"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1702175359697" ID="ID_514427629" MODIFIED="1702175909285" TEXT="entwickle eine einfache reine lokale CPU-Last">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1702175912809" ID="ID_163082441" MODIFIED="1702176005420" TEXT="als eigenst&#xe4;ndige Komponente realisiert">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
wird dann von dem RandomChainCalcFunctor eingebunden &#8212; und <i>nicht </i>von der Node; es wird damit strikt ein Detail des tats&#228;chlichen Scheduler-Laufs
</p>
</body>
</html></richcontent>
<node CREATED="1702180522766" ID="ID_316625699" MODIFIED="1702180526303" TEXT="ComputationLoad"/>
</node>
<node CREATED="1702176870348" ID="ID_1843992678" MODIFIED="1702176878242" TEXT="soll statisch kalibrierbar sein">
<node CREATED="1702176883018" ID="ID_1063649357" MODIFIED="1702177162816" TEXT="auf 1 LoadUnit &#x2259; 500ms"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1702177164613" ID="ID_1363806337" MODIFIED="1702177174397" TEXT="potentiell schwieriges Thema">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1702177209415" ID="ID_636968719" MODIFIED="1702177221684" TEXT="das Lastverhalten von modernen Computern ist nicht linear"/>
<node CREATED="1702177263500" ID="ID_1442486267" MODIFIED="1702177272676" TEXT="der Arbeitspunkt kann extrem stark vom System abh&#xe4;ngen"/>
<node CREATED="1702177960453" ID="ID_1625146144" MODIFIED="1702177990715" TEXT="der konkrete Aufruf bedingt einen zus&#xe4;tzlichen, schwer kalkulierbaren Overhead"/>
</node>
<node CREATED="1702177290852" ID="ID_67369431" MODIFIED="1702177302130" TEXT="mu&#xdf; daf&#xfc;r mindestends 3 microbenchmark-L&#xe4;ufe machen">
<node CREATED="1702177304850" ID="ID_807191919" MODIFIED="1702177310093" TEXT="eine Grobmessung"/>
<node CREATED="1702177310801" ID="ID_1861526014" MODIFIED="1702177325890" TEXT="eine Feinmessung nach erster Kalibrierung"/>
<node CREATED="1702177355580" ID="ID_592613013" MODIFIED="1702177360463" TEXT="eine Best&#xe4;tigungsmessung"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1702180295927" ID="ID_773261601" MODIFIED="1702180308206" TEXT="Komponente testen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1702170514679" ID="ID_1603893065" MODIFIED="1702180426043" TEXT="Infrastruktur f&#xfc;r einen &#xbb;weight&#xab;-Parameter">
<arrowlink COLOR="#68cb83" DESTINATION="ID_1963766841" ENDARROW="Default" ENDINCLINATION="549;30;" ID="Arrow_ID_1920696609" STARTARROW="None" STARTINCLINATION="47;-145;"/>
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1702180446234" ID="ID_257805938" MODIFIED="1702180507400" TEXT="Last und Eichung">
<arrowlink COLOR="#c26a36" DESTINATION="ID_168687387" ENDARROW="Default" ENDINCLINATION="-214;715;" ID="Arrow_ID_917319622" STARTARROW="None" STARTINCLINATION="-169;-474;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1702178041646" ID="ID_1422218309" MODIFIED="1702178058926" TEXT="f&#xfc;r den konkreten Test wird dann eine Skalen-Stufe gew&#xe4;hlt">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1702178070732" ID="ID_1943958168" MODIFIED="1702178083613" TEXT="per RandomDrawRegel &#x27f6; Node"/>
<node CREATED="1702178084682" ID="ID_1482968846" MODIFIED="1702178112522" TEXT="Skalenfaktor f&#xfc;r den ganzen Test"/>
<node CREATED="1702178113354" ID="ID_1844351587" MODIFIED="1702178121761" TEXT="der Eichfaktor aus der Kalibrierung"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1699756460900" ID="ID_1877216077" MODIFIED="1699758391567" TEXT="Implementierung per boost-Hash">
<icon BUILTIN="yes"/>