Chain-Load: define bindings to use the new RandomDraw component
RandomDraw as a library component was extracted and (grossly) augmented to cut down the complexity exposed to the user of TestChainLoad. To control the generated topology, random-selected parameters must be configured, defining a probability profile; while this can be achieved with simple math, getting it correct turned out surprisingly difficult.
This commit is contained in:
parent
8b1326129a
commit
5033674b00
2 changed files with 194 additions and 3 deletions
|
|
@ -87,6 +87,7 @@
|
|||
//#include "lib/wrapper.hpp"
|
||||
#include "lib/iter-explorer.hpp"
|
||||
#include "lib/format-cout.hpp"
|
||||
#include "lib/random-draw.hpp"
|
||||
#include "lib/dot-gen.hpp"
|
||||
#include "lib/util.hpp"
|
||||
|
||||
|
|
@ -117,6 +118,8 @@ namespace test {
|
|||
using util::unConst;
|
||||
using util::toString;
|
||||
using util::showHashLSB;
|
||||
using lib::meta::_FunRet;
|
||||
|
||||
// using std::forward;
|
||||
// using std::string;
|
||||
using std::swap;
|
||||
|
|
@ -170,6 +173,7 @@ namespace test {
|
|||
|
||||
/**
|
||||
* A Generator for synthetic Render Jobs for Scheduler load testing.
|
||||
* Allocates a fixed set of #numNodes and generates connecting toplology.
|
||||
* @tparam maxFan maximal fan-in/out from a node, also limits maximal parallel strands.
|
||||
* @see TestChainLoad_test
|
||||
*/
|
||||
|
|
@ -179,6 +183,7 @@ namespace test {
|
|||
{
|
||||
|
||||
public:
|
||||
/** Graph Data structure */
|
||||
struct Node
|
||||
: util::MoveOnly
|
||||
{
|
||||
|
|
@ -263,6 +268,16 @@ namespace test {
|
|||
return hash;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/** link Node.hash to random parameter generation */
|
||||
class NodeControlBinding;
|
||||
|
||||
/** Parameter values limited [0 .. maxFan] */
|
||||
using Param = lib::Limited<size_t, maxFan>;
|
||||
|
||||
/** Topology is governed by rules for random params */
|
||||
using Rule = lib::RandomDraw<NodeControlBinding>;
|
||||
|
||||
private:
|
||||
using NodeTab = typename Node::Tab;
|
||||
|
|
@ -478,5 +493,101 @@ namespace test {
|
|||
|
||||
|
||||
|
||||
/**
|
||||
* Policy/Binding for generation of [random parameters](\ref TestChainLoad::Param)
|
||||
* by [»drawing«](\ref random-draw.hpp) based on the [node-hash](\ref TestChainLoad::Node).
|
||||
* Notably this policy template maps the ways to spell out [»Ctrl rules«](\ref TestChainLoad::Rule)
|
||||
* to configure the probability profile of the topology parameters _seeding, expansion, reduction
|
||||
* and pruning._ The RandomDraw component used to implement those rules provides a builder-DSL
|
||||
* and accepts λ-bindings in various forms to influence mapping of Node hash into result parameters.
|
||||
*/
|
||||
template<size_t numNodes, size_t maxFan>
|
||||
class TestChainLoad<numNodes,maxFan>::NodeControlBinding
|
||||
: protected std::function<Param(Node*)>
|
||||
{
|
||||
/** by default use Node-hash directly as source of randomness */
|
||||
static size_t
|
||||
defaultSrc (Node* node)
|
||||
{
|
||||
return node? node->hash:0;
|
||||
}
|
||||
|
||||
static size_t
|
||||
level (Node* node)
|
||||
{
|
||||
return node? node->level:0;
|
||||
}
|
||||
|
||||
static double
|
||||
guessHeight (size_t level)
|
||||
{ // heuristic guess, typically too low
|
||||
double expectedHeight = max (1u, numNodes/maxFan);
|
||||
return level / expectedHeight;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Adaptor to handle further mapping functions */
|
||||
template<class SIG>
|
||||
struct Adaptor
|
||||
{
|
||||
static_assert (not sizeof(SIG), "Unable to adapt given functor.");
|
||||
};
|
||||
|
||||
/** allow simple rules directly manipulating the hash value */
|
||||
template<typename RES>
|
||||
struct Adaptor<RES(size_t)>
|
||||
{
|
||||
template<typename FUN>
|
||||
static auto
|
||||
build (FUN&& fun)
|
||||
{
|
||||
return [functor=std::forward<FUN>(fun)]
|
||||
(Node* node) -> _FunRet<FUN>
|
||||
{
|
||||
return functor (defaultSrc (node));
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
/** allow rules additionally involving the height of the graph,
|
||||
* which also represents time. 1.0 refers to (guessed) _full height. */
|
||||
template<typename RES>
|
||||
struct Adaptor<RES(size_t,double)>
|
||||
{
|
||||
|
||||
template<typename FUN>
|
||||
static auto
|
||||
build (FUN&& fun)
|
||||
{
|
||||
return [functor=std::forward<FUN>(fun)]
|
||||
(Node* node) -> _FunRet<FUN>
|
||||
{
|
||||
return functor (defaultSrc (node)
|
||||
,guessHeight(level(node)));
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
/** rules may also build solely on the (guessed) height. */
|
||||
template<typename RES>
|
||||
struct Adaptor<RES(double)>
|
||||
{
|
||||
|
||||
template<typename FUN>
|
||||
static auto
|
||||
build (FUN&& fun)
|
||||
{
|
||||
return [functor=std::forward<FUN>(fun)]
|
||||
(Node* node) -> _FunRet<FUN>
|
||||
{
|
||||
return functor (guessHeight(level(node)));
|
||||
};
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
|
||||
}}} // namespace vault::gear::test
|
||||
#endif /*VAULT_GEAR_TEST_TEST_CHAIN_LOAD_H*/
|
||||
|
|
|
|||
|
|
@ -57641,6 +57641,33 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1700762558645" ID="ID_1575178578" MODIFIED="1700762562411" TEXT="Hilfsmittel">
|
||||
<node CREATED="1700762565756" ID="ID_449088160" MODIFIED="1700762567887" TEXT="Container"/>
|
||||
<node CREATED="1700762569236" ID="ID_1666233122" MODIFIED="1700762579454" TEXT="Simulation / Generierung">
|
||||
<node COLOR="#11660e" CREATED="1700761069915" FOLDED="true" ID="ID_1582937575" MODIFIED="1700763387735">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<font face="Monospaced" size="4"><b>RandomDraw</b></font>: »ziehen« von zufälligen Parameterwerten
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<arrowlink COLOR="#719f60" DESTINATION="ID_1225692248" ENDARROW="Default" ENDINCLINATION="1568;-1210;" ID="Arrow_ID_298662468" STARTARROW="None" STARTINCLINATION="2265;134;"/>
|
||||
<node CREATED="1700762711185" ID="ID_480904605" MODIFIED="1700762727571" TEXT="verwendet Zufalls-Quelle">
|
||||
<node CREATED="1700762728959" ID="ID_357941849" MODIFIED="1700762732068" TEXT="entweder intern"/>
|
||||
<node CREATED="1700762732458" ID="ID_1178405756" MODIFIED="1700762736706" TEXT="oder extern (Hash)"/>
|
||||
</node>
|
||||
<node CREATED="1700762746820" ID="ID_328353521" MODIFIED="1700762765310" TEXT="Funktion: Quelle ⟼ Parameterwert"/>
|
||||
<node CREATED="1700762781855" ID="ID_1600374242" MODIFIED="1700762791370" TEXT="per Policy-Template konfigurierbar"/>
|
||||
<node CREATED="1700762801525" HGAP="39" ID="ID_275978401" MODIFIED="1700763374091" TEXT="Verwendung" VSHIFT="-44">
|
||||
<node CREATED="1700762810604" ID="ID_1875359700" MODIFIED="1700763355301" TEXT="11/2023 TestChainLoad">
|
||||
<arrowlink COLOR="#3f42ac" DESTINATION="ID_1285189810" ENDARROW="Default" ENDINCLINATION="-1000;-147;" ID="Arrow_ID_1839143434" STARTARROW="None" STARTINCLINATION="-1005;122;"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1667336713909" ID="ID_259014029" MODIFIED="1667336726184" TEXT="Framework">
|
||||
<font NAME="SansSerif" SIZE="14"/>
|
||||
<node CREATED="1667336734205" FOLDED="true" ID="ID_1054510557" MODIFIED="1667336746223" TEXT="Lumiera Time">
|
||||
|
|
@ -95751,6 +95778,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1699657771858" ID="ID_492954771" MODIFIED="1699657774722" TEXT="Design">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699657791215" ID="ID_1285189810" MODIFIED="1699657803659" TEXT="Anforderungen">
|
||||
<linktarget COLOR="#3f42ac" DESTINATION="ID_1285189810" ENDARROW="Default" ENDINCLINATION="-1000;-147;" ID="Arrow_ID_1839143434" SOURCE="ID_1875359700" STARTARROW="None" STARTINCLINATION="-1005;122;"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1699657825826" ID="ID_525362265" MODIFIED="1699657835477" TEXT="stellt Jobs / Job-Functor bereit">
|
||||
<node CREATED="1699657837345" ID="ID_761367578" MODIFIED="1699657843220" TEXT="einen Planungs-Funktor"/>
|
||||
|
|
@ -95769,6 +95797,18 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1699659667940" ID="ID_1368216745" MODIFIED="1699659677087" TEXT="speichert ein Ergebnis"/>
|
||||
<node CREATED="1699659712591" ID="ID_1629221792" MODIFIED="1699659723169" TEXT="Flag ob schon besucht / berechnet"/>
|
||||
</node>
|
||||
<node CREATED="1700763022058" ID="ID_1456995862" MODIFIED="1700763027243" TEXT="inhärent limitiert">
|
||||
<node CREATED="1700763064266" ID="ID_1550325795" MODIFIED="1700763081728" TEXT="Gesamtzahl der Nodes fest vorgegeben"/>
|
||||
<node CREATED="1700763028207" ID="ID_1624072190" MODIFIED="1700763062806" TEXT="auf jedem Time-Level: maximale Breite (Anzahl Nodes)"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1700763097108" ID="ID_1103056418" MODIFIED="1700763109264" TEXT="Generierung der Verknüpfungs-Topologie">
|
||||
<node CREATED="1700763123642" ID="ID_1013432384" MODIFIED="1700763129765" TEXT="100% reproduzierbar"/>
|
||||
<node CREATED="1700763130786" ID="ID_1574603467" MODIFIED="1700763136252" TEXT="auf einem Seed aufbauend"/>
|
||||
<node CREATED="1700763137456" ID="ID_1403621430" MODIFIED="1700763156226" TEXT="gesteuert durch Zufalls-Parameter"/>
|
||||
<node CREATED="1700763157328" ID="ID_36351098" MODIFIED="1700763296805" TEXT="»Zufall« durch »ziehen« aus dem Hash-Wert der Node">
|
||||
<arrowlink COLOR="#639b93" DESTINATION="ID_1225692248" ENDARROW="Default" ENDINCLINATION="-812;-40;" ID="Arrow_ID_879341368" STARTARROW="None" STARTINCLINATION="655;81;"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1699658003347" ID="ID_728639879" MODIFIED="1699658006734" TEXT="Nutzungs-Muster">
|
||||
<node CREATED="1699658019169" ID="ID_11395500" MODIFIED="1699658038530" TEXT="einen einzigen Job mit verifizierbarem Aufruf"/>
|
||||
|
|
@ -96244,6 +96284,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<arrowlink COLOR="#6e6080" DESTINATION="ID_1331338727" ENDARROW="Default" ENDINCLINATION="-87;-56;" ID="Arrow_ID_572043531" STARTARROW="None" STARTINCLINATION="99;6;"/>
|
||||
<linktarget COLOR="#564965" DESTINATION="ID_1812170860" ENDARROW="Default" ENDINCLINATION="-709;47;" ID="Arrow_ID_107668670" SOURCE="ID_1249462296" STARTARROW="None" STARTINCLINATION="-169;-5;"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1700264918159" ID="ID_334644013" MODIFIED="1700491041706" TEXT="diesen aber zugleich als Regel-Builder nutzbar machen">
|
||||
<icon BUILTIN="yes"/>
|
||||
|
|
@ -96266,10 +96308,14 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node COLOR="#338800" CREATED="1700331799351" FOLDED="true" ID="ID_619819862" MODIFIED="1700490710418" TEXT="Baumuster untersuchen (try.cpp)...">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1700342161236" FOLDED="true" ID="ID_1281138479" MODIFIED="1700490730479" TEXT="1.Enwurf: Funktions-Komposition">
|
||||
<node CREATED="1700342178718" ID="ID_1331338727" MODIFIED="1700342198924" TEXT="die Cap-Funktionalität als eigener Funktor"/>
|
||||
<node CREATED="1700342178718" ID="ID_1331338727" MODIFIED="1700342198924" TEXT="die Cap-Funktionalität als eigener Funktor">
|
||||
<linktarget COLOR="#6e6080" DESTINATION="ID_1331338727" ENDARROW="Default" ENDINCLINATION="-87;-56;" ID="Arrow_ID_572043531" SOURCE="ID_1812170860" STARTARROW="None" STARTINCLINATION="99;6;"/>
|
||||
</node>
|
||||
<node CREATED="1700342199523" ID="ID_1963684995" MODIFIED="1700342217408" TEXT="vorgeschaltet dann die Erzeugung des Zufallswertes"/>
|
||||
<node CREATED="1700342243501" ID="ID_1390319632" MODIFIED="1700342253999" TEXT="damit wären wir aber einerm reinen Funktor-Builder"/>
|
||||
<node CREATED="1700342254915" ID="ID_834526555" MODIFIED="1700342262877" TEXT="würde gehen, war aber nicht das was mir vorschwebte"/>
|
||||
<node CREATED="1700342254915" ID="ID_834526555" MODIFIED="1700342262877" TEXT="würde gehen, war aber nicht das was mir vorschwebte">
|
||||
<arrowlink COLOR="#77759c" DESTINATION="ID_1467611806" ENDARROW="Default" ENDINCLINATION="-447;-93;" ID="Arrow_ID_584557934" STARTARROW="None" STARTINCLINATION="-195;11;"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1700342264818" ID="ID_330199412" MODIFIED="1700490702462" TEXT="was will ich denn überhaupt?">
|
||||
<font NAME="SansSerif" SIZE="12"/>
|
||||
|
|
@ -96432,6 +96478,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
<node CREATED="1700346948591" ID="ID_1467611806" MODIFIED="1700346954769" TEXT="Nutz-Varianten">
|
||||
<linktarget COLOR="#77759c" DESTINATION="ID_1467611806" ENDARROW="Default" ENDINCLINATION="-447;-93;" ID="Arrow_ID_584557934" SOURCE="ID_834526555" STARTARROW="None" STARTINCLINATION="-195;11;"/>
|
||||
<node CREATED="1700346959359" ID="ID_1645518847" MODIFIED="1700346976614" TEXT="default-Initialisiert ≡ deaktiviert"/>
|
||||
<node CREATED="1700347086640" ID="ID_1826929764" MODIFIED="1700347098373" TEXT="Draw()⟶Builder">
|
||||
<node CREATED="1700347103249" ID="ID_296844288" MODIFIED="1700347118842" TEXT="probability(d)"/>
|
||||
|
|
@ -96695,7 +96742,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1700490465981" ID="ID_95937370" MODIFIED="1700490485279" TEXT="der Nutzer bekommt eine builder-DSL auf dem resultierenden, spezialisierten Typ"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700491763307" FOLDED="true" ID="ID_1225692248" MODIFIED="1700714041514">
|
||||
<node COLOR="#11660e" CREATED="1700491763307" FOLDED="true" ID="ID_1225692248" MODIFIED="1700714041514">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
|
|
@ -96704,6 +96751,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<linktarget COLOR="#719f60" DESTINATION="ID_1225692248" ENDARROW="Default" ENDINCLINATION="-466;214;" ID="Arrow_ID_834549033" SOURCE="ID_557518427" STARTARROW="None" STARTINCLINATION="242;0;"/>
|
||||
<linktarget COLOR="#719f60" DESTINATION="ID_1225692248" ENDARROW="Default" ENDINCLINATION="1568;-1210;" ID="Arrow_ID_298662468" SOURCE="ID_1582937575" STARTARROW="None" STARTINCLINATION="2265;134;"/>
|
||||
<linktarget COLOR="#639b93" DESTINATION="ID_1225692248" ENDARROW="Default" ENDINCLINATION="-812;-40;" ID="Arrow_ID_879341368" SOURCE="ID_36351098" STARTARROW="None" STARTINCLINATION="655;81;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1700491815546" ID="ID_1942150407" MODIFIED="1700713887314" TEXT="bestehenden Prototyp konsolidieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -97355,6 +97405,33 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1700713941245" ID="ID_1647717999" MODIFIED="1700713949917" TEXT="die neue Lib-Komponente einbauen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1700763561056" ID="ID_1249462296" MODIFIED="1700764033885" TEXT="Bisherige Lösung mit Hilfsklasse Cap fällt weg">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
das war ja gradezu der Keim, aus dem sich RandomDraw entwickelt hat
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<arrowlink COLOR="#564965" DESTINATION="ID_1812170860" ENDARROW="Default" ENDINCLINATION="-709;47;" ID="Arrow_ID_107668670" STARTARROW="None" STARTINCLINATION="-169;-5;"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1700763417779" ID="ID_1109287945" MODIFIED="1700769052796" TEXT="Policy-Template intern in TestChainLoad aufbauen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node CREATED="1700763442493" ID="ID_1428433327" MODIFIED="1700764071300" TEXT="Typedefinition ⟿ bezieht non-type-Template param ein">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
TestChainLoad selber is parametrisiert auf die Maximalwerte der Topologie ⟹ alle Parameter haben typischerweise die Breiten-Limitierung als Obergrenze
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1700769068457" ID="ID_476049536" MODIFIED="1700769084452" TEXT="Typ für »config-rules« auf RandomDraw aufbauen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1700240183293" ID="ID_1092101612" MODIFIED="1700240190782" TEXT="Regel-Baukasten">
|
||||
|
|
@ -97572,6 +97649,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="pencil"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1700240219001" ID="ID_531532352" MODIFIED="1700240227249" TEXT="Hilfsmittel zur Regel-Definition">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#11660e" CREATED="1700761069915" ID="ID_557518427" MODIFIED="1700761165588" TEXT="Basis: »ziehen« von Zufallszahlen aus dem Hash ⟶ lib::RandomDraw">
|
||||
<arrowlink COLOR="#719f60" DESTINATION="ID_1225692248" ENDARROW="Default" ENDINCLINATION="-466;214;" ID="Arrow_ID_834549033" STARTARROW="None" STARTINCLINATION="242;0;"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue