Segmentation: devise algorithm for splitSplice operation

This commit is contained in:
Fischlurch 2023-05-02 21:24:26 +02:00
parent b582c35c9f
commit bf978fcda1
5 changed files with 328 additions and 93 deletions

View file

@ -83,7 +83,7 @@ namespace fixture {
// default copy acceptable
Time start() const { return span_.start(); }
Time end() const { return span_.end(); }
Time after() const { return span_.end(); }
engine::JobTicket const&
jobTicket() const

View file

@ -29,7 +29,9 @@
#include "lib/error.hpp"
#include "steam/fixture/segmentation.hpp"
//#include "steam/mobject/builder/fixture-change-detector.hpp" ///////////TODO
#include "lib/time/timevalue.hpp"
#include <tuple>
namespace steam {
@ -48,20 +50,79 @@ namespace fixture {
Segmentation::~Segmentation() { } // emit VTable here...
/** access the globally valid registry instance.
* @throw error::State if this global registry is
* already closed or not yet initialised. */
//ModelPortRegistry&
//ModelPortRegistry::globalInstance()
//{
// LockRegistry global_lock;
// if (theGlobalRegistry.isValid())
// return theGlobalRegistry();
//
// throw error::State ("global model port registry is not accessible"
// , LERR_(BUILDER_LIFECYCLE));
//}
namespace {// Implementation of Split-Splice algorithm
using lib::time::Time;
using OptTime = std::optional<Time>;
using Iter = typename list<Segment>::iterator;
/**
* Descriptor and working context to split/splice in a new Interval.
* The »Split-Splice« algorithm works on a seamless segmentation of
* an ordered working axis, represented as sequence of intervals.
* The purpose is to integrate a new Segment / interval, thereby
* truncating / splitting / filling adjacent intervals to fit
*/
class SplitSpliceAlgo
: util::NonCopyable
{
enum Verb { NIL
, DROP
, TRUNC
, INS_NOP
, SEAMLESS
};
Verb opPred = NIL,
opSucc = NIL;
Iter pred{};
Iter succ{};
Time start = Time::NEVER,
after = Time::NEVER;
/* ======= elementary operations ======= */
Time getStart (Iter elm) { return elm->start(); }
Time getAfter (Iter elm) { return elm->after(); }
Iter
createElm (Time start, Time after)
{
UNIMPLEMENTED ("create new Segment");
}
Iter
cloneElm (Iter elm, Time start, Time after)
{
UNIMPLEMENTED ("clone Segment and modify time");
}
public:
void
establishSplitPoint (Iter startAll, Iter afterAll
,OptTime start, OptTime after)
{
UNIMPLEMENTED ("Stage-1 and Stage-2");
}
void
determineRelations()
{
UNIMPLEMENTED ("Stage-3");
}
std::pair<Iter, Iter>
performSplitSplice()
{
UNIMPLEMENTED ("Stage-4 - doIT");
}
};
}//(End)SlitSplice impl
/**
@ -87,7 +148,10 @@ namespace fixture {
Segment const&
Segmentation::splitSplice (OptTime start, OptTime after, const engine::JobTicket* jobTicket)
{
UNIMPLEMENTED ("determine predecessor, successor and orientation and perform del/trunc/split/swap/insert");
SplitSpliceAlgo splicr;
splicr.establishSplitPoint (segments_.begin(),segments_.end(), start,after);
splicr.determineRelations();
splicr.performSplitSplice();
}

View file

@ -107,7 +107,7 @@ namespace fixture {
operator[] (TimeValue time) const
{
for (auto& seg : segments_)
if (seg.end() > time)
if (seg.after() > time)
return seg;
throw error::State (_Fmt{"Fixture datastructure corrupted: Time %s not covered"} % time);
}

View file

@ -7141,7 +7141,7 @@ The Fixture is mostly comprised of the Segementation datastructure, but some oth
Largely the storage of the render nodes network is hooked up behind the Fixture &amp;rarr; [[storage considerations|FixtureStorage]]
</pre>
</div>
<div title="SegmentationChange" creator="Ichthyostega" modifier="Ichthyostega" created="202305020227" modified="202305020228" tags="spec operational Builder draft" changecount="3">
<div title="SegmentationChange" creator="Ichthyostega" modifier="Ichthyostega" created="202305020227" modified="202305021819" tags="spec operational Builder draft" changecount="28">
<pre>At the end of the build process, the existing [[Segmentation]] possibly needs to be changed, extended or adapted.
This change must be performed as a //transactional switch,// since render or playback processes might be performed concurrently. All Fixture and low-level-Model datastructures are //immutable// -- thus for any changes, suitably adapted structures will be built as a replacement.
@ -7150,72 +7150,76 @@ This is an implementation level operation, which analyses the existing Segmentat
!!!Structure of the split-splice operation
{{red{1.5.2023 : Analysis and implementation draft}}}
{{{
Algorithmus
Invariante
vollständige lückenlose Abdeckung der gesamten Zeitachse
alle Einträge sind aufsteigend sortiert
Vorgänger und Nachfolger finden
Predecessor
sep ≔ start oder after (wenn start fehlt)
Pstart &gt;= sep ⟹ ↯ Predecessor
suche größten mit Pstart &lt; sep
Succsessor ist erster, der diese Bedingung verletzt
andernfalls: Successor == Predecessor (split)
Start- und Endpunkt festsetzen
definerter start/after-Punkt ist stets verbindlich
fehlernder start
sep ≡ after
Pend &lt; sep ⟹ start ≔ Pend
sonst ⟹ start ≔ Pstart (replace or trunc)
fehlender after
sep ≡ start ∧ Sstart &gt;= sep
Sstart &gt; sep ⟹ after ≔ Sstart
sonst ⟹ after ≔ Send (replace or trunc)
POST
start &lt; after
sonst ⟹ REJECT
Pstart &lt;= start
Pstart == Sstart start &lt;= Sstart
Relation zum Vor/Nachfolger bestimmen
Pstart &lt; start
Pend &lt; start ⟹ ins NOP-Predecessor
Pend == start ⟹ seamless
Pend &lt;= after ⟹ truc(Predecessor)
Pend &gt; after ⟹ split(Predecessor)
Pstart == start
Pend &lt;= after ⟹ del(Predecessor)
Pend &gt; after ⟹ swap_trunc(Predecessor)
Predecessor == Successor
Pend == after == Time::NEVER ⟹ trunc(Predecessor)
Pend &gt; after ⟹ split(Predecessor)
Sstart &lt; after
Send &lt; after ⟹ del(Successor) and ++Successor and recurse (same base case)
Send == after ⟹ del(Successor)
Send &gt; after ⟹ trunc(Successor)
Sstart == after ⟹ seamless
after &lt; Sstart ⟹ ins NOP-Successor
einfügen und löschen
Predecessor
trunc ⟹ del
split ⟹ del
del ⟹ del
swap_trunc ⟹ del
Successor
de++ ⟹ del
trunc ⟹ del
insert
before
ins NOP-Predecessor
trunc(Predecessor) ⟹ ins copy Predecessor-shortened-end
split(Predecessor) ⟹ ins copy Predecessor shortened-end
new Segment
after
split(Predecessor) ⟹ ins copy Predecessor shortened-start
swap_trunc(Predecessor) ⟹ ins copy Predecessor shortened-start
trunc(Successor) ⟹ ins copy Successor shortened-start
ins NOP-Successor
}}}</pre>
;Invariant
:complete and valid [[Segmentation]] always retained
:* seamless coverage the complete time axis [-∞ .. +∞]
:* all entries ordered ascending (in time)
;Stage-1
:determine Predecessor and Successor
:* //Predecessor//&lt;br&gt; {{{sep}}} ≔ {{{start}}} or {{{after}}} (if missing {{{start}}})&lt;br&gt; P~~start~~ &gt;= {{{sep}}} ⟹ ↯ Predecessor
:** &amp;rarr; find largest Predecessor with P~~start~~ &lt; {{{sep}}}
:* //Successor// is the first one to violate this condition
:* //otherwise// Successor == Predecessor (split)
;Stage-2
:establish {{{start}}} and end point of new segment
:* explicitly given {{{start}}}/{{{after}}}-points are binding
:** missing {{{start}}}&lt;br&gt; {{{sep}}} ≡ {{{after}}}
:*** P~~after~~ &lt; {{{sep}}} ⟹ {{{start}}} ≔ P~~after~~
:*** //else// ⟹ {{{start}}} ≔ P~~start~~ (replace or trunc)
:** missing {{{after}}}&lt;br&gt; {{{sep}}} ≡ {{{start}}} ∧ S~~start~~ &gt;= {{{sep}}}
:*** S~~start~~ &gt; {{{sep}}} ⟹ {{{after}}} ≔ S~~start~~
:*** //else// ⟹ {{{after}}} ≔ S~~after~~ (replace or trunc)
:''POST''
:* {{{start}}} &lt; {{{after}}}
:** //else// ⟹ REJECT
:* P~~start~~ &lt;= {{{start}}}
:* P~~start~~ == S~~start~~ {{{start}}} &lt;= S~~start~~
;Stage-3
:determine relation to //Predecessor// and //Successor//
:* //case// P~~start~~ &lt; {{{start}}}
:** P~~after~~ &lt; {{{start}}} ⟹ ins ~NOP-Predecessor
:** P~~after~~ == {{{start}}} ⟹ seamless
:** P~~after~~ &lt;= {{{after}}} ⟹ truc(Predecessor)
:** P~~after~~ &gt; {{{after}}} ⟹ split(Predecessor)
:* //case// P~~start~~ == {{{start}}}
:** P~~after~~ &lt;= {{{after}}} ⟹ drop(Predecessor)
:** P~~after~~ &gt; {{{after}}} ⟹ swap_trunc(Predecessor)
:* //case// Predecessor == Successor&lt;br&gt; //this case has already been completely covered by the preceding cases//
:** P~~after~~ == {{{after}}} == Time::NEVER ⟹ trunc(Predecessor)
:** P~~after~~ &gt; {{{after}}} ⟹ split(Predecessor)
:* //case// S~~start~~ &lt; {{{after}}}
:** S~~after~~ &lt; {{{after}}} ⟹ drop(Successor) and ++Successor and recurse (same base case)
:** S~~after~~ == {{{after}}} ⟹ drop(Successor)
:** S~~after~~ &gt; {{{after}}} ⟹ trunc(Successor)
:** S~~start~~ == {{{after}}} ⟹ seamless
:** {{{after}}} &lt; S~~start~~ ⟹ ins ~NOP-Successor
;Stage-4
:perform element insertion and replacement
:* for the //Predecessor//
:** trunc ⟹ del
:** split ⟹ del
:** drop ⟹ del
:** swap_trunc ⟹ del
:** ins_nop | seamless ⟹ retain
:* for the //Successor//
:** drop++ ⟹ del
:** trunc ⟹ del
:** ins_nop | seamless ⟹ retain
:* for //insertion of new elements//
:** &amp;rarr;''before''&lt;br&gt; //cases//
:*** ins ~NOP-Predecessor
:*** trunc(Predecessor) ⟹ ins copy Predecessor-shortened-end
:*** split(Predecessor) ⟹ ins copy Predecessor shortened-end
:** &amp;rarr;''new Segment''
:** &amp;rarr;''after''&lt;br&gt; //cases//
:*** split(Predecessor) ⟹ ins copy Predecessor shortened-{{{start}}}
:*** swap_trunc(Predecessor) ⟹ ins copy Predecessor shortened-{{{start}}}
:*** trunc(Successor) ⟹ ins copy Successor shortened-{{{start}}}
:*** ins ~NOP-Successor
!!!Implementation techique
The split-splice operation is performed always for a single segment in the context of an existing segmentation; the covered range can be defined explicitly, or by partial spec. For each application of this algorithm, an instance of a //working context// is created (on stack) and initialised by scanning the existing segmentation to establish the insert point. The four stages are then performed on this working data, thereby determining the handling cases -- and in the last stage, new elements are inserted and existing elements are deleted (assuming immutable segment data, any changes and adaptations are done by inserting a modified clone copy).
</pre>
</div>
<div title="Sequence" modifier="Ichthyostega" created="201001252327" modified="201505310118" tags="def" changecount="2">
<pre>A sequence is a collection of media objects, arranged onto a fork (&quot;track tree&quot;). Sequences are the building blocks within the session. To be visible and editable, a session needs to be bound into a top-level [[Timeline]]. Alternatively, it may be used as a VirtualClip nested within another sequence.

View file

@ -70088,24 +70088,28 @@
<node CREATED="1682989072565" ID="ID_574776010" MODIFIED="1682989310210" TEXT="Pstart &lt; start">
<node CREATED="1682989100107" ID="ID_1303238476" MODIFIED="1682989331640" TEXT="Pend &lt; start &#x27f9; ins NOP-Predecessor"/>
<node CREATED="1682989363818" ID="ID_626589766" MODIFIED="1682989412757" TEXT="Pend == start &#x27f9; seamless"/>
<node CREATED="1682989432318" ID="ID_1285136346" MODIFIED="1682989453085" TEXT="Pend &lt;= after &#x27f9; truc(Predecessor)"/>
<node CREATED="1682989432318" ID="ID_1285136346" MODIFIED="1682989453085" TEXT="Pend &lt;= after &#x27f9; truc(Predecessor)">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1285136346" ENDARROW="Default" ENDINCLINATION="218;0;" ID="Arrow_ID_1363539474" SOURCE="ID_7906079" STARTARROW="Default" STARTINCLINATION="189;0;"/>
</node>
<node CREATED="1682989463146" ID="ID_1057868667" MODIFIED="1682990037890" TEXT="Pend &gt; after &#x27f9; split(Predecessor)">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1057868667" ENDARROW="Default" ENDINCLINATION="192;0;" ID="Arrow_ID_638145525" SOURCE="ID_242314941" STARTARROW="Default" STARTINCLINATION="321;12;"/>
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1057868667" ENDARROW="Default" ENDINCLINATION="192;0;" ID="Arrow_ID_638145525" SOURCE="ID_242314941" STARTARROW="Default" STARTINCLINATION="347;11;"/>
</node>
</node>
<node CREATED="1682989518809" ID="ID_994366359" MODIFIED="1682989523086" TEXT="Pstart == start">
<node CREATED="1682989432318" ID="ID_1069008527" MODIFIED="1682989559145" TEXT="Pend &lt;= after &#x27f9; del(Predecessor)"/>
<node CREATED="1682989432318" ID="ID_1069008527" MODIFIED="1683045577966" TEXT="Pend &lt;= after &#x27f9; drop(Predecessor)"/>
<node CREATED="1682989463146" ID="ID_514650224" MODIFIED="1682989628688" TEXT="Pend &gt; after &#x27f9; swap_trunc(Predecessor)"/>
</node>
<node CREATED="1682989799344" ID="ID_1899821024" MODIFIED="1682989806256" TEXT="Predecessor == Successor">
<node CREATED="1682989855439" ID="ID_7906079" MODIFIED="1682989886621" TEXT="Pend == after == Time::NEVER &#x27f9; trunc(Predecessor)"/>
<node CREATED="1682989855439" ID="ID_7906079" MODIFIED="1682989886621" TEXT="Pend == after == Time::NEVER &#x27f9; trunc(Predecessor)">
<arrowlink DESTINATION="ID_1285136346" ENDARROW="Default" ENDINCLINATION="218;0;" ID="Arrow_ID_1363539474" STARTARROW="Default" STARTINCLINATION="189;0;"/>
</node>
<node CREATED="1682989964471" ID="ID_242314941" MODIFIED="1682990037890" TEXT="Pend &gt; after &#x27f9; split(Predecessor)">
<arrowlink DESTINATION="ID_1057868667" ENDARROW="Default" ENDINCLINATION="192;0;" ID="Arrow_ID_638145525" STARTARROW="Default" STARTINCLINATION="321;12;"/>
<arrowlink DESTINATION="ID_1057868667" ENDARROW="Default" ENDINCLINATION="192;0;" ID="Arrow_ID_638145525" STARTARROW="Default" STARTINCLINATION="347;11;"/>
</node>
</node>
<node CREATED="1682990361746" ID="ID_540769988" MODIFIED="1682990378568" TEXT="Sstart &lt; after">
<node CREATED="1682990416619" ID="ID_1218355846" MODIFIED="1682990512242" TEXT="Send &lt; after &#x27f9; del(Successor) and ++Successor and recurse (same base case)"/>
<node CREATED="1682990517405" ID="ID_1733924563" MODIFIED="1682990537807" TEXT="Send == after &#x27f9; del(Successor)"/>
<node CREATED="1682990416619" ID="ID_1218355846" MODIFIED="1683044729239" TEXT="Send &lt; after &#x27f9; drop(Successor) and ++Successor and recurse (same base case)"/>
<node CREATED="1682990517405" ID="ID_1733924563" MODIFIED="1683044735150" TEXT="Send == after &#x27f9; drop(Successor)"/>
<node CREATED="1682990575017" ID="ID_1792970357" MODIFIED="1682990587208" TEXT="Send &gt; after &#x27f9; trunc(Successor)"/>
</node>
<node CREATED="1682990756277" ID="ID_1049988377" MODIFIED="1682990797692" TEXT="Sstart == after &#x27f9; seamless"/>
@ -70116,12 +70120,14 @@
<node CREATED="1682991925184" ID="ID_80874811" MODIFIED="1682991934113" TEXT="Predecessor">
<node CREATED="1682991935183" ID="ID_100248576" MODIFIED="1682991953832" TEXT="trunc &#x27f9; del"/>
<node CREATED="1682991959963" ID="ID_1359030638" MODIFIED="1682991991739" TEXT="split &#x27f9; del"/>
<node CREATED="1682991992375" ID="ID_1138806541" MODIFIED="1682991996168" TEXT="del &#x27f9; del"/>
<node CREATED="1682991992375" ID="ID_1138806541" MODIFIED="1683046079451" TEXT="drop &#x27f9; del"/>
<node CREATED="1682991997084" ID="ID_1555435391" MODIFIED="1682992007785" TEXT="swap_trunc &#x27f9; del"/>
<node CREATED="1683046112074" ID="ID_1153918582" MODIFIED="1683046131523" TEXT="ins_nop | seamless &#x27f9; retain"/>
</node>
<node CREATED="1682992015840" ID="ID_1551079661" MODIFIED="1682992017823" TEXT="Successor">
<node CREATED="1682992042818" ID="ID_750532199" MODIFIED="1682992082750" TEXT="de++ &#x27f9; del"/>
<node CREATED="1682992042818" ID="ID_750532199" MODIFIED="1683046143586" TEXT="drop++ &#x27f9; del"/>
<node CREATED="1682992086602" ID="ID_79310561" MODIFIED="1682992091821" TEXT="trunc &#x27f9; del"/>
<node CREATED="1683046112074" ID="ID_288339130" MODIFIED="1683046131523" TEXT="ins_nop | seamless &#x27f9; retain"/>
</node>
<node CREATED="1682992101946" ID="ID_556573150" MODIFIED="1682992140097" TEXT="insert">
<node CREATED="1682992189962" ID="ID_981883843" MODIFIED="1682992192417" TEXT="before">
@ -70141,6 +70147,71 @@
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1682993086565" ID="ID_469257294" MODIFIED="1682993090645" TEXT="Implementierung">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683042576253" ID="ID_1878728765" MODIFIED="1683042587092" TEXT="Konzept">
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683042638127" ID="ID_1570983964" MODIFIED="1683042656744" TEXT="Deskriptor SpliceAct">
<icon BUILTIN="idea"/>
</node>
<node COLOR="#5b280f" CREATED="1683042697806" ID="ID_1462476322" MODIFIED="1683043770315" TEXT="Task-Record">
<icon BUILTIN="button_cancel"/>
<node CREATED="1683042708897" ID="ID_1994905381" MODIFIED="1683042712143" TEXT="Tupel-derived"/>
<node CREATED="1683042713068" ID="ID_467754420" MODIFIED="1683042718110" TEXT="Enum als verb"/>
<node CREATED="1683042729238" ID="ID_1766658701" MODIFIED="1683042732508" TEXT="Argumente">
<node CREATED="1683042751566" ID="ID_1881769035" MODIFIED="1683042777102" TEXT="target : Iter"/>
<node CREATED="1683043762383" ID="ID_451784452" MODIFIED="1683043763464" TEXT="Time"/>
<node CREATED="1683043781546" ID="ID_924440661" MODIFIED="1683043804163" TEXT="gar nicht notwendig &#x2014; per Kontext klar">
<icon BUILTIN="stop-sign"/>
</node>
</node>
</node>
<node CREATED="1683043806248" ID="ID_358437836" MODIFIED="1683043811748" TEXT="Enum als verb">
<node CREATED="1683043814387" ID="ID_312010971" MODIFIED="1683043834772" TEXT="jeweils separat f&#xfc;r pred und succ"/>
<node CREATED="1683043835634" ID="ID_1729162283" MODIFIED="1683043837062" TEXT="F&#xe4;lle">
<node CREATED="1683043887635" ID="ID_1329437740" MODIFIED="1683043891434" TEXT="SEAMLESS"/>
<node CREATED="1683043880347" ID="ID_836682678" MODIFIED="1683043882928" TEXT="INS_NOP"/>
<node CREATED="1683043904265" ID="ID_251771628" MODIFIED="1683043905981" TEXT="TRUNC"/>
<node CREATED="1683044668063" ID="ID_1598320614" MODIFIED="1683044671822" TEXT="DROP"/>
<node CREATED="1683044547460" ID="ID_1256792958" MODIFIED="1683044552526" TEXT="indirekt codiert....">
<node CREATED="1683044555202" ID="ID_1892772312" MODIFIED="1683044556606" TEXT="SPLIT">
<node CREATED="1683044601308" ID="ID_657233494" MODIFIED="1683044617686" TEXT="Predecessor auch als Successor markiert"/>
<node CREATED="1683044624433" ID="ID_1880803006" MODIFIED="1683044633275" TEXT="beide mit TRUNC - Verb"/>
</node>
<node CREATED="1683044559634" ID="ID_1736529823" MODIFIED="1683044562377" TEXT="SWAP_TRUNC">
<node CREATED="1683044638648" ID="ID_1428435516" MODIFIED="1683044680653" TEXT="Predecessor als DROP"/>
<node CREATED="1683044682001" ID="ID_531874522" MODIFIED="1683044696142" TEXT="Predecessor auch als Successor mit TRUNC markiert"/>
</node>
</node>
</node>
</node>
<node CREATED="1683045976036" ID="ID_1600965970" MODIFIED="1683045990086" TEXT="Predecessor und Successor per Iterator referenzieren"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683046583116" ID="ID_133574091" MODIFIED="1683046722114" TEXT="lokale Umsetzung">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1683046618535" ID="ID_545931815" MODIFIED="1683046633053" TEXT="den Deskriptor als lokale/anonyme Klasse"/>
<node CREATED="1683046633701" ID="ID_1909003590" MODIFIED="1683046644503" TEXT="die Schritte des Algo als Methoden"/>
<node CREATED="1683046648011" ID="ID_884620601" MODIFIED="1683046664621" TEXT="Arbeitsdaten als Member"/>
<node CREATED="1683046711054" ID="ID_815326523" MODIFIED="1683046719941" TEXT="Integration als statische Funktion"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683046722945" ID="ID_113209914" MODIFIED="1683046727395" TEXT="Generalisierung">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1683046728800" ID="ID_1510597200" MODIFIED="1683046736975" TEXT="pr&#xfc;fen ob machbar">
<icon BUILTIN="help"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683046739175" ID="ID_281973034" MODIFIED="1683046935676" TEXT="Operationen abstrahieren (&#x3bb;)">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1683046771373" ID="ID_668314224" MODIFIED="1683046786020" TEXT="getStart(elm)"/>
<node CREATED="1683046786608" ID="ID_106487591" MODIFIED="1683046790142" TEXT="getEnd(elm)"/>
<node CREATED="1683046813031" ID="ID_1700011975" MODIFIED="1683046820577" TEXT="clone(elm, start, after)"/>
<node CREATED="1683046837473" ID="ID_1325886464" MODIFIED="1683046842188" TEXT="build(start, after)"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683046873340" ID="ID_347563039" MODIFIED="1683046933949" TEXT="Template Parameter deduction einrichten">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683046958233" ID="ID_226373762" MODIFIED="1683047000567" TEXT="isoliert testbar machen">
<arrowlink COLOR="#e31dc4" DESTINATION="ID_1714211009" ENDARROW="Default" ENDINCLINATION="-141;9;" ID="Arrow_ID_816334190" STARTARROW="None" STARTINCLINATION="-192;20;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1682993091685" ID="ID_988617455" MODIFIED="1682993099148" TEXT="systematische Testabdeckung">
<icon BUILTIN="hourglass"/>
@ -70148,6 +70219,102 @@
<icon BUILTIN="info"/>
</node>
<node CREATED="1682993108314" ID="ID_317827435" MODIFIED="1682993122827" TEXT="hinzu kommt die Variante, da&#xdf; leere Intervalle zusammengef&#xfc;hrt werden"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683046966788" ID="ID_1714211009" MODIFIED="1683046994438" TEXT="splitSplice-Algo isoliert testen">
<linktarget COLOR="#e31dc4" DESTINATION="ID_1714211009" ENDARROW="Default" ENDINCLINATION="-141;9;" ID="Arrow_ID_816334190" SOURCE="ID_226373762" STARTARROW="None" STARTINCLINATION="-192;20;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047015402" ID="ID_1729864005" MODIFIED="1683047024304" TEXT="Segmentation-F&#xe4;lle">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047146727" ID="ID_1666065871" MODIFIED="1683047163542" TEXT="Seg in leer">
<icon BUILTIN="flag-yellow"/>
</node>
<node COLOR="#5b280f" CREATED="1683047212062" ID="ID_378627927" MODIFIED="1683047503858" TEXT="Seg in Seg">
<arrowlink COLOR="#eee6fe" DESTINATION="ID_1715234114" ENDARROW="Default" ENDINCLINATION="-40;-6;" ID="Arrow_ID_821049970" STARTARROW="None" STARTINCLINATION="24;45;"/>
<icon BUILTIN="button_cancel"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047231372" ID="ID_393126179" MODIFIED="1683047261696" TEXT="SegN &lt; Seg">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047290932" ID="ID_1714332119" MODIFIED="1683047352056" TEXT="links disjunkt">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047302426" ID="ID_255724966" MODIFIED="1683047352062" TEXT="links b&#xfc;ndig">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047312185" ID="ID_361978590" MODIFIED="1683047352063" TEXT="links &#xfc;berlapp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047321800" ID="ID_750704841" MODIFIED="1683047352063" TEXT="links in-b&#xfc;ndig">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047329359" ID="ID_1715234114" MODIFIED="1683047482325" TEXT="komplett in">
<linktarget COLOR="#eee6fe" DESTINATION="ID_1715234114" ENDARROW="Default" ENDINCLINATION="-40;-6;" ID="Arrow_ID_821049970" SOURCE="ID_378627927" STARTARROW="None" STARTINCLINATION="24;45;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047333150" ID="ID_1160806927" MODIFIED="1683047352064" TEXT="rechts in-b&#xfc;ndig">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047338246" ID="ID_74223802" MODIFIED="1683047352064" TEXT="rechts &#xfc;berlapp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047342461" ID="ID_70002710" MODIFIED="1683047352065" TEXT="rechts b&#xfc;ndig">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047345829" ID="ID_115418057" MODIFIED="1683047352065" TEXT="rechts disjunkt">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047262589" ID="ID_1007407171" MODIFIED="1683047281376" TEXT="SegN &#x2259; Seg">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047391246" ID="ID_79897442" MODIFIED="1683047397776" TEXT="komplett ersetzend">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047282261" ID="ID_972492925" MODIFIED="1683047287612" TEXT="SegN &gt; Seg">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047421234" ID="ID_34267753" MODIFIED="1683047448083" TEXT="links &#xfc;berlapp rechts in-b&#xfc;ndig">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047431779" ID="ID_867118469" MODIFIED="1683047448083" TEXT="komplett &#xfc;berdeckend">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047436312" ID="ID_178416593" MODIFIED="1683047448084" TEXT="links in-b&#xfc;ndig rechts &#xfc;berlapp">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047063010" ID="ID_1521759912" MODIFIED="1683047144754" TEXT="degenerierte F&#xe4;lle">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047076545" ID="ID_1043278799" MODIFIED="1683047109765" TEXT="weder Start noch Ende &#x27f9; NOP">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047111300" ID="ID_592313563" MODIFIED="1683047141649" TEXT="Ende vor Start &#x27f9; flip">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047568998" ID="ID_717909997" MODIFIED="1683047593595" TEXT="nur Start in leer">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047600842" ID="ID_1296939767" MODIFIED="1683047604778" TEXT="nur Ende in leer">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047624559" ID="ID_1509703991" MODIFIED="1683047708973" TEXT="nur Start in Seg">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047654979" ID="ID_1521058039" MODIFIED="1683047708973" TEXT="nur Ende in Seg">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047688030" ID="ID_1363163343" MODIFIED="1683047708974" TEXT="nur Start vor Seg">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047693102" ID="ID_848292031" MODIFIED="1683047708974" TEXT="nur Ende vor Seg">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047697837" ID="ID_1072007349" MODIFIED="1683047708975" TEXT="nur Start nach Seg">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047704284" ID="ID_695991119" MODIFIED="1683047708975" TEXT="nur Ende nach Seg">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1682627621082" ID="ID_1110039315" MODIFIED="1682948822157" TEXT="ein Segment hinzuf&#xfc;gen">