Scheduler: connect BlockFlow capacity announcement

...refine the handling of FrameRates close to the definition bounds
...implement the actual rule to scale allocator capacity on announcement
...hook up into the seedCalcStream() with a default of +25FPS

+ test coverage
This commit is contained in:
Fischlurch 2023-11-10 19:35:38 +01:00
parent a2a960f544
commit 3135887914
9 changed files with 230 additions and 108 deletions

View file

@ -273,22 +273,39 @@ namespace time {
* @remark rational numbers bear the danger to overflow for quite ordinary computations;
* we stay away from the absolute maximum by an additional safety margin of 1/1000.
*/
const uint RATE_LIMIT{std::numeric_limits<uint>::max() / 1000};
const uint RATE_LIMIT{std::numeric_limits<uint>::max() / 1024};
/**
* @internal helper to work around the limitations of `uint`.
* @return a fractional number approximating the floating-point spec.
* @todo imposing a quite coarse limitation. If this turns out
* to be a problem: we can do better, use lib::reQuant (rational.hpp)
* @todo imposing a quite coarse limitation. If this turns out to be
* a problem: we can do better, use lib::reQuant (rational.hpp)
*/
boost::rational<uint>
__framerate_approximation (double fps)
{
double quantised{fabs(fps) * RATE_LIMIT};
const double UPPER_LIMIT = int64_t(RATE_LIMIT*1024) << 31;
const int64_t HAZARD = util::ilog2(RATE_LIMIT);
uint num = uint(limited (1u, quantised + 0.5, 1000u*RATE_LIMIT));
uint den = RATE_LIMIT;
return {num, den};
double doo = limited (1.0, fabs(fps) * RATE_LIMIT + 0.5, UPPER_LIMIT);
int64_t boo(doo);
util::Rat quantised{boo
,int64_t(RATE_LIMIT)
};
int64_t num = quantised.numerator();
int64_t toxic = util::ilog2(abs(num));
toxic = util::max (0, toxic - HAZARD);
int64_t base = quantised.denominator();
if (toxic)
{
base = util::max (base >> toxic, 1);
num = util::reQuant (num, quantised.denominator(), base);
}
return {limited (1u, num, RATE_LIMIT)
,limited (1u, base, RATE_LIMIT)
};
}
/**
@ -300,7 +317,7 @@ namespace time {
{
boost::rational<uint64_t> quot{cnt, _raw(timeReference)};
if (quot.denominator() < RATE_LIMIT
and quot.numerator() < RATE_LIMIT/1000)
and quot.numerator() < RATE_LIMIT*1024/1e6)
return {uint(quot.numerator()) * uint(Time::SCALE)
,uint(quot.denominator())
};

View file

@ -122,6 +122,9 @@ namespace gear {
/** @internal propagate new clean-up deadline to the BlockFlow allocator */
void discardBefore (Time deadline) { mem_.discardBefore (deadline); }
/** @internal announce expected additional load to the allocator */
void announceLoad (FrameRate fps) { mem_.announceAdditionalFlow(fps); }
/**
* Execution Framework: dispatch performance of a chain of Activities.

View file

@ -389,15 +389,6 @@ namespace gear {
epochStep_ = TimeValue{microTicks};
}
/** provide a hint to the self-regulating allocation scheme */
void
announceAdditionalFlow (FrameRate additionalFps)
{
FrameRate currFps{config().framesPerEpoch(), epochStep_};
/////////////////////////////////////////////////////////////////////TODO need arithmetics on FrameRate
/////////////////////////////////////////////////////////////////////TODO -> then just add the new and calculate new stepping
/////////////////////////////////////////////////////////////////////TODO !! watch out for the minimum limit !!
}
/** Adapted storage-Extent iterator, directly exposing Epoch& */
@ -596,6 +587,24 @@ namespace gear {
}
/**
* provide a hint to the self-regulating allocation scheme.
* Signalling additional calculation flow in advance will
* immediately reduce the Epoch stepping to accommodate for
* more Activities per time unit, thereby preventing excessive
* overflow and reduced performance, until the mechanism has
* adapted itself to the actual situation after roughly 2sec.
*/
void
announceAdditionalFlow (FrameRate additionalFps)
{
FrameRate currFps{Strategy::framesPerEpoch(), Duration{epochStep_}};
currFps += additionalFps;
TimeVar adaptedSpacing = Strategy::framesPerEpoch() / currFps;
epochStep_ = util::max (adaptedSpacing, _cache_timeStep_cutOff);
}
private:
Epoch&
firstEpoch()

View file

@ -303,9 +303,11 @@ namespace gear {
*/
void
seedCalcStream (Job planningJob
,ManifestationID manID = ManifestationID())
,ManifestationID manID = ManifestationID()
,FrameRate expectedAdditionalLoad = FrameRate(25))
{
layer1_.activate(manID);
layer1_.activate (manID);
activityLang_.announceLoad (expectedAdditionalLoad);
continueMetaJob (RealClock::now(), planningJob, manID);
}

View file

@ -32,7 +32,7 @@ END
PLANNED "Scheduler Load-Control" SchedulerLoadControl_test <<END
TEST "Scheduler Load-Control" SchedulerLoadControl_test <<END
return: 0
END

View file

@ -230,19 +230,26 @@ namespace test{
CHECK (isnil (Duration (0, FrameRate::PAL)));
CHECK (isnil (Duration (0, FrameRate(123))));
CHECK (FrameRate::approx(2000) == "1000FPS"_expect); // limited
CHECK (FrameRate::approx(1e-5) == "43/4294967FPS"_expect);
CHECK (FrameRate::approx(1e-6) == "4/4294967FPS"_expect);
CHECK (FrameRate::approx(1e-7) == "1/4294967FPS"_expect); // limited
CHECK (FrameRate::approx(1e-8) == "1/4294967FPS"_expect); // limited
CHECK (FrameRate::approx(2000) == "2000FPS"_expect);
CHECK (FrameRate::approx(1e05) == "100000FPS"_expect);
CHECK (FrameRate::approx(1e06) == "1000000FPS"_expect); // exact
CHECK (FrameRate::approx(1e12) == "4194303FPS"_expect); // limited (≈4.2e+6)
CHECK (FrameRate::approx(1e14) == "4194303FPS"_expect); // limited + numeric overflow prevented
CHECK (FrameRate::approx(1e-5) == "14/1398101FPS"_expect); // quantised ≈ 1.00135827e-5
CHECK (FrameRate::approx(1e-6) == "4/4194303FPS"_expect); // quantised ≈ 0.95367454e-6
CHECK (FrameRate::approx(1e-7) == "1/4194303FPS"_expect); // limited ≈ 2.38418636e-7
CHECK (FrameRate::approx(1e-9) == "1/4194303FPS"_expect); // limited ≈ 2.38418636e-7
CHECK (FrameRate( 20'000, Duration{Time{0,10}}) == "2000FPS"_expect);
CHECK (FrameRate( 20'000, Duration{Time::MAX }) == "1/4294967FPS"_expect);// limited
CHECK (FrameRate( 20'000, Duration{Time{0,10}}) == "2000FPS"_expect); // exact
CHECK (FrameRate( 20'000, Duration{Time::MAX }) == "1/4194303FPS"_expect); // limited
CHECK (FrameRate(size_t(2e10), Duration{Time::MAX }) == "279397/4294967FPS"_expect);
CHECK (FrameRate(size_t(2e14), Duration{Time::MAX }) == "2793967531/4294967FPS"_expect);
CHECK (FrameRate(size_t(2e15), Duration{Time::MAX }) == "1000FPS"_expect); // limited
CHECK (FrameRate(size_t(2e16), Duration{Time::MAX }) == "1000FPS"_expect); // limited
CHECK (FrameRate(size_t(2e10), Duration{Time::MAX }) == "272848/4194303FPS"_expect); // quantised ≈ 6.5052048e-2
CHECK (FrameRate(size_t(2e14), Duration{Time::MAX }) == "3552496/5461FPS"_expect); // quantised ≈ 650.52115 exact:650.521
CHECK (FrameRate(size_t(2e15), Duration{Time::MAX }) == "3324163/511FPS"_expect); // quantised ≈ 6505.2114 exact:6505.21
CHECK (FrameRate(size_t(2e16), Duration{Time::MAX }) == "4098284/63FPS"_expect); // quantised ≈ 65052,127 exact:65052.1
CHECK (FrameRate(size_t(2e17), Duration{Time::MAX }) == "650521FPS"_expect); // exact:650521
CHECK (FrameRate(size_t(2e18), Duration{Time::MAX }) == "4194303FPS"_expect); // limited (≈4.2e+6) exact:6.50521e+06
CHECK (FrameRate(size_t(2e20), Duration{Time::MAX }) == "4194303FPS"_expect); // limited exact:6.50521e+08
}

View file

@ -88,6 +88,7 @@ namespace test {
handleEpoch();
placeActivity();
adjustEpochs();
announceLoad();
storageFlow();
}
@ -360,6 +361,26 @@ namespace test {
/** @test announce additional load to reserve additional capacity up-front. */
void
announceLoad()
{
BlockFlow bFlow;
Duration initialStep{bFlow.getEpochStep()};
size_t initialFPS = Strategy{}.initialFrameRate();
// signal that the load will be doubled
bFlow.announceAdditionalFlow (FrameRate(initialFPS));
CHECK (bFlow.getEpochStep() * 2 == initialStep);
// signal that the load will again be doubled
bFlow.announceAdditionalFlow (FrameRate(2*initialFPS));
CHECK (bFlow.getEpochStep() * 4 == initialStep);
}
/** @test investigate progression of epochs under realistic load
* - expose the allocator to a load of 200fps for simulated 3 Minutes

View file

@ -28,28 +28,19 @@
#include "lib/test/run.hpp"
#include "vault/gear/load-controller.hpp"
#include "vault/real-clock.hpp"
//#include "lib/time/timevalue.hpp"
//#include "lib/format-cout.hpp"
//#include "lib/util.hpp"
#include "lib/test/diagnostic-output.hpp"/////////////////////TODO
//#include <utility>
#include <chrono>
using test::Test;
using std::move;
using std::chrono::microseconds;
//using util::isSameObject;
namespace vault{
namespace gear {
namespace test {
// using lib::time::FrameRate;
// using lib::time::Offset;
// using lib::time::Time;
using std::move;
using std::chrono::microseconds;
using Capacity = LoadController::Capacity;
using Wiring = LoadController::Wiring;
@ -75,8 +66,6 @@ namespace test {
classifyCapacity();
scatteredReCheck();
indicateAverageLoad();
walkingDeadline();
}
@ -99,7 +88,6 @@ namespace test {
* Activities from the zone considered part of current active operation
* - Activities within the NOW_HORIZON can be awaited by yield-spinning
* - and any event from current into the past will be scheduled right away
* @todo WIP 10/23 ✔ define ⟶ ✔ implement
*/
void
classifyHorizon()
@ -129,7 +117,6 @@ namespace test {
/** @test verify the mark for _tended next head_ Activity.
* @todo WIP 10/23 ✔ define ⟶ ✔ implement
*/
void
tendNextActivity()
@ -174,7 +161,6 @@ namespace test {
* - beyond that, free capacity is redistributed according to horizon
* - for incoming free capacity there is a preference to keep it sleeping,
* to allow for disposing of excess capacity after extended sleep time
* @todo WIP 10/23 ✔ define ⟶ ✔ implement
*/
void
classifyCapacity()
@ -253,7 +239,6 @@ namespace test {
* the goal is to produce a random distribution of the »sleeper« callbacks.
* - the offset is indeed randomised, using current time for randomisation
* @see LoadController::scatteredDelayTime()
* @todo WIP 10/23 ✔ define ⟶ ✔ implement
*/
void
scatteredReCheck()
@ -307,7 +292,6 @@ namespace test {
* - the pressure is sampled from the lag (distance of current time to the
* next activity to schedule), which is observed whenever a worker
* calls in to retrieve more work. These calls happen randomly.
* @todo WIP 10/23 ✔ define ⟶ ✔ implement
*/
void
indicateAverageLoad()
@ -373,17 +357,6 @@ namespace test {
lctrl.markIncomingCapacity (head,curr);
CHECK (-2581 == lctrl.averageLag());
}
/** @test TODO
* @todo WIP 10/23 🔁 define ⟶ implement
*/
void
walkingDeadline()
{
UNIMPLEMENTED ("walking Deadline");
}
};

View file

@ -82038,17 +82038,18 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697736405977" HGAP="-3" ID="ID_1390282587" MODIFIED="1697736482656" TEXT="Scheduler-API" VSHIFT="43">
<font NAME="SansSerif" SIZE="15"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1697736413463" ID="ID_996573918" MODIFIED="1697736451469" TEXT="ein sinnvolles externes API entwickeln">
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1697736413463" ID="ID_996573918" MODIFIED="1699650479669" TEXT="ein sinnvolles externes API entwickeln">
<linktarget COLOR="#ff1924" DESTINATION="ID_996573918" ENDARROW="Default" ENDINCLINATION="-817;60;" ID="Arrow_ID_226641198" SOURCE="ID_1891808134" STARTARROW="None" STARTINCLINATION="-848;-40;"/>
<icon BUILTIN="flag-pink"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1697736509591" ID="ID_1412564814" MODIFIED="1697736530363" TEXT="Ma&#xdf;gabe">
<icon BUILTIN="yes"/>
<node COLOR="#435e98" CREATED="1697736509591" ID="ID_1412564814" MODIFIED="1699650487058" TEXT="Ma&#xdf;gabe">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="yes"/>
<node CREATED="1697745097705" ID="ID_1262541957" MODIFIED="1697745115210" TEXT="Scheduler wird als Service per DI zugreifbar sein"/>
<node CREATED="1697745116038" ID="ID_552854146" MODIFIED="1697745125617" TEXT="Kopplung auf die Activity-Language vermeiden"/>
<node CREATED="1697745162168" ID="ID_1987710185" MODIFIED="1697745167195" TEXT="Orientierung am Use-Case"/>
<node CREATED="1697745171552" ID="ID_1226499224" MODIFIED="1697745177738" TEXT="Konzept &#xbb;Render-Job&#xab;"/>
</node>
<node CREATED="1697745184133" ID="ID_1741520544" MODIFIED="1697745192149" TEXT="Use-Case-Analyse">
<node COLOR="#435e98" CREATED="1697745184133" ID="ID_1741520544" MODIFIED="1699650515551" TEXT="Use-Case-Analyse">
<icon BUILTIN="info"/>
<node CREATED="1697745329298" ID="ID_1167489748" MODIFIED="1697745333980" TEXT="operational control">
<node CREATED="1697745335153" ID="ID_217274836" MODIFIED="1697745434359" TEXT="Verarbeitung terminieren"/>
@ -82092,8 +82093,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697745850749" ID="ID_48640613" MODIFIED="1697745867438" TEXT="Worker-Function"/>
</node>
</node>
<node CREATED="1697756690787" ID="ID_87589773" MODIFIED="1697756717299" TEXT="Design: delegierende &#xe4;u&#xdf;ere H&#xfc;lle"/>
<node CREATED="1698936372735" ID="ID_1811375699" MODIFIED="1698936389780" TEXT="Service-Access">
<node COLOR="#435e98" CREATED="1697756690787" ID="ID_87589773" MODIFIED="1699650514045" TEXT="Design: delegierende &#xe4;u&#xdf;ere H&#xfc;lle">
<icon BUILTIN="forward"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1698936372735" ID="ID_1811375699" MODIFIED="1699650531652" TEXT="Service-Access">
<icon BUILTIN="hourglass"/>
<node CREATED="1698936390960" ID="ID_31091241" MODIFIED="1698945655354" TEXT="separates Interface definieren">
<linktarget COLOR="#ec2747" DESTINATION="ID_31091241" ENDARROW="Default" ENDINCLINATION="-130;11;" ID="Arrow_ID_215197651" SOURCE="ID_685418556" STARTARROW="None" STARTINCLINATION="5;-19;"/>
<node CREATED="1698937133797" ID="ID_609493132" MODIFIED="1698937141485" TEXT="scheduler-api.hpp">
@ -82195,6 +82199,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699650558686" ID="ID_1201899822" MODIFIED="1699651662038" TEXT="als Backend-Service bereitstellen">
<arrowlink COLOR="#ea3575" DESTINATION="ID_546523595" ENDARROW="Default" ENDINCLINATION="-1668;-127;" ID="Arrow_ID_870877078" STARTARROW="None" STARTINCLINATION="-2501;197;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697756746748" ID="ID_1029141907" MODIFIED="1697757702430" TEXT="Interface bauen">
@ -82401,8 +82409,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1697757025906" ID="ID_180161439" MODIFIED="1699575045104" TEXT="seedCalcStream()">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1697757025906" ID="ID_180161439" MODIFIED="1699641333620" TEXT="seedCalcStream()">
<icon BUILTIN="button_ok"/>
<node CREATED="1699568049090" ID="ID_1596574245" MODIFIED="1699568057075" TEXT="hat sehr viel limitiertere Aufgaben">
<icon BUILTIN="idea"/>
</node>
@ -82446,9 +82454,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1699588828420" ID="ID_291850353" MODIFIED="1699588844769" TEXT="zus&#xe4;tzlich die ManifestationID freischalten">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699588845747" ID="ID_75294881" MODIFIED="1699589219892" TEXT="scheduler CalcStream: Kapazit&#xe4;ts-hint an den BlockFlow-Allocator weitergeben">
<arrowlink COLOR="#df1a3b" DESTINATION="ID_737137964" ENDARROW="Default" ENDINCLINATION="-1137;63;" ID="Arrow_ID_1003728898" STARTARROW="None" STARTINCLINATION="-998;36;"/>
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1699588845747" ID="ID_75294881" MODIFIED="1699641330164" TEXT="schedule CalcStream: Kapazit&#xe4;ts-hint an den BlockFlow-Allocator weitergeben">
<arrowlink COLOR="#4cb694" DESTINATION="ID_737137964" ENDARROW="Default" ENDINCLINATION="-1137;63;" ID="Arrow_ID_1003728898" STARTARROW="None" STARTINCLINATION="-998;36;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1697757058002" ID="ID_603254465" MODIFIED="1698867045291" TEXT="terminateProcessing()">
@ -93129,7 +93137,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1688337270626" FOLDED="true" ID="ID_1810148055" MODIFIED="1689994032309" TEXT="&#xbb;BlockFlow&#xab; : Implementation">
<node COLOR="#338800" CREATED="1688337270626" FOLDED="true" ID="ID_1810148055" MODIFIED="1699624141630" TEXT="&#xbb;BlockFlow&#xab; : Implementation">
<linktarget COLOR="#578096" DESTINATION="ID_1810148055" ENDARROW="Default" ENDINCLINATION="-1144;102;" ID="Arrow_ID_1579502372" SOURCE="ID_1478014419" STARTARROW="None" STARTINCLINATION="549;39;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1688398675985" ID="ID_291772625" MODIFIED="1689188506325" TEXT="Basis: ExtentFamily">
@ -94209,9 +94217,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699588894575" ID="ID_737137964" MODIFIED="1699589215022" TEXT="BlockFlow: Hint zur Platz-Regulierung unterst&#xfc;tzen">
<linktarget COLOR="#df1a3b" DESTINATION="ID_737137964" ENDARROW="Default" ENDINCLINATION="-1137;63;" ID="Arrow_ID_1003728898" SOURCE="ID_75294881" STARTARROW="None" STARTINCLINATION="-998;36;"/>
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1699588894575" FOLDED="true" ID="ID_737137964" MODIFIED="1699641321692" TEXT="BlockFlow: Hint zur Platz-Regulierung unterst&#xfc;tzen">
<linktarget COLOR="#4cb694" DESTINATION="ID_737137964" ENDARROW="Default" ENDINCLINATION="-1137;63;" ID="Arrow_ID_1003728898" SOURCE="ID_75294881" STARTARROW="None" STARTINCLINATION="-998;36;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1699588945917" ID="ID_83511183" MODIFIED="1699588974776">
<richcontent TYPE="NODE"><html>
<head/>
@ -94223,14 +94231,74 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1699588976977" ID="ID_290474610" MODIFIED="1699588993439" TEXT="dazu den FrameRate-Typ ausbauen">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1699588976977" ID="ID_290474610" MODIFIED="1699641236707" TEXT="dazu den FrameRate-Typ ausbauen">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1699588995897" ID="ID_14216185" MODIFIED="1699589010757" TEXT="Errechnen aus count + Referenz-Zeit">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1699589011492" ID="ID_1793529885" MODIFIED="1699589032034" TEXT="Problem: &#xdc;berlauf-Gefahr der fractional-Arrithmetik">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1699589011492" ID="ID_1793529885" MODIFIED="1699641194195" TEXT="Problem: &#xdc;berlauf-Gefahr der fractional-Arithmetik">
<icon BUILTIN="messagebox_warning"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1699640990559" ID="ID_361038897" MODIFIED="1699641191683" TEXT="f&#xfc;hre ein Limit ein : uint_MAX / 1024">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1699641014924" ID="ID_202539962" MODIFIED="1699641188771" TEXT="in Grenzbereichen re-Quantisieren">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
wende wieder die gleiche Technik an, die ich f&#252;r das ZoomWindow erfolgreich entwickelt hatte...
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
<node CREATED="1699641067355" ID="ID_1475176874" MODIFIED="1699641077742" TEXT="Vor-Berechnung in 64bit rational"/>
<node CREATED="1699641078485" ID="ID_1257691129" MODIFIED="1699641183383" TEXT="wenn Z&#xe4;hler nicht darstellbar &#x27f9; requantisieren">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<ol>
<li>
feststellen, um wie viele Stellen die Zahl zu gro&#223; ist (bin&#228;r-logarithmus)
</li>
<li>
den Nenner um diese Zahl nach rechts schieben &#10233; neuer quantisierer
</li>
<li>
mit diesem die Zahl re-quantisieren
</li>
<li>
daraus ein boost::rationall&lt;uint&gt;
</li>
</ol>
</body>
</html>
</richcontent>
</node>
<node CREATED="1699641102423" ID="ID_904020690" MODIFIED="1699641115409" TEXT="quantisiere auf das Limit (im Nenner)"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1699641198146" ID="ID_1058495216" MODIFIED="1699641232676" TEXT="Arithmetik schon zug&#xe4;nglich, da er von boost::rational&lt;uint&gt; erbt">
<icon BUILTIN="idea"/>
</node>
<node COLOR="#338800" CREATED="1699641219639" ID="ID_1481490655" MODIFIED="1699641229214" TEXT="TimeValue_test erg&#xe4;nzt mit Grenzf&#xe4;llen">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1699641240696" ID="ID_749156465" MODIFIED="1699641284541" TEXT="der Rest ist eine total banale Rechnung">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<ul>
<li>
aktuelle Framerate += zus&#228;tzliche Framerate
</li>
<li>
Framerate &#10233; neue Epochen-Dauer, setzen!
</li>
</ul>
</body>
</html></richcontent>
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
@ -95012,12 +95080,12 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689204512737" HGAP="-89" ID="ID_783591358" MODIFIED="1689204530748" TEXT="Diagnostik-Hilfsmittel" VSHIFT="17">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1689204512737" HGAP="-89" ID="ID_783591358" MODIFIED="1699651832095" TEXT="Diagnostik-Hilfsmittel" VSHIFT="17">
<icon BUILTIN="button_ok"/>
<node CREATED="1689204533558" ID="ID_377070637" MODIFIED="1689204547921" TEXT="sollen Unit- und Integrationstests unterst&#xfc;tzen">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1689204554739" ID="ID_1440899868" MODIFIED="1689204570206" TEXT="Beobachtungs-Ziele">
<node COLOR="#435e98" CREATED="1689204554739" ID="ID_1440899868" MODIFIED="1699651718593" TEXT="Beobachtungs-Ziele">
<icon BUILTIN="info"/>
<node COLOR="#338800" CREATED="1689204572129" ID="ID_658361919" MODIFIED="1689204583104" TEXT="F&#xfc;llstand des Basis-Allokators">
<icon BUILTIN="button_ok"/>
@ -95031,12 +95099,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#435e98" CREATED="1689204650526" ID="ID_624484958" MODIFIED="1689449409248" TEXT="newest"/>
<node COLOR="#435e98" CREATED="1689204731722" ID="ID_1494295782" MODIFIED="1689439593921" TEXT="Allokations-Zuordnung"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689204805041" ID="ID_1427200190" MODIFIED="1689204809545" TEXT="Ereignisse">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689204818615" ID="ID_1296035133" MODIFIED="1689204891288" TEXT="Funktor-Aufruf"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689204823334" ID="ID_1131519387" MODIFIED="1689204891288" TEXT="Activity-Aktivierung"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689204840484" ID="ID_750822384" MODIFIED="1689204891288" TEXT="Signal-Wire-Tap"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689204883742" ID="ID_1433267374" MODIFIED="1689204891288" TEXT="Gate-Verhalten"/>
<node COLOR="#338800" CREATED="1689204805041" ID="ID_1427200190" MODIFIED="1699651800784" TEXT="Ereignisse">
<arrowlink COLOR="#3cca7d" DESTINATION="ID_1294988847" ENDARROW="Default" ENDINCLINATION="-115;-8;" ID="Arrow_ID_628591045" STARTARROW="None" STARTINCLINATION="-132;22;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1689204818615" ID="ID_1296035133" MODIFIED="1699651715164" TEXT="Funktor-Aufruf"/>
<node COLOR="#435e98" CREATED="1689204823334" ID="ID_1131519387" MODIFIED="1699651715163" TEXT="Activity-Aktivierung"/>
<node COLOR="#435e98" CREATED="1689204840484" ID="ID_750822384" MODIFIED="1699651715163" TEXT="Signal-Wire-Tap"/>
<node COLOR="#435e98" CREATED="1689204883742" ID="ID_1433267374" MODIFIED="1699651715162" TEXT="Gate-Verhalten"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1689204905242" ID="ID_924464779" MODIFIED="1689204946332" TEXT="Diagnose-Kontext">
@ -95044,18 +95113,25 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1689204913954" ID="ID_256874849" MODIFIED="1689204922646" TEXT="f&#xfc;r ExtentFamily">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689204923473" ID="ID_756310466" MODIFIED="1693168692455" TEXT="f&#xfc;r BlockFlow">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1689204923473" ID="ID_756310466" MODIFIED="1699651723647" TEXT="f&#xfc;r BlockFlow">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1689439619197" ID="ID_1454011778" MODIFIED="1689439653881" TEXT="erste und letzte Epoche als Deadline">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1689439631356" ID="ID_801146515" MODIFIED="1689439653881" TEXT="Epoche finden, in die eine gegebene Activity alloziert wurde">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#435e98" CREATED="1699651725378" ID="ID_19675173" MODIFIED="1699651732928" TEXT="realisiert als Test-Adapter">
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1689204967974" ID="ID_1294988847" MODIFIED="1693169207316" TEXT="f&#xfc;r Scheduler-Integration: ActivityDetector">
</node>
<node COLOR="#338800" CREATED="1689204967974" ID="ID_1294988847" MODIFIED="1699651788869" TEXT="f&#xfc;r Scheduler-Integration: ActivityDetector">
<arrowlink COLOR="#7a78a4" DESTINATION="ID_284088835" ENDARROW="Default" ENDINCLINATION="-1242;118;" ID="Arrow_ID_807229137" STARTARROW="None" STARTINCLINATION="772;49;"/>
<icon BUILTIN="pencil"/>
<linktarget COLOR="#3cca7d" DESTINATION="ID_1294988847" ENDARROW="Default" ENDINCLINATION="-115;-8;" ID="Arrow_ID_628591045" SOURCE="ID_1427200190" STARTARROW="None" STARTINCLINATION="-132;22;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1699651806710" HGAP="42" ID="ID_1629577504" MODIFIED="1699651820753" TEXT="weithin im Test verwendet und bew&#xe4;hrt" VSHIFT="17">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>
@ -96990,28 +97066,39 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1680563509728" ID="ID_1883500842" MODIFIED="1684869810400" TEXT="Scheduler">
<icon BUILTIN="stop"/>
<node CREATED="1688438164169" ID="ID_1339299906" MODIFIED="1688438167334" TEXT="Funktionalit&#xe4;t">
<node CREATED="1680563512563" ID="ID_960191744" MODIFIED="1680563516470" TEXT="Layer-2">
<node CREATED="1692566362369" ID="ID_1816994355" MODIFIED="1692566368011" TEXT="Activity-Language">
<node CREATED="1692566369648" ID="ID_294018156" MODIFIED="1692566374835" TEXT="Builder"/>
<node CREATED="1692566375567" ID="ID_10896035" MODIFIED="1692566467830" TEXT="Execution-Context">
<arrowlink COLOR="#3e2835" DESTINATION="ID_1046477455" ENDARROW="Default" ENDINCLINATION="15;-31;" ID="Arrow_ID_1124233052" STARTARROW="None" STARTINCLINATION="-48;7;"/>
<node CREATED="1680563512563" ID="ID_960191744" LINK="#ID_1218283238" MODIFIED="1699651252147" TEXT="Layer-2">
<node CREATED="1692566489639" ID="ID_1996598339" MODIFIED="1692566493766" TEXT="Steuer-Funktionen">
<node CREATED="1692566497553" ID="ID_1690265718" MODIFIED="1692566507183" TEXT="post &#x27f6; Dispatch"/>
<node CREATED="1699650768870" ID="ID_419238263" MODIFIED="1699650770973" TEXT="findWork"/>
</node>
<node CREATED="1699650773349" ID="ID_1043737602" MODIFIED="1699650792687" TEXT="Parallelit&#xe4;ts-Steuerung: Grooming-Token"/>
</node>
<node CREATED="1680563517255" ID="ID_1104189783" LINK="#ID_250843894" MODIFIED="1699651271277" TEXT="Layer-1">
<node CREATED="1692566313239" ID="ID_1808059473" MODIFIED="1692566321794" TEXT="zwei Queues">
<node CREATED="1692566323494" ID="ID_613099653" MODIFIED="1692566329257" TEXT="Dispatch (Eingang)"/>
<node CREATED="1692566330437" ID="ID_678232879" MODIFIED="1692566338568" TEXT="Priority (Zeitordnung)"/>
</node>
</node>
<node CREATED="1692566387373" ID="ID_1046477455" MODIFIED="1692566451735" TEXT="&#x3bb;-Eing&#xe4;nge">
<linktarget COLOR="#3e2835" DESTINATION="ID_1046477455" ENDARROW="Default" ENDINCLINATION="15;-31;" ID="Arrow_ID_1124233052" SOURCE="ID_10896035" STARTARROW="None" STARTINCLINATION="-48;7;"/>
<node CREATED="1699650694688" ID="ID_1997806552" MODIFIED="1699650697603" TEXT="Integration">
<node CREATED="1692566362369" ID="ID_1816994355" LINK="#ID_975357334" MODIFIED="1699651179635" TEXT="Activity-Language">
<node CREATED="1692566369648" ID="ID_294018156" LINK="#ID_1334461256" MODIFIED="1699651119759" TEXT="Builder"/>
<node CREATED="1692566375567" ID="ID_10896035" LINK="#ID_1020998473" MODIFIED="1699651212129" TEXT="Execution-Context">
<arrowlink COLOR="#3e2835" DESTINATION="ID_1046477455" ENDARROW="Default" ENDINCLINATION="14;-37;" ID="Arrow_ID_1124233052" STARTARROW="None" STARTINCLINATION="-39;5;"/>
</node>
</node>
<node CREATED="1692566387373" ID="ID_1046477455" MODIFIED="1699651212129" TEXT="&#x3bb;-Eing&#xe4;nge">
<linktarget COLOR="#3e2835" DESTINATION="ID_1046477455" ENDARROW="Default" ENDINCLINATION="14;-37;" ID="Arrow_ID_1124233052" SOURCE="ID_10896035" STARTARROW="None" STARTINCLINATION="-39;5;"/>
<node CREATED="1692566398897" ID="ID_389964436" MODIFIED="1692566403127" TEXT="post"/>
<node CREATED="1692566404235" ID="ID_881438768" MODIFIED="1692566410798" TEXT="work"/>
<node CREATED="1692566411650" ID="ID_177539975" MODIFIED="1692566413482" TEXT="done"/>
<node CREATED="1692566414305" ID="ID_1178933917" MODIFIED="1692566416203" TEXT="tick"/>
</node>
<node CREATED="1692566489639" ID="ID_1996598339" MODIFIED="1692566493766" TEXT="Steuer-Funktionen">
<node CREATED="1692566497553" ID="ID_1690265718" MODIFIED="1692566507183" TEXT="post &#x27f6; Dispatch"/>
</node>
</node>
<node CREATED="1680563517255" ID="ID_1104189783" MODIFIED="1680563519264" TEXT="Layer-1">
<node CREATED="1692566313239" ID="ID_1808059473" MODIFIED="1692566321794" TEXT="zwei Queues">
<node CREATED="1692566323494" ID="ID_613099653" MODIFIED="1692566329257" TEXT="Dispatch (Eingang)"/>
<node CREATED="1692566330437" ID="ID_678232879" MODIFIED="1692566338568" TEXT="Priority (Zeitordnung)"/>
<node CREATED="1699650823943" ID="ID_1545325852" MODIFIED="1699650831145" TEXT="high-level API">
<node CREATED="1699650846197" ID="ID_373839625" LINK="#ID_1863445864" MODIFIED="1699650986807" TEXT="ignite()"/>
<node CREATED="1699650854103" ID="ID_273451870" LINK="#ID_1714344789" MODIFIED="1699651003205" TEXT="getLoadIndicator()"/>
<node CREATED="1699650863841" ID="ID_1201923738" LINK="#ID_180161439" MODIFIED="1699651012517" TEXT="seedCalcStream()"/>
<node CREATED="1699650871488" ID="ID_1131231003" LINK="#ID_1142273023" MODIFIED="1699651025363" TEXT="defineSchedule(Job)"/>
<node CREATED="1699650897725" ID="ID_1904469767" LINK="#ID_492054934" MODIFIED="1699651037186" TEXT="getWork()"/>
</node>
</node>
</node>
@ -97093,7 +97180,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1693840154226" ID="ID_1739899141" MODIFIED="1693840187853" TEXT="&#xd83d;&#xdc80; bisher nur ein Skelett"/>
<node CREATED="1693840205259" ID="ID_906117225" MODIFIED="1693840220900" TEXT="Services">
<node CREATED="1693840225944" ID="ID_546523595" MODIFIED="1693840228291" TEXT="der Scheduler"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693840225944" ID="ID_546523595" MODIFIED="1699651662038" TEXT="der Scheduler-Service">
<linktarget COLOR="#ea3575" DESTINATION="ID_546523595" ENDARROW="Default" ENDINCLINATION="-1668;-127;" ID="Arrow_ID_870877078" SOURCE="ID_1201899822" STARTARROW="None" STARTINCLINATION="-2501;197;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693841227130" ID="ID_1957090536" MODIFIED="1693841404088" TEXT="WorkForce-Komponente bereitstellen">
<arrowlink COLOR="#3974b2" DESTINATION="ID_987966047" ENDARROW="Default" ENDINCLINATION="-1039;-52;" ID="Arrow_ID_7965989" STARTARROW="None" STARTINCLINATION="-1231;87;"/>
<icon BUILTIN="flag-yellow"/>