Segmentation: verify Split-Splice standard cases

Algorithm seems to work basically...
There was a copy-n-paste error in the treatment of the Successor,
leading to spurious duplication in some cases
This commit is contained in:
Fischlurch 2023-05-04 14:43:40 +02:00
parent 1f83e5209b
commit 3f2f3db568
3 changed files with 222 additions and 53 deletions

View file

@ -23,8 +23,56 @@
/** @file splite-splice.cpp
** Generic algorithm to splice a new segment into a seamless segmentation of intervals.
** Here _"segmentation"_ denotes a partitioning of an ordered axis into a seamless sequence
** of intervals (here called "segment"). The axis is based on some _ordering type,_ like e.g.
** int (natural numbers) or lib::time::Time values, and the axis is assumed cover a complete
** domain. The intervals / segments are defined by start and end point, where the start point
** is inclusive, yet the end point is exclusive (the next ordered point after the interval).
**
** @todo 2023 WIP-WIP
** The purpose of the algorithm is to splice in a new segment (interval) at the proper location,
** based on the ordering, such as to retain the ordering and the seamless coverage of the complete
** axis domain. Since there are a lot of possible arrangements of intervals relative to one another,
** this splicing operation may necessitate to adjust _predecessor_ or _successor_ segments, and
** possibly even to insert additional segments to fill a gap, thereby effectively _splitting_
** some segment existing on the axis.
**
** # Specification
**
** The implementation relies upon the following assumptions:
** \par assumptions
** - there is an ordering type `ORD`, which is totally ordered,
** has value semantics and can be clone-initialised (can be immutable)
** - Segments are represented as custom data type and the Segmentation (axis)
** is implemented as a random-access list-like datatype with the ability to insert
** and delete ranges of elements, defined as pairs of _iterators_
** - the algorithm works solely on this _iterator type_ `POS`, which must be assignable,
** can be compared for equality (especially with the "end" iterator) and can be _incremented._
**
** All further bindings to the actual implementation are abstracted as _binding functors_
** - `START`: when invoked on a POS (iterator), get the ORD value of the segment's start point
** - `AFTER`: likewise get the end point (exclusive) of the given segment
** - `CREATE`: create the representation of the desired new segment (which is the purpose
** of invoking this algorithm) and insert it _before_ the given insert POS,
** return an iterator (POS) pointing at the newly created segment
** - `EMPTY`: similarly create a new segment, which however is classified as _empty_
** and serves to fill a gap, notably towards the end of the axis.
** - `CLONE`: insert a _clone_ of an existing segment but adapt it's start and after POS;
** this operation effectively allows to _adapt_ adjacent segments, by also deleting
** the original version after the new elements have been inserted. Return POS of clone
** - `DELETE`: delete all segments between the given start (incl) and end (excl) POS
**
** Moreover, POS (iterators) to indicate the complete domain are required, and a specification
** of the ORD values of the new segmen's _start_ and _after_ points -- which however can also
** be defined only partially (as optional values), to use contextual information...
** - if only the start point is given, then the existing segment containing this point
** will be shortened, and the new segment will cover the span until the existing segment's end
** - likewise an omitted start point will cause the new segment to be expanded towards lower ORD
** values until matching the end of the preceding segment
** - if both values are omitted, the new segment will replace the last segment of the given axis.
** The new segment may span an arbitrary range within the domain and may thus possibly supersede
** several existing segments, which are then removed by the `DELETE` operation.
**
** @todo 2023 WIP
*/
@ -108,6 +156,7 @@ namespace lib {
public:
/**
* Setup for a single SplitSplice-operation to insert a new segment \a start to \a after.
* @param startAll (forward) iterator pointing at the overall Segmentation begin
* @param afterAll (forward) iterator indicating point-after-end of Segmentation
* @param start (optional) specification of new segment's start point
@ -144,7 +193,7 @@ namespace lib {
/**
* Stage-1 and Stage-2 of the algorithm determine the insert point
* and establish the actual start and end point of the new segment
* @return
* @return the definitive start and after ORD values, based on context
*/
SegBounds
establishSplitPoint (POS startAll, POS afterAll
@ -184,6 +233,7 @@ namespace lib {
/**
* Stage-3 of the algorithm works out the precise relation of the
* predecessor and successor segments to determine necessary adjustments
* @remark results in definition of operation verbs #opPred_ and #opSucc_.
*/
void
determineRelations()
@ -259,7 +309,8 @@ namespace lib {
++succ_;
// insert the new elements /before/ the range to be dropped, i.e. at pred_
POS n = createSeg (pred_, b_.start, b_.after);
POS insPos = pred_;
POS n = createSeg (insPos, b_.start, b_.after);
POS s = n;
//
// possibly adapt the predecessor
@ -271,13 +322,13 @@ namespace lib {
//
// possibly adapt the successor
if (opSucc_ == INS_NOP)
emptySeg (pred_, b_.after, getStart(refSucc));
emptySeg (insPos, b_.after, getStart(refSucc));
else
if (opPred_ == TRUNC)
cloneSeg (pred_, b_.after, getAfter(refSucc), refSucc);
if (opSucc_ == TRUNC)
cloneSeg (insPos, b_.after, getAfter(refSucc), refSucc);
// finally discard superseded segments
POS e = discard (pred_, succ_);
POS e = discard (insPos, succ_);
// indicate the range where changes happened
return {s,n,e};

View file

@ -22,6 +22,18 @@
/** @file split-splice-test.cpp
** unit test \ref SplitSplice_test
** to verify proper working of the »SplitSplice« algorithm.
** This is a generic setup to modify a segmentation (partitioning)
** of an ordered axis; the axis is represented as a collection of _segments,_
** which are assumed to be ordered and seamless, with the start point inclusive
** and the end point exclusive (thus the start of the next segment is identical
** with the end point of the current segment).
**
** This test uses the natural number axis between -100 ... +100
** and establishes a binding for the generic algorithm with suitably rigged
** test data, to verify the algorithm properly inserts a new segment under all
** conceivable circumstances, since there are many possibilities of arrangement
** for two ordered segments of arbitrary length.
*/
@ -298,6 +310,7 @@ namespace test {
}
/** @test verify the fixture and self-diagnostics for this test */
void
verify_testFixture()
@ -356,13 +369,43 @@ namespace test {
}
/**
* @test cover all possible cases of splicing an interval
*/
void
verify_standardCases()
{
UNIMPLEMENTED ("standard cases");
auto testCase = [](SegL segmentation
,int startNew
,int afterNew
,ExpectString expectedResult)
{
OptInt startSpec{startNew},
afterSpec{afterNew};
invokeSplitSplice (segmentation, startSpec, afterSpec);
CHECK (segmentation == expectedResult);
CHECK (segmentation.isValid());
};
testCase (SegL{}, -23,24, "├[-100~-23[[-23_24[[24~100[┤"_expect); // simple segment into empty axis
testCase (SegL{5,10}, 2,3, "├[-100~2[[2_3[[3~5[[5_10[[10~100[┤"_expect); // smaller segment left spaced off
testCase (SegL{5,10}, 4,5, "├[-100~4[[4_5[[5_10[[10~100[┤"_expect); // left adjacent
testCase (SegL{5,10}, 4,8, "├[-100~4[[4_8[[8_10[[10~100[┤"_expect); // left overlapping
testCase (SegL{5,10}, 5,8, "├[-100~5[[5_8[[8_10[[10~100[┤"_expect); // left inside justified
testCase (SegL{5,10}, 6,8, "├[-100~5[[5_6[[6_8[[8_10[[10~100[┤"_expect); // smaller segment complete inside
testCase (SegL{5,10}, 7,10, "├[-100~5[[5_7[[7_10[[10~100[┤"_expect); // right inside justified
testCase (SegL{5,10}, 9,13, "├[-100~5[[5_9[[9_13[[13~100[┤"_expect); // right overlapping
testCase (SegL{5,10}, 10,13, "├[-100~5[[5_10[[10_13[[13~100[┤"_expect); // right adjacent
testCase (SegL{5,10}, 13,23, "├[-100~5[[5_10[[10~13[[13_23[[23~100[┤"_expect); // right spaced off
testCase (SegL{5,10}, 5,10, "├[-100~5[[5_10[[10~100[┤"_expect); // identical size replacement
testCase (SegL{5,10}, 3,10, "├[-100~3[[3_10[[10~100[┤"_expect); // larger segment right aligned
testCase (SegL{5,10}, 3,23, "├[-100~3[[3_23[[23~100[┤"_expect); // larger segment overarching
testCase (SegL{5,10}, 5,23, "├[-100~5[[5_23[[23~100[┤"_expect); // larger segment left aligned
}

View file

@ -70346,77 +70346,115 @@
<icon BUILTIN="ksmiletris"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683158382175" ID="ID_1213737514" MODIFIED="1683158390534" TEXT="Setup f&#xfc;r Einzelfall-Tests">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1683158382175" ID="ID_1213737514" MODIFIED="1683199886418" TEXT="Setup f&#xfc;r Einzelfall-Tests">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1683199848866" ID="ID_890601228" MODIFIED="1683199875667" TEXT="voll definierte Bouds">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047015402" ID="ID_1729864005" MODIFIED="1683120259296" TEXT="M&#xf6;gliche Intervall-Anordnungen">
<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="#338800" CREATED="1683047015402" ID="ID_1729864005" MODIFIED="1683203798608" TEXT="M&#xf6;gliche Intervall-Anordnungen">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1683047146727" ID="ID_1666065871" MODIFIED="1683199892426" TEXT="Seg in leer">
<icon BUILTIN="button_ok"/>
</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 COLOR="#338800" CREATED="1683047231372" ID="ID_393126179" MODIFIED="1683203790082" TEXT="SegN &lt; Seg">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1683047290932" ID="ID_1714332119" MODIFIED="1683200066870" TEXT="links disjunkt">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047302426" ID="ID_255724966" MODIFIED="1683047352062" TEXT="links b&#xfc;ndig">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1683047302426" ID="ID_255724966" MODIFIED="1683203758077" TEXT="links b&#xfc;ndig">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1683200290376" FOLDED="true" HGAP="33" ID="ID_230997836" MODIFIED="1683203752499" TEXT="bestehendes Segment dupliziert" VSHIFT="2">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
<font face="Monospaced">expect:&#9500;[-100~2[[4_5[[5_10[[10~100[&#9508; </font>
</p>
<p>
<font face="Monospaced">actual:&#9500;[-100~4[[4_5[[5_10[[5_10[[10~100[&#9508;!gap_10&lt;&gt;5_! </font>
</p>
</body>
</html></richcontent>
<icon BUILTIN="broken-line"/>
<node COLOR="#435e98" CREATED="1683203453122" ID="ID_1856169568" MODIFIED="1683203627745" TEXT="copy-n-paste-Fehler">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
bei der Verarbeitung des Successors hat einer der F&#228;lle auf die Operation opPred_ f&#252;r den Predecessor gepr&#252;ft; im konkreten Fall war das TRUNC, wohingegen f&#252;r den Successor SEAMLESS vorgesehen war. Daher wurde dann an dieser Stelle eine Trucated-copy dies Successors eingef&#252;gt, wobei in diesem Fall das Trucate gar nicht verk&#252;rzt hat, da der Anfangspunkt des Successors b&#252;ndig liegt; so kommt es, da&#223; der Successor komplett aufgedoppelt wurde
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047312185" ID="ID_361978590" MODIFIED="1683047352063" TEXT="links &#xfc;berlapp">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1683203473903" ID="ID_1971966278" MODIFIED="1683203739112" TEXT="bei der Gelegenheit gleich noch Variable f&#xfc;r insert-Position eingef&#xfc;hrt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...habe im Debugger verifiziert, da&#223; das mit den Interatoren-Positionen wirklich klappt: sie bleiben stabil. Trotzdem wird der Code lesbarer, wenn man nur in diesem St&#252;ck pred_ explizit bezeichnet als &quot;insPos&quot; (und pred_ nicht weiter verwendet).
</p>
</body>
</html></richcontent>
<icon BUILTIN="button_ok"/>
</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">
</node>
<node COLOR="#338800" CREATED="1683047312185" ID="ID_361978590" MODIFIED="1683203771932" TEXT="links &#xfc;berlapp">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1683047321800" ID="ID_750704841" MODIFIED="1683203771935" TEXT="links in-b&#xfc;ndig">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1683047329359" ID="ID_1715234114" MODIFIED="1683203771935" 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"/>
<icon BUILTIN="button_ok"/>
</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 COLOR="#338800" CREATED="1683047333150" ID="ID_1160806927" MODIFIED="1683203771934" TEXT="rechts in-b&#xfc;ndig">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047338246" ID="ID_74223802" MODIFIED="1683047352064" TEXT="rechts &#xfc;berlapp">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1683047338246" ID="ID_74223802" MODIFIED="1683203771934" TEXT="rechts &#xfc;berlapp">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047342461" ID="ID_70002710" MODIFIED="1683047352065" TEXT="rechts b&#xfc;ndig">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1683047342461" ID="ID_70002710" MODIFIED="1683203771933" TEXT="rechts b&#xfc;ndig">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047345829" ID="ID_115418057" MODIFIED="1683047352065" TEXT="rechts disjunkt">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1683047345829" ID="ID_115418057" MODIFIED="1683203771933" TEXT="rechts disjunkt">
<icon BUILTIN="button_ok"/>
</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 COLOR="#338800" CREATED="1683047262589" ID="ID_1007407171" MODIFIED="1683203788677" TEXT="SegN &#x2259; Seg">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1683047391246" ID="ID_79897442" MODIFIED="1683203780180" TEXT="komplett ersetzend">
<icon BUILTIN="button_ok"/>
</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 COLOR="#338800" CREATED="1683047282261" ID="ID_972492925" MODIFIED="1683203787431" TEXT="SegN &gt; Seg">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1683047421234" ID="ID_34267753" MODIFIED="1683203780179" TEXT="links &#xfc;berlapp rechts in-b&#xfc;ndig">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047431779" ID="ID_867118469" MODIFIED="1683047448083" TEXT="komplett &#xfc;berdeckend">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1683047431779" ID="ID_867118469" MODIFIED="1683203780179" TEXT="komplett &#xfc;berdeckend">
<icon BUILTIN="button_ok"/>
</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 COLOR="#338800" CREATED="1683047436312" ID="ID_178416593" MODIFIED="1683203780179" TEXT="links in-b&#xfc;ndig rechts &#xfc;berlapp">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683120235864" ID="ID_1312143276" MODIFIED="1683120244568" TEXT="Segmentation-Standardf&#xe4;lle">
<icon BUILTIN="flag-yellow"/>
</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>
@ -70446,6 +70484,43 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683120235864" ID="ID_1312143276" MODIFIED="1683120244568" TEXT="Segmentation-Standardf&#xe4;lle">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047063010" ID="ID_1142231389" MODIFIED="1683047144754" TEXT="degenerierte F&#xe4;lle">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047076545" ID="ID_1966654915" MODIFIED="1683047109765" TEXT="weder Start noch Ende &#x27f9; NOP">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047111300" ID="ID_1355900780" MODIFIED="1683047141649" TEXT="Ende vor Start &#x27f9; flip">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047568998" ID="ID_1848070219" MODIFIED="1683047593595" TEXT="nur Start in leer">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047600842" ID="ID_1424605879" MODIFIED="1683047604778" TEXT="nur Ende in leer">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047624559" ID="ID_710124982" MODIFIED="1683047708973" TEXT="nur Start in Seg">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047654979" ID="ID_233751772" MODIFIED="1683047708973" TEXT="nur Ende in Seg">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047688030" ID="ID_879752507" MODIFIED="1683047708974" TEXT="nur Start vor Seg">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047693102" ID="ID_49056874" MODIFIED="1683047708974" TEXT="nur Ende vor Seg">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047697837" ID="ID_1083499752" MODIFIED="1683047708975" TEXT="nur Start nach Seg">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047704284" ID="ID_981222550" 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">
<arrowlink COLOR="#48417c" DESTINATION="ID_1371147624" ENDARROW="Default" ENDINCLINATION="-48;56;" ID="Arrow_ID_1753796050" STARTARROW="None" STARTINCLINATION="-284;-8;"/>