53 auto isStartNode = [](
Node& n){
return isStart(n); };
54 auto isInnerNode = [](
Node& n){
return isInner(n); };
55 auto isExitNode = [](
Node& n){
return isExit(n); };
106 CHECK (testLoad.getHash() == 0x554F5086DE5B0861);
113 testLoad.setupSchedule(scheduler)
117 CHECK (testLoad.getHash() == 0x554F5086DE5B0861);
128 CHECK (n0.hash == 0);
129 CHECK (n0.level == 0);
130 CHECK (n0.weight == 0);
131 CHECK (n0.pred.size() == 0 );
132 CHECK (n0.succ.size() == 0 );
133 CHECK (n0.pred == Node::Tab{0});
134 CHECK (n0.succ == Node::Tab{0});
137 CHECK (n1.hash == 23);
138 CHECK (n2.hash == 55);
140 CHECK (0 == n0.calculate());
141 CHECK (0 == n0.hash);
142 CHECK (23 == n1.calculate());
143 CHECK (23 == n1.hash);
144 CHECK (55 == n2.calculate());
145 CHECK (55 == n2.hash);
148 CHECK (isSameObject (*n0.pred[0], n1));
149 CHECK (isSameObject (*n1.succ[0], n0));
150 CHECK (not n0.pred[1]);
151 CHECK (not n1.succ[1]);
152 CHECK (n2.pred == Node::Tab{0});
153 CHECK (n2.succ == Node::Tab{0});
156 CHECK (isSameObject (*n0.pred[0], n1));
157 CHECK (isSameObject (*n0.pred[1], n2));
158 CHECK (isSameObject (*n2.succ[0], n0));
159 CHECK (not n0.pred[2]);
160 CHECK (not n2.succ[1]);
162 CHECK (n0.hash == 0);
164 CHECK (n0.hash == 0x53F8F4753B85558A);
170 CHECK (n00.hash == 0);
172 CHECK (n00.hash == 0xECA6BE804934CAF2);
173 CHECK (n0.hash == 0x53F8F4753B85558A);
175 CHECK (isSameObject (*n1.succ[0], n0));
176 CHECK (isSameObject (*n1.succ[1], n00));
177 CHECK (isSameObject (*n2.succ[0], n0));
178 CHECK (isSameObject (*n2.succ[1], n00));
179 CHECK (isSameObject (*n00.pred[0], n2));
180 CHECK (isSameObject (*n00.pred[1], n1));
181 CHECK (isSameObject (*n0.pred[0], n1));
182 CHECK (isSameObject (*n0.pred[1], n2));
184 CHECK (n00.hash == 0xECA6BE804934CAF2);
186 CHECK (n00.hash == 0xB682F06D29B165C0);
188 CHECK (isnil (n0.succ));
189 CHECK (isnil (n00.succ));
190 CHECK (n00.succ.empty());
191 CHECK (0 == n00.succ.size());
192 CHECK (2 == n00.pred.size());
193 CHECK (2 == n0.pred.size());
194 CHECK (2 == n1.succ.size());
195 CHECK (2 == n2.succ.size());
196 CHECK (isnil (n1.pred));
197 CHECK (isnil (n2.pred));
215 CHECK (graph.topLevel() == 31);
216 CHECK (graph.getSeed() == 0);
217 CHECK (graph.getHash() == 0xB3445F1240A1B05F);
219 auto* node = & *graph.allNodes();
220 CHECK (node->hash == graph.getSeed());
221 CHECK (node->succ.size() == 1);
222 CHECK (isSameObject(*node, *node->succ[0]->pred[0]));
225 while (not isnil(node->succ))
228 node = node->succ[0];
229 CHECK (steps == node->level);
230 CHECK (1 == node->pred.size());
231 size_t exHash = node->hash;
236 CHECK (exHash == node->hash);
240 boost::hash_combine (node->hash, node->pred[0]->hash);
241 CHECK (exHash == node->hash);
245 CHECK (steps == graph.topLevel());
246 CHECK (node->hash == 0x5CDF544B70E59866);
250 size_t globalHash{0};
251 boost::hash_combine (globalHash, node->hash);
252 CHECK (globalHash == graph.getHash());
253 CHECK (globalHash == 0xB3445F1240A1B05F);
275 graph.expansionRule(graph.rule().probability(0.4).maxVal(2))
280 CHECK (graph.getHash() == 0x6EDD7B92F12E9A37);
282 auto stat = graph.computeGraphStatistics();
283 CHECK (stat.indicators[
STAT_NODE].cnt == 32);
284 CHECK (stat.levels == 11);
285 CHECK (stat.indicators[
STAT_FORK].cnt == 4);
286 CHECK (stat.indicators[
STAT_SEED].cnt == 1);
287 CHECK (stat.indicators[
STAT_EXIT].cnt == 1);
288 CHECK (stat.indicators[
STAT_NODE].pL ==
"2.9090909"_expect);
289 CHECK (stat.indicators[
STAT_NODE].cL ==
"0.640625"_expect);
294 graph.expansionRule(graph.rule().probability(0.4).maxVal(2).shuffle(23))
299 CHECK (graph.getHash() == 0x710D010554FEA614);
301 stat = graph.computeGraphStatistics();
302 CHECK (stat.levels == 7);
303 CHECK (stat.indicators[
STAT_NODE].pL ==
"4.5714286"_expect);
304 CHECK (stat.indicators[
STAT_FORK].cnt == 7);
305 CHECK (stat.indicators[
STAT_EXIT].cnt == 10);
306 CHECK (stat.indicators[
STAT_JOIN].cnt == 1);
307 CHECK (stat.indicators[
STAT_EXIT].cL == 1);
308 CHECK (stat.indicators[
STAT_JOIN].cL == 1);
314 gra_2.expansionRule(gra_2.rule().probability(0.4).maxVal(2).shuffle(23))
319 CHECK (gra_2.getHash() == 0x619491B22C3F8A6F);
322 CHECK (stat.levels == 36);
323 CHECK (stat.indicators[
STAT_NODE].pL ==
"7.1111111"_expect);
324 CHECK (stat.indicators[
STAT_JOIN].pL ==
"0.77777778"_expect);
325 CHECK (stat.indicators[
STAT_FORK].frac ==
"0.24609375"_expect);
326 CHECK (stat.indicators[
STAT_JOIN].frac ==
"0.109375"_expect);
327 CHECK (stat.indicators[
STAT_EXIT].cnt == 3);
328 CHECK (stat.indicators[
STAT_EXIT].cL == 1);
347 graph.expansionRule(graph.rule_atStart(8))
348 .reductionRule(graph.rule().probability(0.2).maxVal(3).shuffle(555))
353 CHECK (graph.getHash() == 0x3E9BFAE5E686BEB4);
355 auto stat = graph.computeGraphStatistics();
356 CHECK (stat.levels == 8);
357 CHECK (stat.indicators[
STAT_JOIN].cnt == 4);
358 CHECK (stat.indicators[
STAT_FORK].cnt == 1);
359 CHECK (stat.indicators[
STAT_FORK].cL == 0.0);
360 CHECK (stat.indicators[
STAT_NODE].cL ==
"0.42857143"_expect);
364 graph.expansionRule(graph.rule().probability(0.2).maxVal(3).shuffle(555))
365 .reductionRule(graph.rule().probability(0.2).maxVal(3).shuffle(555))
370 CHECK (graph.getHash() == 0xB0335595D34F1D8D);
372 stat = graph.computeGraphStatistics();
373 CHECK (stat.levels == 11);
374 CHECK (stat.indicators[
STAT_NODE].pL ==
"2.9090909"_expect);
375 CHECK (stat.indicators[
STAT_FORK].cnt == 5);
376 CHECK (stat.indicators[
STAT_JOIN].cnt == 3);
377 CHECK (stat.indicators[
STAT_FORK].cL == 0.5);
378 CHECK (stat.indicators[
STAT_JOIN].cL ==
"0.73333333"_expect);
382 graph.expansionRule(graph.rule().probability(0.3).maxVal(4).shuffle(555))
383 .reductionRule(graph.rule().probability(0.9).maxVal(2).shuffle(555))
388 CHECK (graph.getHash() == 0x220A2E81F65146FC);
390 stat = graph.computeGraphStatistics();
391 CHECK (stat.levels == 12);
392 CHECK (stat.indicators[
STAT_NODE].pL ==
"2.6666667"_expect);
393 CHECK (stat.indicators[
STAT_FORK].cnt == 7);
394 CHECK (stat.indicators[
STAT_JOIN].cnt == 9);
395 CHECK (stat.indicators[
STAT_FORK].cL ==
"0.41558442"_expect);
396 CHECK (stat.indicators[
STAT_JOIN].cL ==
"0.62626263"_expect);
397 CHECK (stat.indicators[
STAT_FORK].pLW ==
"0.19583333"_expect);
398 CHECK (stat.indicators[
STAT_JOIN].pLW ==
"0.26527778"_expect);
416 graph.seedingRule(graph.rule().probability(0.2).maxVal(3).shuffle())
421 CHECK (graph.getHash() == 0xBC35A96B3CE1F39F);
423 auto stat = graph.computeGraphStatistics();
424 CHECK (stat.levels == 7);
425 CHECK (stat.indicators[
STAT_SEED].cnt == 12);
426 CHECK (stat.indicators[
STAT_FORK].cnt == 0);
427 CHECK (stat.indicators[
STAT_LINK].cnt == 14);
428 CHECK (stat.indicators[
STAT_LINK].pL == 2);
429 CHECK (stat.indicators[
STAT_NODE].pL ==
"4.5714286"_expect);
430 CHECK (stat.indicators[
STAT_NODE].cL ==
"0.734375"_expect);
431 CHECK (stat.indicators[
STAT_LINK].cL ==
"0.64285714"_expect);
432 CHECK (stat.indicators[
STAT_JOIN].cL == 1);
437 graph.seedingRule(graph.rule().probability(0.2).maxVal(3).shuffle())
438 .reductionRule(graph.rule().probability(0.9).maxVal(2))
443 CHECK (graph.getHash() == 0x3DFA720156540247);
445 stat = graph.computeGraphStatistics();
446 CHECK (stat.indicators[
STAT_SEED].cnt == 11);
447 CHECK (stat.indicators[
STAT_JOIN].cnt == 6);
448 CHECK (stat.indicators[
STAT_LINK].cnt == 15);
449 CHECK (stat.indicators[
STAT_FORK].cnt == 0);
450 CHECK (stat.indicators[
STAT_NODE].pL == 3.2);
451 CHECK (stat.indicators[
STAT_NODE].cL ==
"0.5625"_expect);
452 CHECK (stat.indicators[
STAT_LINK].cL ==
"0.55555556"_expect);
453 CHECK (stat.indicators[
STAT_JOIN].cL ==
"0.72222222"_expect);
454 CHECK (stat.levels == 10);
473 graph.pruningRule(graph.rule().probability(0.2))
478 CHECK (graph.getHash() == 0x660BD1CD261A990);
480 auto stat = graph.computeGraphStatistics();
481 CHECK (stat.levels == 32);
482 CHECK (stat.segments == 8);
483 CHECK (stat.indicators[
STAT_NODE].pS == 4);
484 CHECK (stat.indicators[
STAT_NODE].pL == 1);
485 CHECK (stat.indicators[
STAT_SEED].cnt == 8);
486 CHECK (stat.indicators[
STAT_EXIT].cnt == 8);
487 CHECK (stat.indicators[
STAT_LINK].cnt == 16);
491 graph.pruningRule(graph.rule().probability(0.2))
492 .expansionRule(graph.rule().probability(0.6))
498 CHECK (graph.getHash() == 0x1D0A7C39647340AA);
500 stat = graph.computeGraphStatistics();
501 CHECK (stat.levels == 14);
502 CHECK (stat.segments == 5);
503 CHECK (stat.indicators[
STAT_NODE].pS ==
"6.4"_expect);
504 CHECK (stat.indicators[
STAT_FORK].sL ==
"0"_expect);
505 CHECK (stat.indicators[
STAT_EXIT].sL ==
"1"_expect);
506 CHECK (stat.indicators[
STAT_EXIT].pS ==
"3"_expect);
507 CHECK (stat.indicators[
STAT_SEED].cnt == 5);
508 CHECK (stat.indicators[
STAT_FORK].cnt == 5);
509 CHECK (stat.indicators[
STAT_EXIT].cnt == 15);
510 CHECK (stat.indicators[
STAT_LINK].cnt == 12);
511 CHECK (stat.indicators[
STAT_NODE].pL ==
"2.2857143"_expect);
515 graph.pruningRule(graph.rule().probability(0.2).shuffle(5))
516 .expansionRule(graph.rule().probability(0.6))
522 CHECK (graph.getHash() == 0x12BB22F76ECC5C1B);
524 stat = graph.computeGraphStatistics();
525 CHECK (stat.segments == 1);
526 CHECK (stat.indicators[
STAT_FORK].cnt == 3);
527 CHECK (stat.indicators[
STAT_EXIT].cnt == 10);
528 CHECK (stat.indicators[
STAT_EXIT].pL ==
"1.6666667"_expect);
529 CHECK (stat.indicators[
STAT_NODE].pL ==
"5.3333333"_expect);
532 graph.expansionRule(graph.rule());
538 graph.seedingRule(graph.rule_atStart(1))
539 .pruningRule(graph.rule().probability(0.2))
545 CHECK (graph.getHash() == 0xBFFA04FE8202C708);
549 stat = graph.computeGraphStatistics();
550 CHECK (stat.levels == 12);
551 CHECK (stat.segments == 1);
552 CHECK (stat.indicators[
STAT_SEED].cnt == 12);
553 CHECK (stat.indicators[
STAT_EXIT].cnt == 11);
554 CHECK (stat.indicators[
STAT_LINK].cnt == 10);
555 CHECK (stat.indicators[
STAT_JOIN].cnt == 1);
556 CHECK (stat.indicators[
STAT_JOIN].cL ==
"1"_expect);
557 CHECK (stat.indicators[
STAT_NODE].pL ==
"2.6666667"_expect);
558 CHECK (stat.indicators[
STAT_NODE].cL ==
"0.52840909"_expect);
559 CHECK (stat.indicators[
STAT_SEED].cL ==
"0.5"_expect);
560 CHECK (stat.indicators[
STAT_EXIT].cL ==
"0.62809917"_expect);
567 graph.seedingRule(graph.rule().fixedVal(1))
568 .pruningRule(graph.rule().probability(0.5))
569 .reductionRule(graph.rule().probability(0.8).maxVal(4))
575 CHECK (graph.getHash() == 0xFB0A0EA9B7072507);
577 stat = graph.computeGraphStatistics();
578 CHECK (stat.levels == 8);
579 CHECK (stat.indicators[
STAT_JOIN].pL == 1);
580 CHECK (stat.indicators[
STAT_SEED].cnt == 22);
581 CHECK (stat.indicators[
STAT_SEED].pL == 2.75);
614 graph.seedingRule(graph.rule_atLink(1))
615 .pruningRule(graph.rule().probability(0.4))
616 .reductionRule(graph.rule().probability(0.6).maxVal(5).minVal(2))
622 CHECK (graph.getHash() == 0x6B5D7BD3130044E2);
624 auto stat = graph.computeGraphStatistics();
625 CHECK (stat.indicators[
STAT_NODE].cL ==
"0.50509511"_expect);
626 CHECK (stat.levels == 93);
627 CHECK (stat.indicators[
STAT_NODE].pL ==
"2.7526882"_expect);
628 CHECK (stat.indicators[
STAT_SEED].pL ==
"1.0537634"_expect);
629 CHECK (stat.indicators[
STAT_JOIN].pL ==
"0.48387097"_expect);
630 CHECK (stat.indicators[
STAT_EXIT].pL ==
"0.34408602"_expect);
631 CHECK (stat.indicators[
STAT_SEED].frac ==
"0.3828125"_expect);
632 CHECK (stat.indicators[
STAT_EXIT].frac ==
"0.125"_expect);
633 CHECK (stat.indicators[
STAT_SEED].cLW ==
"0.49273514"_expect);
634 CHECK (stat.indicators[
STAT_LINK].cLW ==
"0.49588657"_expect);
635 CHECK (stat.indicators[
STAT_JOIN].cLW ==
"0.52481335"_expect);
636 CHECK (stat.indicators[
STAT_EXIT].cLW ==
"0.55716297"_expect);
643 graph.seedingRule(graph.rule_atLink(1))
644 .pruningRule(graph.rule().probability(0.5))
645 .reductionRule(graph.rule().probability(0.6).maxVal(5).minVal(2))
651 CHECK (graph.getHash() == 0x20122CF2A1F301D1);
653 stat = graph.computeGraphStatistics();
654 CHECK (stat.levels == 77);
655 CHECK (stat.indicators[
STAT_NODE].pL ==
"3.3246753"_expect);
656 CHECK (stat.indicators[
STAT_SEED].frac ==
"0.421875"_expect);
657 CHECK (stat.indicators[
STAT_EXIT].frac ==
"0.14453125"_expect);
668 graph.seedingRule(graph.rule().probability(0.6).maxVal(1))
669 .reductionRule(graph.rule().probability(0.75).maxVal(3))
670 .pruningRule(graph.rule_atJoin(1))
676 CHECK (graph.getHash() == 0xB58904674ED84031);
678 stat = graph.computeGraphStatistics();
679 CHECK (stat.levels == 104);
680 CHECK (stat.indicators[
STAT_NODE].pL ==
"2.4615385"_expect);
681 CHECK (stat.indicators[
STAT_SEED].frac ==
"0.40234375"_expect);
682 CHECK (stat.indicators[
STAT_EXIT].frac ==
"0.19921875"_expect);
683 CHECK (stat.indicators[
STAT_SEED].pL ==
"0.99038462"_expect);
684 CHECK (stat.indicators[
STAT_EXIT].pL ==
"0.49038462"_expect);
691 graph.seedingRule(graph.rule().probability(0.8).maxVal(1))
692 .reductionRule(graph.rule().probability(0.75).maxVal(3))
693 .pruningRule(graph.rule_atJoin(1))
699 CHECK (graph.getHash() == 0x11B57D9E98FDF6DF);
701 stat = graph.computeGraphStatistics();
702 CHECK (stat.levels == 55);
703 CHECK (stat.indicators[
STAT_NODE].pL ==
"4.6545455"_expect);
704 CHECK (stat.indicators[
STAT_SEED].frac ==
"0.3984375"_expect);
705 CHECK (stat.indicators[
STAT_EXIT].frac ==
"0.1953125"_expect);
706 CHECK (stat.indicators[
STAT_SEED].pL ==
"1.8545455"_expect);
707 CHECK (stat.indicators[
STAT_EXIT].pL ==
"0.90909091"_expect);
712 graph.seedingRule(graph.rule().probability(0.8).maxVal(1))
713 .reductionRule(graph.rule().probability(0.75).maxVal(3).shuffle())
714 .pruningRule(graph.rule_atJoin(1))
720 CHECK (graph.getHash() == 0x7C0453E7A4F6418D);
722 stat = graph.computeGraphStatistics();
723 CHECK (stat.levels == 44);
724 CHECK (stat.indicators[
STAT_NODE].pL ==
"5.8181818"_expect);
725 CHECK (stat.indicators[
STAT_SEED].pL ==
"2.4318182"_expect);
726 CHECK (stat.indicators[
STAT_LINK].pL ==
"2.4772727"_expect);
727 CHECK (stat.indicators[
STAT_EXIT].pL ==
"1"_expect);
737 graph.seedingRule(graph.rule().probability(0.8).maxVal(1))
738 .reductionRule(graph.rule().probability(0.75).maxVal(3))
739 .pruningRule(graph.rule().probability(0.55))
745 CHECK (graph.getHash() == 0x904A906B7859301A);
747 stat = graph.computeGraphStatistics();
748 CHECK (stat.levels == 21);
749 CHECK (stat.indicators[
STAT_NODE].pL ==
"12.190476"_expect);
750 CHECK (stat.indicators[
STAT_SEED].pL ==
"6.8571429"_expect);
751 CHECK (stat.indicators[
STAT_LINK].pL ==
"2.3809524"_expect);
752 CHECK (stat.indicators[
STAT_JOIN].pL ==
"2.8095238"_expect);
753 CHECK (stat.indicators[
STAT_EXIT].pL ==
"2.5714286"_expect);
754 CHECK (stat.indicators[
STAT_SEED].frac ==
"0.5625"_expect );
755 CHECK (stat.indicators[
STAT_EXIT].frac ==
"0.2109375"_expect);
761 graph.seedingRule(graph.rule().probability(0.8).maxVal(1))
762 .reductionRule(graph.rule().probability(0.6).maxVal(5).minVal(2))
763 .pruningRule(graph.rule().probability(0.4))
769 CHECK (graph.getHash() == 0x9453C56534FF9CD6);
771 stat = graph.computeGraphStatistics();
772 CHECK (stat.levels == 26);
773 CHECK (stat.indicators[
STAT_NODE].pL ==
"9.8461538"_expect);
774 CHECK (stat.indicators[
STAT_SEED].frac ==
"0.40234375"_expect);
775 CHECK (stat.indicators[
STAT_LINK].frac ==
"0.453125"_expect);
776 CHECK (stat.indicators[
STAT_JOIN].frac ==
"0.109375"_expect );
777 CHECK (stat.indicators[
STAT_EXIT].frac ==
"0.08984375"_expect);
782 graph.seedingRule(graph.rule().probability(0.8).maxVal(2))
783 .reductionRule(graph.rule().probability(0.6).maxVal(5).minVal(2))
784 .pruningRule(graph.rule().probability(0.42))
790 CHECK (graph.getHash() == 0xA57727C2ED277C87);
792 stat = graph.computeGraphStatistics();
793 CHECK (stat.levels == 129);
794 CHECK (stat.indicators[
STAT_NODE].pL ==
"1.9844961"_expect);
795 CHECK (stat.indicators[
STAT_SEED].frac ==
"0.3359375"_expect);
796 CHECK (stat.indicators[
STAT_LINK].frac ==
"0.4140625"_expect);
797 CHECK (stat.indicators[
STAT_JOIN].frac ==
"0.1640625"_expect);
798 CHECK (stat.indicators[
STAT_EXIT].frac ==
"0.171875"_expect);
803 graph.seedingRule(graph.rule().probability(0.8).maxVal(2).shuffle())
804 .reductionRule(graph.rule().probability(0.6).maxVal(5).minVal(2))
805 .pruningRule(graph.rule().probability(0.42))
811 CHECK (graph.getHash() == 0x4D0575F8BD269FC3);
813 stat = graph.computeGraphStatistics();
814 CHECK (stat.levels == 20);
815 CHECK (stat.indicators[
STAT_NODE].pL ==
"12.8"_expect);
816 CHECK (stat.indicators[
STAT_SEED].pL ==
"7.65"_expect);
817 CHECK (stat.indicators[
STAT_LINK].pL ==
"3.15"_expect);
818 CHECK (stat.indicators[
STAT_JOIN].pL ==
"1.9"_expect);
819 CHECK (stat.indicators[
STAT_EXIT].pL ==
"0.95"_expect);
834 graph.expansionRule(graph.rule().probability(0.27).maxVal(4))
835 .reductionRule(graph.rule().probability(0.44).maxVal(6).minVal(2))
836 .seedingRule(graph.rule())
837 .pruningRule(graph.rule())
843 CHECK (graph.getHash() == 0x25114F8770B1B78E);
845 stat = graph.computeGraphStatistics();
846 CHECK (stat.levels == 30);
847 CHECK (stat.indicators[
STAT_SEED].cnt == 1);
848 CHECK (stat.indicators[
STAT_EXIT].cnt == 4);
849 CHECK (stat.indicators[
STAT_NODE].pL ==
"8.5333333"_expect);
850 CHECK (stat.indicators[
STAT_FORK].frac ==
"0.16015625"_expect);
851 CHECK (stat.indicators[
STAT_LINK].frac ==
"0.76171875"_expect);
852 CHECK (stat.indicators[
STAT_JOIN].frac ==
"0.1015625"_expect);
853 CHECK (stat.indicators[
STAT_KNOT].frac ==
"0.0390625"_expect);
854 CHECK (stat.indicators[
STAT_FORK].cLW ==
"0.43298744"_expect);
855 CHECK (stat.indicators[
STAT_JOIN].cLW ==
"0.64466378"_expect);
871 CHECK (cpuLoad.timeBase == 100us);
873 double micros = cpuLoad.
invoke();
874 CHECK (micros < 2000);
879 micros = cpuLoad.
invoke();
880 CHECK (micros < 133);
884 CHECK (micros < 110);
887 cpuLoad.useAllocation =
true;
888 micros = cpuLoad.
invoke();
889 CHECK (micros < 133);
893 CHECK (micros < 110);
896 cpuLoad.timeBase = 1ms;
897 cpuLoad.sizeBase *= 100;
900 cpuLoad.useAllocation =
false;
901 micros = cpuLoad.
invoke();
902 CHECK (micros > 900);
903 micros = cpuLoad.
invoke(5);
904 CHECK (micros > 4600);
905 micros = cpuLoad.
invoke(10);
906 CHECK (micros > 9500);
907 micros = cpuLoad.
invoke(100);
908 CHECK (micros > 95000);
910 cpuLoad.useAllocation =
true;
911 micros = cpuLoad.
invoke();
912 CHECK (micros > 900);
913 micros = cpuLoad.
invoke(5);
914 CHECK (micros > 4600);
915 micros = cpuLoad.
invoke(10);
916 CHECK (micros > 9500);
917 micros = cpuLoad.
invoke(100);
918 CHECK (micros > 95000);
935 graph.expansionRule(graph.rule().probability(0.8).maxVal(1))
936 .pruningRule(graph.rule().probability(0.6))
937 .weightRule((graph.rule().probability(0.5)))
940 CHECK (8 == graph.allNodes().filter(isStartNode).count());
941 CHECK (16 == graph.allNodes().filter(isExitNode).count());
945 auto exitHashes = graph.allNodes()
947 .transform([](Node& n){
return n.hash; })
949 CHECK (16 == exitHashes.size());
951 size_t combinedHash{0};
952 for (uint i=0; i <16; ++i)
953 boost::hash_combine (combinedHash, exitHashes[i]);
955 CHECK (graph.getHash() == combinedHash);
956 CHECK (graph.getHash() == 0x33B00C450215EB00);
960 graph.allNodePtr().grouped<4>()
961 .
foreach([&](
auto group)
964 auto& [a,b,c,d] = *group;
967 CHECK (not a->weight);
968 CHECK (not b->weight);
971 CHECK (c->hash == 0xAEDC04CFA2E5B999);
972 CHECK (d->hash == 0xAEDC04CFA2E5B999);
973 CHECK (c->weight == 4);
974 CHECK (d->weight == 4);
978 graph.setSeed(55).clearNodeHashes();
979 CHECK (graph.getSeed() == 55);
980 CHECK (graph.getHash() == 0);
981 graph.allNodePtr().grouped<4>()
982 .
foreach([&](
auto group)
984 auto& [a,b,c,d] = *group;
985 CHECK (a->hash == 55);
986 CHECK (b->hash == 0);
987 CHECK (b->hash == 0);
988 CHECK (b->hash == 0);
992 CHECK (graph.getHash() == 0x17427F67DBC8BCC0);
993 graph.allNodePtr().grouped<4>()
994 .
foreach([&](
auto group)
997 auto& [a,b,c,d] = *group;
998 CHECK (a->hash == 55);
999 CHECK (c->hash == 0x7887993B0ED41395);
1000 CHECK (d->hash == 0x7887993B0ED41395);
1004 graph.setSeed(0).recalculate();
1005 CHECK (graph.getHash() == 0x33B00C450215EB00);
1006 graph.setSeed(55).recalculate();
1007 CHECK (graph.getHash() == 0x17427F67DBC8BCC0);
1035 auto isWithin10Percent = [](
double t,
double r)
1037 auto delta = abs (1.0 - t/r);
1043 CHECK (isWithin10Percent(t1, 6400));
1044 CHECK (isWithin10Percent(t2, 10*t1));
1045 CHECK (isWithin10Percent(t3, 4*t1));
1054 CHECK (graph.getHash() == 0x554F5086DE5B0861);
1057 CHECK (graph.getHash() == 0);
1061 CHECK (graph.getHash() == 0x554F5086DE5B0861);
1064 CHECK (graph.getHash() == 0);
1067 CHECK (graph.getHash() == 0x554F5086DE5B0861);
1089 CHECK (level.size() == 26);
1092 auto node = testLoad.allNodePtr().effuse();
1093 _Fmt nodeFmt{
"i=%-2d lev:%-2d w=%1d"};
1094 _Fmt levelFmt{
" Σ%-2d Σw:%2d"};
1095 auto nodeStr = [&](uint i)
1097 size_t l = node[i]->level;
1098 return string{nodeFmt % i % node[i]->level % node[i]->weight}
1099 + (i == level[l].endidx?
string{levelFmt % level[l].nodes % level[l].weight}
1103 CHECK (nodeStr( 1) ==
"i=1 lev:1 w=0 Σ1 Σw: 0"_expect);
1104 CHECK (nodeStr( 2) ==
"i=2 lev:2 w=2 Σ1 Σw: 2"_expect);
1105 CHECK (nodeStr( 3) ==
"i=3 lev:3 w=0 Σ1 Σw: 0"_expect);
1106 CHECK (nodeStr( 4) ==
"i=4 lev:4 w=0 Σ1 Σw: 0"_expect);
1107 CHECK (nodeStr( 5) ==
"i=5 lev:5 w=0 Σ1 Σw: 0"_expect);
1108 CHECK (nodeStr( 6) ==
"i=6 lev:6 w=1 Σ1 Σw: 1"_expect);
1109 CHECK (nodeStr( 7) ==
"i=7 lev:7 w=2 Σ1 Σw: 2"_expect);
1110 CHECK (nodeStr( 8) ==
"i=8 lev:8 w=2 Σ1 Σw: 2"_expect);
1111 CHECK (nodeStr( 9) ==
"i=9 lev:9 w=1 · · "_expect);
1112 CHECK (nodeStr(10) ==
"i=10 lev:9 w=1 Σ2 Σw: 2"_expect);
1113 CHECK (nodeStr(11) ==
"i=11 lev:10 w=0 · · "_expect);
1114 CHECK (nodeStr(12) ==
"i=12 lev:10 w=0 Σ2 Σw: 0"_expect);
1115 CHECK (nodeStr(13) ==
"i=13 lev:11 w=0 · · "_expect);
1116 CHECK (nodeStr(14) ==
"i=14 lev:11 w=0 Σ2 Σw: 0"_expect);
1117 CHECK (nodeStr(15) ==
"i=15 lev:12 w=1 · · "_expect);
1118 CHECK (nodeStr(16) ==
"i=16 lev:12 w=1 Σ2 Σw: 2"_expect);
1119 CHECK (nodeStr(17) ==
"i=17 lev:13 w=1 · · "_expect);
1120 CHECK (nodeStr(18) ==
"i=18 lev:13 w=1 Σ2 Σw: 2"_expect);
1121 CHECK (nodeStr(19) ==
"i=19 lev:14 w=2 · · "_expect);
1122 CHECK (nodeStr(20) ==
"i=20 lev:14 w=2 Σ2 Σw: 4"_expect);
1123 CHECK (nodeStr(21) ==
"i=21 lev:15 w=0 Σ1 Σw: 0"_expect);
1124 CHECK (nodeStr(22) ==
"i=22 lev:16 w=1 Σ1 Σw: 1"_expect);
1125 CHECK (nodeStr(23) ==
"i=23 lev:17 w=3 Σ1 Σw: 3"_expect);
1126 CHECK (nodeStr(24) ==
"i=24 lev:18 w=0 · · "_expect);
1127 CHECK (nodeStr(25) ==
"i=25 lev:18 w=0 · · "_expect);
1128 CHECK (nodeStr(26) ==
"i=26 lev:18 w=0 · · "_expect);
1129 CHECK (nodeStr(27) ==
"i=27 lev:18 w=0 · · "_expect);
1130 CHECK (nodeStr(28) ==
"i=28 lev:18 w=0 Σ5 Σw: 0"_expect);
1131 CHECK (nodeStr(29) ==
"i=29 lev:19 w=2 · · "_expect);
1132 CHECK (nodeStr(30) ==
"i=30 lev:19 w=2 · · "_expect);
1133 CHECK (nodeStr(31) ==
"i=31 lev:19 w=2 · · "_expect);
1134 CHECK (nodeStr(32) ==
"i=32 lev:19 w=2 · · "_expect);
1135 CHECK (nodeStr(33) ==
"i=33 lev:19 w=2 Σ5 Σw:10"_expect);
1136 CHECK (nodeStr(34) ==
"i=34 lev:20 w=3 · · "_expect);
1137 CHECK (nodeStr(35) ==
"i=35 lev:20 w=2 Σ2 Σw: 5"_expect);
1138 CHECK (nodeStr(36) ==
"i=36 lev:21 w=1 · · "_expect);
1139 CHECK (nodeStr(37) ==
"i=37 lev:21 w=1 · · "_expect);
1140 CHECK (nodeStr(38) ==
"i=38 lev:21 w=3 Σ3 Σw: 5"_expect);
1141 CHECK (nodeStr(39) ==
"i=39 lev:22 w=3 · · "_expect);
1142 CHECK (nodeStr(40) ==
"i=40 lev:22 w=3 · · "_expect);
1143 CHECK (nodeStr(41) ==
"i=41 lev:22 w=0 · · "_expect);
1144 CHECK (nodeStr(42) ==
"i=42 lev:22 w=0 · · "_expect);
1145 CHECK (nodeStr(43) ==
"i=43 lev:22 w=0 · · "_expect);
1146 CHECK (nodeStr(44) ==
"i=44 lev:22 w=0 Σ6 Σw: 6"_expect);
1147 CHECK (nodeStr(45) ==
"i=45 lev:23 w=0 · · "_expect);
1151 CHECK (level[19].nodes = 5);
1152 CHECK (level[19].weight = 10);
1161 uint concurrency = 4;
1162 auto steps = testLoad.levelScheduleSequence(concurrency).effuse();
1163 CHECK (steps.size() == 26);
1166 auto boost = [&](uint i){
return level[i].nodes / std::ceil (
double(level[i].nodes)/concurrency); };
1169 _Fmt stepFmt{
"lev:%-2d nodes:%-2d Σw:%2d %4.1f Δ%5.3f ▿▿ %6.3f"};
1170 auto stepStr = [&](uint i){
return string{stepFmt % i % level[i].nodes % level[i].weight % boost(i) % wfact(i) % steps[i]}; };
1173 CHECK (stepStr( 0) ==
"lev:0 nodes:1 Σw: 0 1.0 Δ0.000 ▿▿ 0.000"_expect);
1174 CHECK (stepStr( 1) ==
"lev:1 nodes:1 Σw: 0 1.0 Δ0.000 ▿▿ 0.000"_expect);
1175 CHECK (stepStr( 2) ==
"lev:2 nodes:1 Σw: 2 1.0 Δ2.000 ▿▿ 2.000"_expect);
1176 CHECK (stepStr( 3) ==
"lev:3 nodes:1 Σw: 0 1.0 Δ0.000 ▿▿ 2.000"_expect);
1177 CHECK (stepStr( 4) ==
"lev:4 nodes:1 Σw: 0 1.0 Δ0.000 ▿▿ 2.000"_expect);
1178 CHECK (stepStr( 5) ==
"lev:5 nodes:1 Σw: 0 1.0 Δ0.000 ▿▿ 2.000"_expect);
1179 CHECK (stepStr( 6) ==
"lev:6 nodes:1 Σw: 1 1.0 Δ1.000 ▿▿ 3.000"_expect);
1180 CHECK (stepStr( 7) ==
"lev:7 nodes:1 Σw: 2 1.0 Δ2.000 ▿▿ 5.000"_expect);
1181 CHECK (stepStr( 8) ==
"lev:8 nodes:1 Σw: 2 1.0 Δ2.000 ▿▿ 7.000"_expect);
1182 CHECK (stepStr( 9) ==
"lev:9 nodes:2 Σw: 2 2.0 Δ1.000 ▿▿ 8.000"_expect);
1183 CHECK (stepStr(10) ==
"lev:10 nodes:2 Σw: 0 2.0 Δ0.000 ▿▿ 8.000"_expect);
1184 CHECK (stepStr(11) ==
"lev:11 nodes:2 Σw: 0 2.0 Δ0.000 ▿▿ 8.000"_expect);
1185 CHECK (stepStr(12) ==
"lev:12 nodes:2 Σw: 2 2.0 Δ1.000 ▿▿ 9.000"_expect);
1186 CHECK (stepStr(13) ==
"lev:13 nodes:2 Σw: 2 2.0 Δ1.000 ▿▿ 10.000"_expect);
1187 CHECK (stepStr(14) ==
"lev:14 nodes:2 Σw: 4 2.0 Δ2.000 ▿▿ 12.000"_expect);
1188 CHECK (stepStr(15) ==
"lev:15 nodes:1 Σw: 0 1.0 Δ0.000 ▿▿ 12.000"_expect);
1189 CHECK (stepStr(16) ==
"lev:16 nodes:1 Σw: 1 1.0 Δ1.000 ▿▿ 13.000"_expect);
1190 CHECK (stepStr(17) ==
"lev:17 nodes:1 Σw: 3 1.0 Δ3.000 ▿▿ 16.000"_expect);
1191 CHECK (stepStr(18) ==
"lev:18 nodes:5 Σw: 0 2.5 Δ0.000 ▿▿ 16.000"_expect);
1192 CHECK (stepStr(19) ==
"lev:19 nodes:5 Σw:10 2.5 Δ4.000 ▿▿ 20.000"_expect);
1193 CHECK (stepStr(20) ==
"lev:20 nodes:2 Σw: 5 2.0 Δ2.500 ▿▿ 22.500"_expect);
1194 CHECK (stepStr(21) ==
"lev:21 nodes:3 Σw: 5 3.0 Δ1.667 ▿▿ 24.167"_expect);
1195 CHECK (stepStr(22) ==
"lev:22 nodes:6 Σw: 6 3.0 Δ2.000 ▿▿ 26.167"_expect);
1196 CHECK (stepStr(23) ==
"lev:23 nodes:6 Σw: 6 3.0 Δ2.000 ▿▿ 28.167"_expect);
1197 CHECK (stepStr(24) ==
"lev:24 nodes:10 Σw: 9 3.3 Δ2.700 ▿▿ 30.867"_expect);
1198 CHECK (stepStr(25) ==
"lev:25 nodes:3 Σw: 4 3.0 Δ1.333 ▿▿ 32.200"_expect);
1217 array<Node,4> nodes;
1218 auto& [s,p1,p2,e] = nodes;
1224 p1.level = p2.level = 1;
1226 CHECK (e.hash == 0);
1227 for (Node& n : nodes)
1229 CHECK (e.hash == 0x6A5924BA3389D7C);
1233 for (Node& n : nodes)
1242 ,chainJob.encodeNodeID(0)
1243 ,chainJob.encodeLevel(0)};
1245 ,chainJob.encodeNodeID(1)
1246 ,chainJob.encodeLevel(1)};
1248 ,chainJob.encodeNodeID(2)
1249 ,chainJob.encodeLevel(1)};
1251 ,chainJob.encodeNodeID(3)
1252 ,chainJob.encodeLevel(2)};
1254 CHECK (e.hash == 0);
1259 CHECK (e.hash != 0x6A5924BA3389D7C);
1264 CHECK (e.hash == 0x6A5924BA3389D7C);
1267 CHECK (e.hash != 0x6A5924BA3389D7C);
1272 array<Node,4> clone;
1273 size_t lastTouched(-1);
1274 size_t lastNode (-1);
1275 size_t lastLevel(-1);
1276 bool shallContinue{
false};
1277 auto getNodeIdx = [&](Node* n) {
return n - &nodes[0]; };
1281 auto disposeStep = [&](
size_t idx,
size_t level)
1283 Node& n = clone[idx];
1288 auto setDependency = [&](Node* pred, Node* succ)
1290 size_t predIdx = getNodeIdx(pred);
1291 size_t succIdx = getNodeIdx(succ);
1293 clone[predIdx].addSucc(clone[succIdx]);
1295 auto continuation = [&](size_t,
size_t nodeDone,
size_t levelDone,
bool work_left)
1298 lastLevel = levelDone;
1299 shallContinue = work_left;
1307 ,planJob.encodeNodeID(1)
1310 ,planJob.encodeNodeID(5)
1314 CHECK (lastLevel = 1);
1315 CHECK (lastTouched = 2);
1316 CHECK (lastTouched == lastNode);
1317 Node* lastN = &clone[lastTouched];
1318 CHECK (lastN->level == lastLevel);
1319 CHECK ( isnil (lastN->succ));
1320 CHECK (not isnil (lastN->pred));
1321 CHECK (shallContinue);
1324 CHECK (lastLevel = 3);
1325 CHECK (lastTouched = 3);
1326 CHECK (lastTouched == lastNode);
1327 lastN = &clone[lastTouched];
1328 CHECK (lastN->level == 2);
1329 CHECK (lastN->level < lastLevel);
1330 CHECK ( isnil (lastN->succ));
1331 CHECK (not isnil (lastN->pred));
1332 CHECK (not shallContinue);
1335 CHECK (lastN->hash == 0);
1336 for (Node& n : clone)
1338 CHECK (lastN->hash == 0x6A5924BA3389D7C);
static const Time ANYTIME
border condition marker value. ANYTIME <= any time value
const StatKey STAT_NODE
all nodes
void showcase_SeedChains()
const StatKey STAT_LINK
1:1 linking node
const StatKey STAT_SEED
seed node
void verify_computation_load()
const StatKey STAT_KNOT
knot (joins and forks)
void verify_adjusted_schedule()
const StatKey STAT_EXIT
exit node
double invoke(uint scaleStep=1)
cause a delay by computational load
TestChainLoad && buildTopology()
Use current configuration and seed to (re)build Node connectivity.
Generate synthetic computation load for Scheduler performance tests.
A Generator for synthetic Render Jobs for Scheduler load testing.
A front-end for using printf-style formatting.
void showcase_PruneChains()
double benchmark(uint scaleStep=1)
void verify_scheduling_setup()
»Scheduler-Service« : coordinate render activities.
void verify_reseed_recalculate()
Simple test class runner.
Render JobFunctor to invoke the calculation of a single Node.
Tiny helper functions and shortcuts to be used everywhere Consider this header to be effectively incl...
double computeWeightFactor(LevelWeight const &lw, uint concurrency)
simplified model for expense of a level of nodes, computed concurrently.
double calcRuntimeReference(microseconds timeBase=LOAD_DEFAULT_TIME, size_t sizeBase=0, size_t repeatCnt=GRAPH_BENCHMARK_RUNS)
Conduct a number of benchmark runs over processing the Graph synchronously.
TestChainLoad< 16 > ChainLoad16
shorthand for specific parameters employed by the following tests
A collection of frequently used helper functions to support unit testing.
TestChainLoad && configureShape_chain_loadBursts()
preconfigured topology: single graph with massive »load bursts«
const StatKey STAT_JOIN
joining node
Statistic computeGraphStatistics()
Operator on TestChainLoad to evaluate current graph connectivity.
Definition of a render job.
void verify_runtime_reference()
void showcase_Expansion()
const StatKey STAT_FORK
forking node
TestChainLoad && clearNodeHashes()
Clear node hashes and propagate seed value.
TestChainLoad && configureShape_short_segments3_interleaved()
preconfigured topology: simple interwoven 3-step graph segments
Render JobFunctor to perform chunk wise planning of Node jobs to calculate a complete Chain-Load grap...
Individual frame rendering task, forwarding to a closure.
void showcase_Reduction()
void showcase_StablePattern()
Vault-Layer implementation namespace root.
auto allLevelWeights()
calculate node weights aggregated per level
TestChainLoad && performGraphSynchronously(microseconds timeBase=LOAD_DEFAULT_TIME, size_t sizeBase=0)
Emulate complete graph processing in a single threaded loop.
Collector and aggregator for performance data.
A calibratable CPU load to be invoked from a node job functor.
bool isSameObject(A const &a, B const &b)
compare plain object identity, bypassing any custom comparison operators.