From 55cb028abfac06db38ae2b1cd2756d6175f3fcd0 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sun, 31 Dec 2023 21:59:16 +0100 Subject: [PATCH] Scheduler-test: document and verify weight adapted timing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The helper developed thus far produces a sequence of weight factors per level, which could then be multiplied with an actual delay base time to produce a concrete schedule. These calculations, while simple, are difficult to understand; recommended to use the values tabulated in this test together with a `graphviz` rendering of the node graph (🠲 `printTopologyDOT()`) --- tests/vault/gear/scheduler-stress-test.cpp | 143 +++++++++++++++------ tests/vault/gear/test-chain-load-test.cpp | 136 +++++++++++++++++++- tests/vault/gear/test-chain-load.hpp | 4 +- wiki/thinkPad.ichthyo.mm | 14 +- 4 files changed, 254 insertions(+), 43 deletions(-) diff --git a/tests/vault/gear/scheduler-stress-test.cpp b/tests/vault/gear/scheduler-stress-test.cpp index 1dcb79d22..490cccaf3 100644 --- a/tests/vault/gear/scheduler-stress-test.cpp +++ b/tests/vault/gear/scheduler-stress-test.cpp @@ -29,6 +29,7 @@ #include "test-chain-load.hpp" #include "vault/gear/scheduler.hpp" #include "lib/time/timevalue.hpp" +#include "lib/format-string.hpp" #include "lib/format-cout.hpp" #include "lib/test/diagnostic-output.hpp"//////////////////////////TODO work in distress //#include "lib/format-string.hpp" @@ -50,6 +51,7 @@ namespace test { // using lib::time::FrameRate; // using lib::time::Offset; // using lib::time::Time; + using util::_Fmt; namespace { // Test definitions and setup... @@ -161,53 +163,114 @@ SHOW_EXPR(micros); CHECK (micros < 550); CHECK (micros > 450); - std::vector levelWeights = testLoad.allLevelWeights().effuse(); - std::vector scheduleSeq = testLoad.levelScheduleSequence(4).effuse(); -SHOW_EXPR(levelWeights.size()) - for (uint i=0; ilevel<<" w="<weight; - auto getWeight = [&](uint level) { return levelWeights[level].weight; }; - CHECK (node[22]->level == 16); - CHECK (node[23]->level == 17); CHECK (node[23]->weight == 3); CHECK (getWeight(17) == 3); + _Fmt nodeFmt{"i=%-2d lev:%-2d w=%1d"}; + _Fmt levelFmt{" Σ%-2d Σw:%2d"}; + auto nodeStr = [&](uint i) + { + size_t l = node[i]->level; + return string{nodeFmt % i % node[i]->level % node[i]->weight} + + (i == level[l].endidx? string{levelFmt % level[l].nodes % level[l].weight} + : string{" · · "}); + }; + // |idx--level--wght|-levelSum------- + CHECK (nodeStr( 1) == "i=1 lev:1 w=0 Σ1 Σw: 0"_expect); + CHECK (nodeStr( 2) == "i=2 lev:2 w=2 Σ1 Σw: 2"_expect); + CHECK (nodeStr( 3) == "i=3 lev:3 w=0 Σ1 Σw: 0"_expect); + CHECK (nodeStr( 4) == "i=4 lev:4 w=0 Σ1 Σw: 0"_expect); + CHECK (nodeStr( 5) == "i=5 lev:5 w=0 Σ1 Σw: 0"_expect); + CHECK (nodeStr( 6) == "i=6 lev:6 w=1 Σ1 Σw: 1"_expect); + CHECK (nodeStr( 7) == "i=7 lev:7 w=2 Σ1 Σw: 2"_expect); + CHECK (nodeStr( 8) == "i=8 lev:8 w=2 Σ1 Σw: 2"_expect); + CHECK (nodeStr( 9) == "i=9 lev:9 w=1 · · "_expect); + CHECK (nodeStr(10) == "i=10 lev:9 w=1 Σ2 Σw: 2"_expect); + CHECK (nodeStr(11) == "i=11 lev:10 w=0 · · "_expect); + CHECK (nodeStr(12) == "i=12 lev:10 w=0 Σ2 Σw: 0"_expect); + CHECK (nodeStr(13) == "i=13 lev:11 w=0 · · "_expect); + CHECK (nodeStr(14) == "i=14 lev:11 w=0 Σ2 Σw: 0"_expect); + CHECK (nodeStr(15) == "i=15 lev:12 w=1 · · "_expect); + CHECK (nodeStr(16) == "i=16 lev:12 w=1 Σ2 Σw: 2"_expect); + CHECK (nodeStr(17) == "i=17 lev:13 w=1 · · "_expect); + CHECK (nodeStr(18) == "i=18 lev:13 w=1 Σ2 Σw: 2"_expect); + CHECK (nodeStr(19) == "i=19 lev:14 w=2 · · "_expect); + CHECK (nodeStr(20) == "i=20 lev:14 w=2 Σ2 Σw: 4"_expect); + CHECK (nodeStr(21) == "i=21 lev:15 w=0 Σ1 Σw: 0"_expect); + CHECK (nodeStr(22) == "i=22 lev:16 w=1 Σ1 Σw: 1"_expect); + CHECK (nodeStr(23) == "i=23 lev:17 w=3 Σ1 Σw: 3"_expect); + CHECK (nodeStr(24) == "i=24 lev:18 w=0 · · "_expect); + CHECK (nodeStr(25) == "i=25 lev:18 w=0 · · "_expect); + CHECK (nodeStr(26) == "i=26 lev:18 w=0 · · "_expect); + CHECK (nodeStr(27) == "i=27 lev:18 w=0 · · "_expect); + CHECK (nodeStr(28) == "i=28 lev:18 w=0 Σ5 Σw: 0"_expect); + CHECK (nodeStr(29) == "i=29 lev:19 w=2 · · "_expect); + CHECK (nodeStr(30) == "i=30 lev:19 w=2 · · "_expect); + CHECK (nodeStr(31) == "i=31 lev:19 w=2 · · "_expect); + CHECK (nodeStr(32) == "i=32 lev:19 w=2 · · "_expect); + CHECK (nodeStr(33) == "i=33 lev:19 w=2 Σ5 Σw:10"_expect); + CHECK (nodeStr(34) == "i=34 lev:20 w=3 · · "_expect); + CHECK (nodeStr(35) == "i=35 lev:20 w=2 Σ2 Σw: 5"_expect); + CHECK (nodeStr(36) == "i=36 lev:21 w=1 · · "_expect); + CHECK (nodeStr(37) == "i=37 lev:21 w=1 · · "_expect); + CHECK (nodeStr(38) == "i=38 lev:21 w=3 Σ3 Σw: 5"_expect); + CHECK (nodeStr(39) == "i=39 lev:22 w=3 · · "_expect); + CHECK (nodeStr(40) == "i=40 lev:22 w=3 · · "_expect); + CHECK (nodeStr(41) == "i=41 lev:22 w=0 · · "_expect); + CHECK (nodeStr(42) == "i=42 lev:22 w=0 · · "_expect); + CHECK (nodeStr(43) == "i=43 lev:22 w=0 · · "_expect); + CHECK (nodeStr(44) == "i=44 lev:22 w=0 Σ6 Σw: 6"_expect); + CHECK (nodeStr(45) == "i=45 lev:23 w=0 · · "_expect); - CHECK (node[24]->level == 18); CHECK (node[24]->weight == 0); - CHECK (node[25]->level == 18); CHECK (node[25]->weight == 0); - CHECK (node[26]->level == 18); CHECK (node[26]->weight == 0); - CHECK (node[27]->level == 18); CHECK (node[27]->weight == 0); - CHECK (node[28]->level == 18); CHECK (node[28]->weight == 0); CHECK (getWeight(18) == 0); - CHECK (node[29]->level == 19); CHECK (node[29]->weight == 2); - CHECK (node[30]->level == 19); CHECK (node[30]->weight == 2); - CHECK (node[31]->level == 19); CHECK (node[31]->weight == 2); - CHECK (node[32]->level == 19); CHECK (node[32]->weight == 2); - CHECK (node[33]->level == 19); CHECK (node[33]->weight == 2); CHECK (getWeight(19) == 10); + CHECK (level[19].nodes = 5); + CHECK (level[19].weight = 10); + CHECK (computeWeightFactor(level[19], 1) == 10.0); + CHECK (computeWeightFactor(level[19], 2) == 10.0 / (5.0/3)); + CHECK (computeWeightFactor(level[19], 3) == 10.0 / (5.0/2)); + CHECK (computeWeightFactor(level[19], 4) == 10.0 / (5.0/2)); + CHECK (computeWeightFactor(level[19], 5) == 10.0 / (5.0/1)); - CHECK (node[34]->level == 20); CHECK (node[34]->weight == 3); - CHECK (node[35]->level == 20); CHECK (node[35]->weight == 2); CHECK (getWeight(20) == 5); +SHOW_EXPR(level.size()) + + uint concurrency = 4; + auto steps = testLoad.levelScheduleSequence(concurrency).effuse(); + CHECK (steps.size() == 27); - CHECK (node[36]->level == 21); CHECK (node[36]->weight == 1); - CHECK (node[37]->level == 21); CHECK (node[37]->weight == 1); - CHECK (node[38]->level == 21); CHECK (node[38]->weight == 3); CHECK (getWeight(21) == 5); + auto boost = [&](uint i){ return level[i].nodes / std::ceil (double(level[i].nodes)/concurrency); }; + auto wfact = [&](uint i){ return computeWeightFactor(level[i], concurrency); }; - CHECK (levelWeights[19].nodes = 5); - CHECK (levelWeights[19].weight = 10); - CHECK (computeWeightFactor(levelWeights[19], 1) == 10.0); - CHECK (computeWeightFactor(levelWeights[19], 2) == 10.0 / (5.0/3)); - CHECK (computeWeightFactor(levelWeights[19], 3) == 10.0 / (5.0/2)); - CHECK (computeWeightFactor(levelWeights[19], 4) == 10.0 / (5.0/2)); - CHECK (computeWeightFactor(levelWeights[19], 5) == 10.0 / (5.0/1)); + _Fmt stepFmt{"lev:%-2d nodes:%-2d Σw:%2d %4.1f Δ%5.3f â–¿â–¿ %6.3f"}; + auto stepStr = [&](uint i){ return string{stepFmt % i % level[i].nodes % level[i].weight % boost(i) % wfact(i) % steps[i]}; }; - CHECK (levelWeights[16].weight == 1); CHECK (levelWeights[16].nodes == 1); CHECK(scheduleSeq[16] == 13.0); - CHECK (levelWeights[17].weight == 3); CHECK (levelWeights[17].nodes == 1); CHECK(scheduleSeq[17] == 16.0); - CHECK (levelWeights[18].weight == 0); CHECK (levelWeights[18].nodes == 5); CHECK(scheduleSeq[18] == 16.0); - CHECK (levelWeights[19].weight ==10); CHECK (levelWeights[19].nodes == 5); CHECK(scheduleSeq[19] == 20.0); - CHECK (levelWeights[20].weight == 5); CHECK (levelWeights[20].nodes == 2); CHECK(scheduleSeq[20] == 22.5); + CHECK (stepStr( 0) == "lev:0 nodes:1 Σw: 0 1.0 Δ0.000 â–¿â–¿ 0.000"_expect); + CHECK (stepStr( 1) == "lev:1 nodes:1 Σw: 0 1.0 Δ0.000 â–¿â–¿ 0.000"_expect); + CHECK (stepStr( 2) == "lev:2 nodes:1 Σw: 2 1.0 Δ2.000 â–¿â–¿ 2.000"_expect); + CHECK (stepStr( 3) == "lev:3 nodes:1 Σw: 0 1.0 Δ0.000 â–¿â–¿ 2.000"_expect); + CHECK (stepStr( 4) == "lev:4 nodes:1 Σw: 0 1.0 Δ0.000 â–¿â–¿ 2.000"_expect); + CHECK (stepStr( 5) == "lev:5 nodes:1 Σw: 0 1.0 Δ0.000 â–¿â–¿ 2.000"_expect); + CHECK (stepStr( 6) == "lev:6 nodes:1 Σw: 1 1.0 Δ1.000 â–¿â–¿ 3.000"_expect); + CHECK (stepStr( 7) == "lev:7 nodes:1 Σw: 2 1.0 Δ2.000 â–¿â–¿ 5.000"_expect); + CHECK (stepStr( 8) == "lev:8 nodes:1 Σw: 2 1.0 Δ2.000 â–¿â–¿ 7.000"_expect); + CHECK (stepStr( 9) == "lev:9 nodes:2 Σw: 2 2.0 Δ1.000 â–¿â–¿ 8.000"_expect); + CHECK (stepStr(10) == "lev:10 nodes:2 Σw: 0 2.0 Δ0.000 â–¿â–¿ 8.000"_expect); + CHECK (stepStr(11) == "lev:11 nodes:2 Σw: 0 2.0 Δ0.000 â–¿â–¿ 8.000"_expect); + CHECK (stepStr(12) == "lev:12 nodes:2 Σw: 2 2.0 Δ1.000 â–¿â–¿ 9.000"_expect); + CHECK (stepStr(13) == "lev:13 nodes:2 Σw: 2 2.0 Δ1.000 â–¿â–¿ 10.000"_expect); + CHECK (stepStr(14) == "lev:14 nodes:2 Σw: 4 2.0 Δ2.000 â–¿â–¿ 12.000"_expect); + CHECK (stepStr(15) == "lev:15 nodes:1 Σw: 0 1.0 Δ0.000 â–¿â–¿ 12.000"_expect); + CHECK (stepStr(16) == "lev:16 nodes:1 Σw: 1 1.0 Δ1.000 â–¿â–¿ 13.000"_expect); + CHECK (stepStr(17) == "lev:17 nodes:1 Σw: 3 1.0 Δ3.000 â–¿â–¿ 16.000"_expect); + CHECK (stepStr(18) == "lev:18 nodes:5 Σw: 0 2.5 Δ0.000 â–¿â–¿ 16.000"_expect); + CHECK (stepStr(19) == "lev:19 nodes:5 Σw:10 2.5 Δ4.000 â–¿â–¿ 20.000"_expect); + CHECK (stepStr(20) == "lev:20 nodes:2 Σw: 5 2.0 Δ2.500 â–¿â–¿ 22.500"_expect); + CHECK (stepStr(21) == "lev:21 nodes:3 Σw: 5 3.0 Δ1.667 â–¿â–¿ 24.167"_expect); + CHECK (stepStr(22) == "lev:22 nodes:6 Σw: 6 3.0 Δ2.000 â–¿â–¿ 26.167"_expect); + CHECK (stepStr(23) == "lev:23 nodes:6 Σw: 6 3.0 Δ2.000 â–¿â–¿ 28.167"_expect); + CHECK (stepStr(24) == "lev:24 nodes:10 Σw: 9 3.3 Δ2.700 â–¿â–¿ 30.867"_expect); + CHECK (stepStr(25) == "lev:25 nodes:2 Σw: 2 2.0 Δ1.000 â–¿â–¿ 31.867"_expect); + CHECK (stepStr(26) == "lev:26 nodes:1 Σw: 1 1.0 Δ1.000 â–¿â–¿ 32.867"_expect); } diff --git a/tests/vault/gear/test-chain-load-test.cpp b/tests/vault/gear/test-chain-load-test.cpp index 67e2103da..da596bd21 100644 --- a/tests/vault/gear/test-chain-load-test.cpp +++ b/tests/vault/gear/test-chain-load-test.cpp @@ -27,7 +27,7 @@ #include "lib/test/run.hpp" #include "lib/test/test-helper.hpp" -#include "lib/test/diagnostic-output.hpp" +#include "lib/format-string.hpp" #include "test-chain-load.hpp" #include "vault/gear/job.h" #include "lib/util.hpp" @@ -35,6 +35,7 @@ #include +using util::_Fmt; using util::isnil; using util::isSameObject; using std::array; @@ -84,6 +85,7 @@ namespace test { verify_computation_load(); verify_reseed_recalculate(); verify_runtime_reference(); + verify_adjusted_schedule(); verify_scheduling_setup(); } @@ -1089,6 +1091,138 @@ namespace test { + /** @test verify use of computation weights and topology to establish + * a predicted load pattern, which can be used to construct a + * schedule adapted to the expected load. + * @remark use `printTopologyDOT()` and then `dot -Tpng xx.dot|display` + * to understand the numbers in context of the topology + */ + void + verify_adjusted_schedule() + { + TestChainLoad testLoad{64}; + testLoad.configureShape_chain_loadBursts() + .buildToplolgy() +// .printTopologyDOT() + ; + + // compute aggregated level data.... + auto level = testLoad.allLevelWeights().effuse(); + CHECK (level.size() == 27); + + // visualise and verify this data...... + auto node = testLoad.allNodePtr().effuse(); + _Fmt nodeFmt{"i=%-2d lev:%-2d w=%1d"}; + _Fmt levelFmt{" Σ%-2d Σw:%2d"}; + auto nodeStr = [&](uint i) + { + size_t l = node[i]->level; + return string{nodeFmt % i % node[i]->level % node[i]->weight} + + (i == level[l].endidx? string{levelFmt % level[l].nodes % level[l].weight} + : string{" · · "}); + }; + // |idx--level--wght|-levelSum------- + CHECK (nodeStr( 1) == "i=1 lev:1 w=0 Σ1 Σw: 0"_expect); + CHECK (nodeStr( 2) == "i=2 lev:2 w=2 Σ1 Σw: 2"_expect); + CHECK (nodeStr( 3) == "i=3 lev:3 w=0 Σ1 Σw: 0"_expect); + CHECK (nodeStr( 4) == "i=4 lev:4 w=0 Σ1 Σw: 0"_expect); + CHECK (nodeStr( 5) == "i=5 lev:5 w=0 Σ1 Σw: 0"_expect); + CHECK (nodeStr( 6) == "i=6 lev:6 w=1 Σ1 Σw: 1"_expect); + CHECK (nodeStr( 7) == "i=7 lev:7 w=2 Σ1 Σw: 2"_expect); + CHECK (nodeStr( 8) == "i=8 lev:8 w=2 Σ1 Σw: 2"_expect); + CHECK (nodeStr( 9) == "i=9 lev:9 w=1 · · "_expect); + CHECK (nodeStr(10) == "i=10 lev:9 w=1 Σ2 Σw: 2"_expect); + CHECK (nodeStr(11) == "i=11 lev:10 w=0 · · "_expect); + CHECK (nodeStr(12) == "i=12 lev:10 w=0 Σ2 Σw: 0"_expect); + CHECK (nodeStr(13) == "i=13 lev:11 w=0 · · "_expect); + CHECK (nodeStr(14) == "i=14 lev:11 w=0 Σ2 Σw: 0"_expect); + CHECK (nodeStr(15) == "i=15 lev:12 w=1 · · "_expect); + CHECK (nodeStr(16) == "i=16 lev:12 w=1 Σ2 Σw: 2"_expect); + CHECK (nodeStr(17) == "i=17 lev:13 w=1 · · "_expect); + CHECK (nodeStr(18) == "i=18 lev:13 w=1 Σ2 Σw: 2"_expect); + CHECK (nodeStr(19) == "i=19 lev:14 w=2 · · "_expect); + CHECK (nodeStr(20) == "i=20 lev:14 w=2 Σ2 Σw: 4"_expect); + CHECK (nodeStr(21) == "i=21 lev:15 w=0 Σ1 Σw: 0"_expect); + CHECK (nodeStr(22) == "i=22 lev:16 w=1 Σ1 Σw: 1"_expect); + CHECK (nodeStr(23) == "i=23 lev:17 w=3 Σ1 Σw: 3"_expect); + CHECK (nodeStr(24) == "i=24 lev:18 w=0 · · "_expect); + CHECK (nodeStr(25) == "i=25 lev:18 w=0 · · "_expect); + CHECK (nodeStr(26) == "i=26 lev:18 w=0 · · "_expect); + CHECK (nodeStr(27) == "i=27 lev:18 w=0 · · "_expect); + CHECK (nodeStr(28) == "i=28 lev:18 w=0 Σ5 Σw: 0"_expect); + CHECK (nodeStr(29) == "i=29 lev:19 w=2 · · "_expect); + CHECK (nodeStr(30) == "i=30 lev:19 w=2 · · "_expect); + CHECK (nodeStr(31) == "i=31 lev:19 w=2 · · "_expect); + CHECK (nodeStr(32) == "i=32 lev:19 w=2 · · "_expect); + CHECK (nodeStr(33) == "i=33 lev:19 w=2 Σ5 Σw:10"_expect); + CHECK (nodeStr(34) == "i=34 lev:20 w=3 · · "_expect); + CHECK (nodeStr(35) == "i=35 lev:20 w=2 Σ2 Σw: 5"_expect); + CHECK (nodeStr(36) == "i=36 lev:21 w=1 · · "_expect); + CHECK (nodeStr(37) == "i=37 lev:21 w=1 · · "_expect); + CHECK (nodeStr(38) == "i=38 lev:21 w=3 Σ3 Σw: 5"_expect); + CHECK (nodeStr(39) == "i=39 lev:22 w=3 · · "_expect); + CHECK (nodeStr(40) == "i=40 lev:22 w=3 · · "_expect); + CHECK (nodeStr(41) == "i=41 lev:22 w=0 · · "_expect); + CHECK (nodeStr(42) == "i=42 lev:22 w=0 · · "_expect); + CHECK (nodeStr(43) == "i=43 lev:22 w=0 · · "_expect); + CHECK (nodeStr(44) == "i=44 lev:22 w=0 Σ6 Σw: 6"_expect); + CHECK (nodeStr(45) == "i=45 lev:23 w=0 · · "_expect); + + // compute a weight factor for each level, + // using the number of nodes, the weight sum and concurrency + CHECK (level[19].nodes = 5); // ╭────────────────────────╢ concurrency + CHECK (level[19].weight = 10); // â–½ ╭───────╢ boost by concurrency + CHECK (computeWeightFactor(level[19], 1) == 10.0);// â–½ + CHECK (computeWeightFactor(level[19], 2) == 10.0 / (5.0/3)); + CHECK (computeWeightFactor(level[19], 3) == 10.0 / (5.0/2)); + CHECK (computeWeightFactor(level[19], 4) == 10.0 / (5.0/2)); + CHECK (computeWeightFactor(level[19], 5) == 10.0 / (5.0/1)); + + // build a schedule sequence based on + // summing up weight factors, with example concurrency ≔ 4 + uint concurrency = 4; + auto steps = testLoad.levelScheduleSequence(concurrency).effuse(); + CHECK (steps.size() == 27); + + // for documentation/verification: show also the boost factor and the resulting weight factor + auto boost = [&](uint i){ return level[i].nodes / std::ceil (double(level[i].nodes)/concurrency); }; + auto wfact = [&](uint i){ return computeWeightFactor(level[i], concurrency); }; + + _Fmt stepFmt{"lev:%-2d nodes:%-2d Σw:%2d %4.1f Δ%5.3f â–¿â–¿ %6.3f"}; + auto stepStr = [&](uint i){ return string{stepFmt % i % level[i].nodes % level[i].weight % boost(i) % wfact(i) % steps[i]}; }; + + // boost wfactor steps + CHECK (stepStr( 0) == "lev:0 nodes:1 Σw: 0 1.0 Δ0.000 â–¿â–¿ 0.000"_expect); + CHECK (stepStr( 1) == "lev:1 nodes:1 Σw: 0 1.0 Δ0.000 â–¿â–¿ 0.000"_expect); + CHECK (stepStr( 2) == "lev:2 nodes:1 Σw: 2 1.0 Δ2.000 â–¿â–¿ 2.000"_expect); + CHECK (stepStr( 3) == "lev:3 nodes:1 Σw: 0 1.0 Δ0.000 â–¿â–¿ 2.000"_expect); + CHECK (stepStr( 4) == "lev:4 nodes:1 Σw: 0 1.0 Δ0.000 â–¿â–¿ 2.000"_expect); + CHECK (stepStr( 5) == "lev:5 nodes:1 Σw: 0 1.0 Δ0.000 â–¿â–¿ 2.000"_expect); + CHECK (stepStr( 6) == "lev:6 nodes:1 Σw: 1 1.0 Δ1.000 â–¿â–¿ 3.000"_expect); + CHECK (stepStr( 7) == "lev:7 nodes:1 Σw: 2 1.0 Δ2.000 â–¿â–¿ 5.000"_expect); + CHECK (stepStr( 8) == "lev:8 nodes:1 Σw: 2 1.0 Δ2.000 â–¿â–¿ 7.000"_expect); + CHECK (stepStr( 9) == "lev:9 nodes:2 Σw: 2 2.0 Δ1.000 â–¿â–¿ 8.000"_expect); + CHECK (stepStr(10) == "lev:10 nodes:2 Σw: 0 2.0 Δ0.000 â–¿â–¿ 8.000"_expect); + CHECK (stepStr(11) == "lev:11 nodes:2 Σw: 0 2.0 Δ0.000 â–¿â–¿ 8.000"_expect); + CHECK (stepStr(12) == "lev:12 nodes:2 Σw: 2 2.0 Δ1.000 â–¿â–¿ 9.000"_expect); + CHECK (stepStr(13) == "lev:13 nodes:2 Σw: 2 2.0 Δ1.000 â–¿â–¿ 10.000"_expect); + CHECK (stepStr(14) == "lev:14 nodes:2 Σw: 4 2.0 Δ2.000 â–¿â–¿ 12.000"_expect); + CHECK (stepStr(15) == "lev:15 nodes:1 Σw: 0 1.0 Δ0.000 â–¿â–¿ 12.000"_expect); + CHECK (stepStr(16) == "lev:16 nodes:1 Σw: 1 1.0 Δ1.000 â–¿â–¿ 13.000"_expect); + CHECK (stepStr(17) == "lev:17 nodes:1 Σw: 3 1.0 Δ3.000 â–¿â–¿ 16.000"_expect); + CHECK (stepStr(18) == "lev:18 nodes:5 Σw: 0 2.5 Δ0.000 â–¿â–¿ 16.000"_expect); + CHECK (stepStr(19) == "lev:19 nodes:5 Σw:10 2.5 Δ4.000 â–¿â–¿ 20.000"_expect); + CHECK (stepStr(20) == "lev:20 nodes:2 Σw: 5 2.0 Δ2.500 â–¿â–¿ 22.500"_expect); + CHECK (stepStr(21) == "lev:21 nodes:3 Σw: 5 3.0 Δ1.667 â–¿â–¿ 24.167"_expect); + CHECK (stepStr(22) == "lev:22 nodes:6 Σw: 6 3.0 Δ2.000 â–¿â–¿ 26.167"_expect); + CHECK (stepStr(23) == "lev:23 nodes:6 Σw: 6 3.0 Δ2.000 â–¿â–¿ 28.167"_expect); + CHECK (stepStr(24) == "lev:24 nodes:10 Σw: 9 3.3 Δ2.700 â–¿â–¿ 30.867"_expect); + CHECK (stepStr(25) == "lev:25 nodes:2 Σw: 2 2.0 Δ1.000 â–¿â–¿ 31.867"_expect); + CHECK (stepStr(26) == "lev:26 nodes:1 Σw: 1 1.0 Δ1.000 â–¿â–¿ 32.867"_expect); + } + + + /** @test setup for running a chain-load as scheduled task * - running an isolated Node recalculation diff --git a/tests/vault/gear/test-chain-load.hpp b/tests/vault/gear/test-chain-load.hpp index a301d1312..eabea58a9 100644 --- a/tests/vault/gear/test-chain-load.hpp +++ b/tests/vault/gear/test-chain-load.hpp @@ -174,6 +174,7 @@ namespace test { { size_t level{0}; size_t nodes{0}; + size_t endidx{0}; size_t weight{0}; }; @@ -779,10 +780,11 @@ namespace test { { return allNodes() .groupedBy([](Node& n){ return n.level; } - ,[](LevelWeight& lw, Node const& n) + ,[this](LevelWeight& lw, Node const& n) { lw.level = n.level; lw.weight += n.weight; + lw.endidx = nodeID(n); ++lw.nodes; } ); diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 7081b4d37..6ac95396c 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -107586,7 +107586,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + @@ -107601,6 +107601,10 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + @@ -107635,6 +107639,14 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + + +