Dispatcher-Pipeline: now (finally) able to implement MockDispatcher

MockSupport_test      : PASS
JobPlanningSetup_test : PASS(as far as defined)
This commit is contained in:
Fischlurch 2023-06-13 03:47:42 +02:00
parent 122addbff5
commit 0b9705692b
14 changed files with 210 additions and 68 deletions

View file

@ -270,7 +270,7 @@ namespace engine {
/** Package a Ticket together with a direct dependency,
* to allow setup of schedule times in downstream processing */
using TicketDepend = std::pair<JobTicket const*, JobTicket const*>;
using TicketDepend = std::pair<JobTicket*, JobTicket*>;
/**
@ -305,9 +305,9 @@ namespace engine {
return buildPipeline (
this->expandAll([](TicketDepend& currentLevel)
{
JobTicket const* parent = currentLevel.second;
JobTicket* parent = currentLevel.second;
return lib::transformIterator (parent->getPrerequisites()
,[&parent](JobTicket const& prereqTicket)
,[&parent](JobTicket& prereqTicket)
{ // parent shifted up to first pos
return TicketDepend{parent, &prereqTicket};
}

View file

@ -52,7 +52,7 @@ namespace engine {
/** special »do nothing« JobTicket marker */
const JobTicket JobTicket::NOP{}; //////////////////////////////////////////////////////////////TICKET #725 : do we actually need that for the final data structure?
JobTicket JobTicket::NOP{}; ////////////////////////////////////////////////////////////////////TICKET #725 : do we actually need that for the final data structure?
JobTicket::JobTicket()
: provision_{nopFunctor(), ExitNode::NIL}

View file

@ -90,6 +90,7 @@ using lib::LUID;
* the JobTicket acts as _higher order function:_ a function generating
* on invocation another, specific function (= the job).
*
* @note JobTicket is effectively immutable after construction
* @todo 4/23 WIP-WIP-WIP defining the invocation sequence and render jobs
*/
class JobTicket
@ -98,7 +99,7 @@ using lib::LUID;
struct Prerequisite
{
Prerequisite* next{nullptr}; // for intrusive list
JobTicket const& prereqTicket;
JobTicket& prereqTicket;
template<class ALO>
Prerequisite (ExitNode const& node, ALO& allocateTicket)
@ -138,7 +139,7 @@ using lib::LUID;
: provision_{buildProvisionSpec (exitNode, allocator)}
{ }
static const JobTicket NOP;
static JobTicket NOP;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 : likely to become obsolete
@ -151,11 +152,11 @@ using lib::LUID;
Job createJobFor (FrameCoord coordinates) const;
auto
getPrerequisites () const
getPrerequisites ()
{
return lib::transformIterator (this->empty()? Prerequisites::const_iterator()
return lib::transformIterator (this->empty()? Prerequisites::iterator()
: provision_.prerequisites.begin()
,[](Prerequisite const& prq) -> JobTicket const&
,[](Prerequisite& prq) -> JobTicket&
{
return prq.prereqTicket;
});

View file

@ -70,7 +70,7 @@ namespace fixture {
{
using JobTicket = engine::JobTicket;
using TicketAlloc = lib::AllocatorHandle<JobTicket>;
using PortTable = std::deque<std::reference_wrapper<const JobTicket>>;
using PortTable = std::deque<std::reference_wrapper<JobTicket>>;
protected:
@ -128,7 +128,7 @@ namespace fixture {
* Access the JobTicket for this segment and the given \a portNr
* @remark will be created on-demand and remain stable thereafter.
*/
engine::JobTicket const&
engine::JobTicket&
jobTicket (size_t portNr) const
{
if (portNr >= portTable_.size())

View file

@ -83,8 +83,7 @@ namespace fixture {
class Segmentation
: util::NonCopyable
{
///////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1243 : preliminary implementation
protected:
/** segments of the engine in ordered sequence. */
list<Segment> segments_;

View file

@ -146,6 +146,12 @@ namespace mobject {
return mp1.id_ != mp2.id_;
}
friend bool
operator< (ModelPort const& mp1, ModelPort const& mp2)
{
return lib::HashVal(mp1.id_) < lib::HashVal(mp2.id_);
}
private:
};

View file

@ -130,8 +130,8 @@ namespace test {
)
.genNode()};
fixture::Segment const& seg = mockSegs[Time{0,15}]; // access anywhere 10s <= t < 20s
JobTicket const& ticket = seg.jobTicket(0); // get the master-JobTicket from this segment
JobTicket const& prereq = *(ticket.getPrerequisites()); // pull a prerequisite JobTicket
JobTicket& ticket = seg.jobTicket(0); // get the master-JobTicket from this segment
JobTicket& prereq = *(ticket.getPrerequisites()); // pull a prerequisite JobTicket
FrameCoord coord; // Frame coordinates for invocation (placeholder)
Job jobP = prereq.createJobFor(coord); // create an instance of the prerequisites for this coordinates
@ -203,6 +203,7 @@ namespace test {
JobTicket const& ticket = *pipeline->second;
FrameCoord dummy;
dummy.absoluteNominalTime = Time::ZERO; // actual time point is irrelevant here
Job job = ticket.createJobFor(dummy);
CHECK (dispatcher.verify(job, port, sink));
}

View file

@ -61,9 +61,10 @@
#include "lib/linked-elements.hpp"
#include "lib/itertools.hpp"
#include "lib/depend.hpp"
#include "lib/util.hpp"
#include <tuple>
#include <list>
#include <map>
namespace steam {
@ -76,6 +77,8 @@ namespace test {
using lib::time::TimeValue;
using lib::time::Time;
using lib::HashVal;
using util::isnil;
using util::isSameObject;
///////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1294 : organisation of namespaces / includes??
using fixture::Segmentation;
@ -170,14 +173,10 @@ namespace test {
class MockSegmentation
: public Segmentation
{
// simulated allocator;
// must be able to handle re-entrant allocations
std::list<MockJobTicket> tickets_;
public:
MockSegmentation()
: Segmentation{}
, tickets_{}
{ }
MockSegmentation (std::initializer_list<GenNode> specs)
@ -202,6 +201,9 @@ namespace test {
,& DummyJob::getFunctor()};
}
/** @internal helper for MockDispatcher */
void duplicateExitNodeSpec (uint times);
private: /* ======== Implementation: build fake ExitNodes from test specification ==== */
@ -226,6 +228,21 @@ namespace test {
/**
* This is some trickery to allow handling of multiple ModelPort(s) in MockDispatcher;
* actually the code using this mock setup does not need any elaborate differentiation
* of the ExitNodes structure per port, thus the first entry of the existing configuration
* is just duplicated for the given number of further ModelPorts.
* @warning this manipulation must be done prior to generating any JobTicket
*/
inline void
MockSegmentation::duplicateExitNodeSpec (uint times)
{
for (fixture::Segment& seg : segments_)
seg.exitNode = move(fixture::NodeGraphAttachment{ExitNodes{times, seg.exitNode[0]}});
}
/**
* verify the given job instance was actually generated from this JobTicket.
* @remark this test support function relies on some specific rigging,
@ -263,6 +280,9 @@ namespace test {
DummyPlaybackSetup dummySetup_;
MockSegmentation mockSeg_;
using PortIdxMap = std::map<ModelPort, size_t>;
const PortIdxMap portIdx_;
public:
/* == mock Dispatcher implementation == */
@ -279,24 +299,41 @@ namespace test {
UNIMPLEMENTED ("determine when to finish a planning chunk");
}
size_t
resolveModelPort (ModelPort modelPort) override
{
UNIMPLEMENTED ("some Map lookup in a prepared table to find out the actual slot number");
auto entry = portIdx_.find(modelPort);
if (entry == portIdx_.end())
throw error::Logic{"Invalid ModelPort for this Dispatcher"};
else
return entry->second;
}
JobTicket&
accessJobTicket (size_t, TimeValue nominalTime) override
accessJobTicket (size_t portIDX, TimeValue nominalTime) override
{
UNIMPLEMENTED ("dummy implementation of the model backbone / segmentation");
auto& seg = mockSeg_[nominalTime];
return seg.jobTicket(portIDX);
}
MockDispatcher() = default;
MockDispatcher()
: dummySetup_{}
, mockSeg_{MakeRec().genNode()} // Node: generate a single active Segment to cover all
, portIdx_{buildPortIndex()}
{
mockSeg_.duplicateExitNodeSpec(portIdx_.size());
}
MockDispatcher (std::initializer_list<GenNode> specs)
: mockSeg_(specs)
{ }
: dummySetup_{}
, mockSeg_(specs)
, portIdx_{buildPortIndex()}
{
mockSeg_.duplicateExitNodeSpec(portIdx_.size());
}
ModelPort
@ -313,7 +350,7 @@ namespace test {
* @param index number of the distinct port / connection
* @return a `std::pair<ModelPort,DataSink>`
* @warning as of 5/2023, there are two preconfigured "slots",
* and they are not usable in any way other then refering to their identity
* and they are not usable in any way other then referring to their identity
*/
play::test::DummyOutputLink
getDummyConnection(uint index)
@ -326,7 +363,28 @@ namespace test {
*/
bool verify(Job const& job, ModelPort const& port, play::DataSink const& sink)
{
UNIMPLEMENTED ("verify the job was plausibly created from this dispatcher");
if (not dummySetup_.isSupported (port, sink)) return false;
TimeValue nominalTime{job.parameter.nominalTime};
size_t portIDX = resolveModelPort (port);
JobTicket& ticket = accessJobTicket (portIDX, nominalTime);
return isnil (ticket)? DummyJob::isNopJob (job)
: MockJobTicket::isAssociated (job, ticket);
}
private:
PortIdxMap
buildPortIndex()
{
PortIdxMap newIndex;
uint i{0};
for (auto it=dummySetup_.getAllModelPorts()
; bool{it}
; ++it, ++i
)
newIndex[*it] = i;
return newIndex;
}
};

View file

@ -326,7 +326,7 @@ namespace test {
.genNode())
.genNode()};
CHECK (1 == mockSegs.size());
JobTicket const& ticket = mockSegs[Time::ZERO].jobTicket(0); // Model-PortNr.0
JobTicket& ticket = mockSegs[Time::ZERO].jobTicket(0); // Model-PortNr.0
auto prereq = ticket.getPrerequisites();
CHECK (not isnil (prereq));
@ -364,7 +364,7 @@ namespace test {
auto start = singleValIterator (mockSegs[Time::ZERO].jobTicket(0));
auto it = lib::explore(start)
.expand ([](JobTicket const& ticket)
.expand ([](JobTicket& ticket)
{
return ticket.getPrerequisites();
})
@ -394,6 +394,7 @@ namespace test {
verify_MockDispatcherSetup()
{
FrameCoord frame;
frame.absoluteNominalTime = Time{0,30};
{
MockDispatcher dispatcher;
// automatically generates some fake connection points...

View file

@ -115,7 +115,7 @@ namespace test {
return job.parameter.invoKey.part.a;
};
JobTicket const& ticket = seg.jobTicket(0);
JobTicket& ticket = seg.jobTicket(0);
CHECK (13 == getMarker (ticket));
auto prereq = ticket.getPrerequisites();
CHECK (not isnil(prereq));

View file

@ -136,6 +136,24 @@ namespace test {
return mockBuilder_.getModelPort (index);
}
/** search through all port <-> sink connections
* supported by this DummyPlayConnection
* @return `true` if found both a math on port an sink.
*/
bool
isSupported (ModelPort port, DataSink sink)
{
uint i{0};
for (auto it=getAllModelPorts(); bool{it}; ++it, ++i)
if (port == *it)
{
auto [refPort, refSink] = getModelPort(i);
if (refSink == sink)
return true;
}
return false;
}
POutputManager
provide_testOutputSlot()
{

View file

@ -40,11 +40,13 @@
#include "vault/engine/dummy-job.hpp"
#include "vault/engine/nop-job-functor.hpp"
#include "lib/test/test-helper.hpp"
#include "lib/time/timevalue.hpp"
#include "vault/real-clock.hpp"
#include "lib/null-value.hpp"
#include "lib/hash-value.h"
#include "lib/depend.hpp"
#include "lib/util.hpp"
#include <cstdlib>
@ -180,6 +182,9 @@ namespace engine {
/** actual instance of the test dummy job functor */
DummyClosure dummyClosure;
/** access to the fallback-implementation for empty segments */
lib::Depend<vault::engine::NopJobFunctor> nopFunctor;
}// (End)Implementation details
@ -255,6 +260,22 @@ namespace engine {
{
return dummyClosure;
}
/** @internal likewise to support the MockDispatcher diagnostics;
* locate here since this is a dedicated translation unit
* @return `true` iff the job was defined in the typical way used by
* JobTicket to generate fill jobs for empty segments.
* @see JobTicket::JobTicket::createJobFor(FrameCoord)
*/
bool
DummyJob::isNopJob (Job const& job)
{
InvocationInstanceID empty; ///////////////////////////////////////////////////////////////////////TICKET #1287 : temporary workaround until we get rid of the C base structs
JobClosure& jobFunctor = static_cast<JobClosure&> (*job.jobClosure); //////////////////////////TICKET #1287 : fix actual interface down to JobFunctor (after removing C structs)
return lumiera_invokey_eq (&util::unConst(job).parameter.invoKey, &empty)
and util::isSameObject (jobFunctor, nopFunctor());
}
}} // namespace vault::engine

View file

@ -68,6 +68,7 @@ namespace engine {
static int invocationAdditionalKey (Job const& job);
static JobClosure& getFunctor();
static bool isNopJob (Job const&);
};
}} // namespace vault::engine

View file

@ -70119,7 +70119,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1681742255171" ID="ID_1531898349" MODIFIED="1681744077783" TEXT="Draft im Test-Setup">
<icon BUILTIN="pencil"/>
<node COLOR="#435e98" CREATED="1681742836996" FOLDED="true" ID="ID_1978512771" MODIFIED="1686581185598" TEXT="scaffolding and mocking used for this test">
<node COLOR="#435e98" CREATED="1681742836996" FOLDED="true" ID="ID_1978512771" MODIFIED="1686608177837" TEXT="scaffolding and mocking used for this test">
<icon BUILTIN="full-1"/>
<node CREATED="1681742863121" ID="ID_101929835" MODIFIED="1684878277170" TEXT="ben&#xf6;tigte Mocks">
<icon BUILTIN="info"/>
@ -70343,7 +70343,20 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1686498710958" ID="ID_200132237" MODIFIED="1686498774995" TEXT="nicht klar ob das f&#xfc;r die Mock-L&#xf6;sung &#xfc;berhaupt gebraucht wird">
<icon BUILTIN="help"/>
</node>
<node COLOR="#435e98" CREATED="1686498723556" ID="ID_1464720710" MODIFIED="1686498781151" TEXT="derzeit erzeugt die Mock-L&#xf6;sung nur ein NodeGraphAttachment f&#xfc;r ModelPort-Index &#x2254; 0">
<node COLOR="#435e98" CREATED="1686498723556" ID="ID_1464720710" MODIFIED="1686608229845">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
derzeit erzeugt die Mock-L&#246;sung nur ein NodeGraphAttachment f&#252;r ModelPort-Index &#8788; 0
</p>
<p>
und der MockDispatcher doppelt die definierte Exit-Node struktur identisch auf
</p>
</body>
</html></richcontent>
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1686525035254" ID="ID_1328903780" MODIFIED="1686525426254" TEXT="man k&#xf6;nnte ein zus&#xe4;tzliches Attribut &quot;modelPort&quot; in die Spec einf&#xfc;hren">
@ -72415,9 +72428,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686587531758" ID="ID_273720576" MODIFIED="1686587538486" TEXT="darauf MockDispatcher aufbauen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686587545439" ID="ID_128090199" MODIFIED="1686587586943">
<node COLOR="#338800" CREATED="1686587531758" ID="ID_273720576" MODIFIED="1686619780748" TEXT="darauf MockDispatcher aufbauen">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1686587545439" ID="ID_128090199" MODIFIED="1686617271302">
<richcontent TYPE="NODE"><html>
<head>
@ -72428,12 +72441,12 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686587918277" ID="ID_1788066497" MODIFIED="1686587964425" TEXT="Segmentation pro ModelPort-ID bereitstellen">
<linktarget COLOR="#b72165" DESTINATION="ID_1788066497" ENDARROW="Default" ENDINCLINATION="313;20;" ID="Arrow_ID_1763115482" SOURCE="ID_216367008" STARTARROW="None" STARTINCLINATION="-99;-383;"/>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1686587918277" ID="ID_1788066497" MODIFIED="1686617252613" TEXT="Segmentation pro ModelPort-ID bereitstellen">
<linktarget COLOR="#21a5b7" DESTINATION="ID_1788066497" ENDARROW="Default" ENDINCLINATION="320;19;" ID="Arrow_ID_1763115482" SOURCE="ID_216367008" STARTARROW="None" STARTINCLINATION="-99;-383;"/>
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686587983258" ID="ID_543272945" MODIFIED="1686588002624">
<node COLOR="#338800" CREATED="1686587983258" ID="ID_543272945" MODIFIED="1686617315622">
<richcontent TYPE="NODE"><html>
<head>
@ -72444,14 +72457,25 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...eine billige und manipulative Implementierung in MockSegmentation
</p>
</body>
</html></richcontent>
<icon BUILTIN="yes"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686588011630" ID="ID_1683399826" MODIFIED="1686588031436" TEXT="Segmentation per Spec, mit 1-Segment-f&#xfc;r-Alles-Fallback">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1686588011630" ID="ID_1683399826" MODIFIED="1686619779150" TEXT="Segmentation per Spec, mit 1-Segment-f&#xfc;r-Alles-Fallback">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1682385376739" FOLDED="true" ID="ID_576604811" MODIFIED="1684889615769" TEXT="Mock-Implementierung">
<node COLOR="#338800" CREATED="1682385376739" FOLDED="true" ID="ID_576604811" MODIFIED="1686620311317" TEXT="Mock-Implementierung">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1682385392969" ID="ID_1317765253" MODIFIED="1684877385035" TEXT="Storage">
<node CREATED="1682385491724" ID="ID_1049416610" MODIFIED="1684877190112" TEXT="JobTickets in eine Deque allozieren">
@ -73556,10 +73580,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685066463050" ID="ID_1613334312" MODIFIED="1685802330806" TEXT="Mock-Setup schaffen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685066492396" ID="ID_1906962794" MODIFIED="1685066501049" TEXT="API f&#xfc;r Zugriff kl&#xe4;ren">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1685066463050" ID="ID_1613334312" MODIFIED="1686620328038" TEXT="Mock-Setup schaffen">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1685066492396" ID="ID_1906962794" MODIFIED="1686619854315" TEXT="API f&#xfc;r Zugriff kl&#xe4;ren">
<icon BUILTIN="button_ok"/>
<node CREATED="1685676202669" ID="ID_1528500239" MODIFIED="1685676214053" TEXT="analog zu MockSegmentation">
<icon BUILTIN="yes"/>
</node>
@ -73578,8 +73602,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685066474347" ID="ID_122826612" MODIFIED="1685066485373" TEXT="Grid in den Mock-Dispatcher legen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1685662239880" ID="ID_1505090088" MODIFIED="1685662250525" TEXT="brauche ModelPort und Sink-Instanzen">
<icon BUILTIN="flag-pink"/>
<node COLOR="#338800" CREATED="1685662239880" ID="ID_1505090088" MODIFIED="1686620339199" TEXT="brauche ModelPort und Sink-Instanzen">
<icon BUILTIN="button_ok"/>
<node CREATED="1685662251607" ID="ID_1360980940" MODIFIED="1685662442877" TEXT="t&#xfc;ckisches Problem....">
<richcontent TYPE="NOTE"><html>
<head>
@ -74536,7 +74560,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node COLOR="#338800" CREATED="1685988152809" ID="ID_255556137" MODIFIED="1686604197744" TEXT="API erweitern : portNum">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1685990098487" ID="ID_829030768" MODIFIED="1685990110152" TEXT="grunds&#xe4;tzlich: YAGNI">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1685990098487" ID="ID_829030768" MODIFIED="1686619889283" TEXT="grunds&#xe4;tzlich: YAGNI">
<linktarget COLOR="#67a7cd" DESTINATION="ID_829030768" ENDARROW="Default" ENDINCLINATION="22;176;" ID="Arrow_ID_1621721947" SOURCE="ID_1835927835" STARTARROW="None" STARTINCLINATION="-485;0;"/>
<icon BUILTIN="yes"/>
<node CREATED="1685990112190" ID="ID_463883334" MODIFIED="1685990125693" TEXT="blo&#xdf; nicht verr&#xfc;ckt machen mit dem konkreten Model"/>
@ -74547,6 +74571,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node COLOR="#338800" CREATED="1686000316132" FOLDED="true" ID="ID_826544806" LINK="#ID_1237481687" MODIFIED="1686498909689" TEXT="Kopplung per &#xbb;NodeGraphAttachment&#xab;">
<linktarget COLOR="#656486" DESTINATION="ID_826544806" ENDARROW="Default" ENDINCLINATION="469;-18;" ID="Arrow_ID_1372033454" SOURCE="ID_551644524" STARTARROW="None" STARTINCLINATION="487;30;"/>
<linktarget COLOR="#39ac70" DESTINATION="ID_826544806" ENDARROW="Default" ENDINCLINATION="-1208;77;" ID="Arrow_ID_1329123820" SOURCE="ID_862442414" STARTARROW="None" STARTINCLINATION="-609;-29;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1686008339600" HGAP="28" ID="ID_181839329" MODIFIED="1686092787399" TEXT="Dummy-Implementierung anlegen" VSHIFT="13">
<icon BUILTIN="button_ok"/>
@ -74977,16 +75002,16 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#435e98" CREATED="1686014291202" ID="ID_252150549" MODIFIED="1686604201029" TEXT="Problem: wie kommt man an die portNum?">
<arrowlink COLOR="#fe3f50" DESTINATION="ID_1087682281" ENDARROW="Default" ENDINCLINATION="326;21;" ID="Arrow_ID_676319361" STARTARROW="None" STARTINCLINATION="309;-20;"/>
<icon BUILTIN="help"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686017516585" ID="ID_1223330547" MODIFIED="1686017537173" TEXT="brauche &#xdc;bersetzung per Map">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686590082295" ID="ID_1948089026" MODIFIED="1686590095640" TEXT="Dispatcher::resolveModelPort(ModelPort) implementieren">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#435e98" CREATED="1686017516585" ID="ID_1223330547" MODIFIED="1686617191140" TEXT="brauche &#xdc;bersetzung per Map">
<icon BUILTIN="yes"/>
<node COLOR="#338800" CREATED="1686590082295" ID="ID_1948089026" MODIFIED="1686617179681" TEXT="Dispatcher::resolveModelPort(ModelPort) implementieren">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#5b280f" CREATED="1686017538602" ID="ID_1818653429" MODIFIED="1686604215990" TEXT="pr&#xfc;fen: in der Segmentation implementieren">
<icon BUILTIN="button_cancel"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686604218914" ID="ID_1822598563" MODIFIED="1686604413003" TEXT="besser direkt im Dispatcher implementieren">
<node COLOR="#338800" CREATED="1686604218914" ID="ID_1822598563" MODIFIED="1686617174630" TEXT="besser direkt im Dispatcher implementieren">
<richcontent TYPE="NOTE"><html>
<head>
@ -74997,7 +75022,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686587381975" ID="ID_1778082418" MODIFIED="1686587406618" TEXT="mu&#xdf; aber per Dispatcher oder RenderEnvironmentClosure vermittelt werden">
<icon BUILTIN="yes"/>
@ -75006,11 +75031,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1686587706724" ID="ID_1590315006" MODIFIED="1686587714337" TEXT="kennt die konkreten Timings"/>
<node CREATED="1686587714829" ID="ID_1834326796" MODIFIED="1686587726016" TEXT="kennt sinnvollerweise den ModelPort"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686587745207" ID="ID_125177626" MODIFIED="1686587773785" TEXT="ben&#xf6;tigt wird die &#xdc;bersetzung im Dispatcher / PipeineBuilder">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686587899493" ID="ID_216367008" MODIFIED="1686587964425" TEXT="MockDispatcher mu&#xdf; zudem Segmentation vorbereiten">
<arrowlink COLOR="#b72165" DESTINATION="ID_1788066497" ENDARROW="Default" ENDINCLINATION="313;20;" ID="Arrow_ID_1763115482" STARTARROW="None" STARTINCLINATION="-99;-383;"/>
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1686587745207" ID="ID_125177626" MODIFIED="1686617224688" TEXT="ben&#xf6;tigt wird die &#xdc;bersetzung im Dispatcher / PipeineBuilder">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1686587899493" ID="ID_216367008" MODIFIED="1686617257686" TEXT="MockDispatcher mu&#xdf; zudem Segmentation vorbereiten">
<arrowlink COLOR="#21a5b7" DESTINATION="ID_1788066497" ENDARROW="Default" ENDINCLINATION="320;19;" ID="Arrow_ID_1763115482" STARTARROW="None" STARTINCLINATION="-99;-383;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1686590017562" ID="ID_1378616081" MODIFIED="1686590067746">
<richcontent TYPE="NODE"><html>
@ -75032,6 +75057,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1686620377983" ID="ID_1217570779" MODIFIED="1686620392713" TEXT="JobTicket ist nun effektiv immutable nach Konstruktion">
<icon BUILTIN="yes"/>
</node>
</node>
<node COLOR="#338800" CREATED="1686182242381" ID="ID_31746915" MODIFIED="1686587864527" TEXT="Unit-Tests">
<arrowlink COLOR="#5aec6d" DESTINATION="ID_515771" ENDARROW="Default" ENDINCLINATION="1;286;" ID="Arrow_ID_1994759368" STARTARROW="None" STARTINCLINATION="880;-201;"/>
@ -75394,9 +75422,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1512925253328" ID="ID_922277724" MODIFIED="1684869771123" TEXT="JobTicket">
<node CREATED="1512925253328" ID="ID_922277724" MODIFIED="1686620124221" TEXT="JobTicket">
<linktarget COLOR="#82597c" DESTINATION="ID_922277724" ENDARROW="Default" ENDINCLINATION="43;-81;" ID="Arrow_ID_941233317" SOURCE="ID_946385163" STARTARROW="None" STARTINCLINATION="-124;34;"/>
<icon BUILTIN="stop"/>
<icon BUILTIN="prepare"/>
<node CREATED="1681166276225" ID="ID_877524227" MODIFIED="1681166317636" TEXT="ein Execution-Plan g&#xfc;litg f&#xfc;r ein Segment + ModelPort"/>
<node CREATED="1681167533752" ID="ID_1794156121" MODIFIED="1681167538096" TEXT="Anforderungen">
<node COLOR="#5b280f" CREATED="1681167546919" ID="ID_1656777068" MODIFIED="1683836193612" TEXT="startExploration()">
@ -75477,8 +75505,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1682626547198" ID="ID_1401129193" MODIFIED="1682626582171" TEXT=" macht ein const JobTicket Sinn?">
<node COLOR="#435e98" CREATED="1682626547198" ID="ID_1401129193" MODIFIED="1686620211668" TEXT=" macht ein const JobTicket Sinn?">
<icon BUILTIN="help"/>
<icon BUILTIN="button_cancel"/>
<node CREATED="1682626583859" ID="ID_959446855" MODIFIED="1682626669241" TEXT="zun&#xe4;chst nur aus Gr&#xfc;nden der Interface-Logik eingef&#xfc;hrt">
<richcontent TYPE="NOTE"><html>
<head>
@ -75492,8 +75521,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
</node>
<node CREATED="1682626596442" ID="ID_627099643" MODIFIED="1685982230662" TEXT="w&#xfc;rde darauf hinauslaufen, da&#xdf; JobTicket selber bei der Job-Planung nicht ver&#xe4;ndert wird"/>
<node CREATED="1682626675632" ID="ID_1360253646" MODIFIED="1682626692994" TEXT="Alternative: komplett eine Builder-Notation f&#xfc;r die Segmentation">
<icon BUILTIN="idea"/>
<node COLOR="#435e98" CREATED="1686620184180" ID="ID_4906179" MODIFIED="1686620204117" TEXT="JobTicket ist effektiv immutable nach Konstruktion">
<icon BUILTIN="forward"/>
</node>
<node COLOR="#338800" CREATED="1686620213993" ID="ID_1624402855" MODIFIED="1686620234923" TEXT="insofern k&#xf6;nnen alle JobTicket const&amp; in einfache Referenzen verwandelt werden">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1682622228183" ID="ID_1660287725" MODIFIED="1682622235360" TEXT="Redundanz in der Storage?">
@ -75569,6 +75601,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1684877477701" ID="ID_1567452222" MODIFIED="1684877486921" TEXT="ein Hash-Seed"/>
<node CREATED="1681864799687" ID="ID_750179276" MODIFIED="1681864834215" TEXT="Aufz&#xe4;hlung Prerequisites"/>
</node>
<node COLOR="#338800" CREATED="1686620035670" ID="ID_862442414" MODIFIED="1686620118378" TEXT="Umstellung: ExitNode als Spezifikation verwenden">
<arrowlink COLOR="#39ac70" DESTINATION="ID_826544806" ENDARROW="Default" ENDINCLINATION="-1208;77;" ID="Arrow_ID_1329123820" STARTARROW="None" STARTINCLINATION="-609;-29;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#5b280f" CREATED="1681167767260" FOLDED="true" ID="ID_247185233" MODIFIED="1685982428864" TEXT="JobTicket::ExplorationState">
<icon BUILTIN="button_cancel"/>