Invocation: build a DSL to verify connectivity (see #1377)

This was a lot of intricate technical work,
and is now verified in-depth, covering all possible cases.

__We can now__
 * build Nodes
 * verify in detail correct connectivity
 * read Node-IDs and processing specifications
 * maintain a symbolic spec for the arguments of a Port

(and beyond that, we can also **invoke nodes**, which remains to be formally verified)
This commit is contained in:
Fischlurch 2025-02-05 00:25:02 +01:00
parent d5a47bf3e4
commit 72d7986b5e
8 changed files with 564 additions and 135 deletions

View file

@ -227,6 +227,10 @@ namespace lib {
friend auto begin (Several const& svl) { return svl.begin();}
friend auto end (Several const& svl) { return svl.end(); }
using value_type = typename meta::RefTraits<I>::Value;
using reference = typename meta::RefTraits<I>::Reference;
using const_reference = value_type const&;
protected:
size_t

View file

@ -13,9 +13,11 @@
/** @file proc-node.cpp
** Translation unit to hold the actual implementation of node processing operations.
**
** @todo WIP-WIP-WIP 6/2024 not clear yet what goes here and what goes into turnout-system.cpp
** Translation unit for implementation details regarding node-IDs and verification.
** @remark \ref ProcNode itself is a shell to provide a node-ID and a high-level API
** for Render Node invocation. The actual implementation of processing functionality
** is located within the [Turnout](\ref turnout.hpp) and the individual »weaving patterns«
** embedded therein.
*/
@ -247,7 +249,7 @@ namespace engine {
ProcID::genProcSpec() const
{
std::ostringstream buffer;
buffer << nodeName_
buffer << genNodeSymbol()
<< genQualifier()
<< argLists_;
return buffer.str();
@ -501,17 +503,135 @@ namespace engine {
{
auto& leadPorts = srcPorts();
return input < leadPorts.size()
and isSameObject (leadPorts[input].get(), tarPort);
and leadPorts[input] == tarPort;
}
bool
PortDiagnostic::verify_connected (Port& tarPort)
{
for (Port& port : srcPorts())
if (isSameObject (port, tarPort))
if (port == tarPort)
return true;
return false;
}
/**
* @remark _ConCheck provides a fluent DSL notation to verify node connectivity.
* This is achieved by first collecting some counterparts and index specifications
* for the kind of connection to validate. Each qualifier just sets a parameter and
* returns the _ConCheck object by move. The final result is retrieved by this bool
* conversion which in fact has to implement a collection of different evaluations.
* The proper kind of evaluation will be picked based on the actual arguments given;
* the more are present, the more constricted the evaluation becomes. The selection
* of the evaluation to take is thus ordered in reverse order, starting with the
* most constricted cases. Three different kinds of link validations are provided
* - compare two fully qualified Port objects for identity (same object)
* - check if a given Port object is present in a collection of Ports
* - exhaustive search for a match in the cross product of two Port collections.
* The last case is what allows to perform a high-level connectivity test between
* two nodes, which are considered as connected if any link is found.
* @see NodeMeta_test::verify_ID_connectivity()
*/
_ConCheck::operator bool()
{
auto validPort = [this](uint idx) { return idx < anchor.ports().size(); };
auto validLead = [this](uint idx) { return idx < anchor.leads().size(); };
auto validSrc = [this](uint pNo
,uint sNo) { return sNo < anchor.watchPort(pNo).srcPorts().size(); };
auto validSrcP = [this](ProcNode& lead
,uint idx) { return idx < watch(lead).ports().size(); };
auto find_link = [](auto& seq1, auto& seq2)
{
return explore(seq1)
.transform([&](auto& elm){ return contains (seq2, *elm); })
.has_any();
};
// Determine case to handle,
// starting with the most constricted...
if (portNo and srcNo and srcNode and srcPNo)
return validPort(*portNo) // is_linked(node).port(portNo).asSrc(srcNo).to(srcNode).atPort(srcPNo)
and validSrc (*portNo, *srcNo)
and validSrcP(*srcNode,*srcPNo)
and anchor.watchPort(*portNo).srcPorts()[*srcNo]
== watch(*srcNode).ports()[*srcPNo];
else
if (portNo and srcNo and leadNo and srcPNo)
return validPort(*portNo) // is_linked(node).port(portNo).asSrc(srcNo).toLead(leadNo).atPort(srcPNo)
and validSrc (*portNo,*srcNo)
and validLead(*leadNo)
and validSrcP(anchor.leads()[*leadNo], *srcPNo)
and anchor.watchPort(*portNo).srcPorts()[*srcNo]
== anchor.watchLead(*leadNo).ports()[*srcPNo];
else
if (portNo and srcNo and srcPort)
return validPort(*portNo) // is_linked(node).port(portNo).asSrc(srcNo).to(srcPort)
and validSrc (*portNo,*srcNo)
and anchor.watchPort(*portNo).srcPorts()[*srcNo]
== *srcPort;
else
if (portNo and srcNo and srcNode)
return validPort(*portNo) // is_linked(node).port(portNo).asSrc(srcNo).to(srcNode)
and validSrc (*portNo,*srcNo)
and contains (watch(*srcNode).ports()
,anchor.watchPort(*portNo).srcPorts()[*srcNo]);
else
if (portNo and srcNo and leadNo)
return validPort(*portNo) // is_linked(node).port(portNo).asSrc(srcNo).toLead(leadNo)
and validSrc (*portNo,*srcNo)
and validLead(*leadNo)
and contains (anchor.watchLead(*leadNo).ports()
,anchor.watchPort(*portNo).srcPorts()[*srcNo]);
else
if (portNo and srcNo)
return validPort(*portNo) // is_linked(node).port(portNo).asSrc(srcNo)
and validSrc (*portNo,*srcNo);
else
if (portNo and srcNode and srcPNo)
return validPort(*portNo) // is_linked(node).port(portNo).to(srcNode).atPort(srcPNo)
and validSrcP(*srcNode,*srcPNo)
and contains (anchor.watchPort(*portNo).srcPorts()
,watch(*srcNode).ports()[*srcPNo]);
else
if (portNo and leadNo and srcPNo)
return validPort(*portNo) // is_linked(node).port(portNo).toLead(leadNo).atPort(srcPNo)
and validLead(*leadNo)
and validSrcP(anchor.leads()[*leadNo], *srcPNo)
and contains (anchor.watchPort(*portNo).srcPorts()
,anchor.watchLead(*leadNo).ports()[*srcPNo]);
else
if (portNo and srcPort)
return validPort(*portNo) // is_linked(node).port(portNo).to(srcPort)
and contains (anchor.watchPort(*portNo).srcPorts()
,*srcPort);
else
if (portNo and srcNode)
return validPort(*portNo) // is_linked(node).port(portNo).to(srcNode)
and find_link(watch(*srcNode).ports()
,anchor.watchPort(*portNo).srcPorts());
else
if (portNo and leadNo)
return validPort(*portNo) // is_linked(node).port(portNo).toLead(leadNo)
and validLead(*leadNo)
and find_link(anchor.watchLead(*leadNo).ports()
,anchor.watchPort(*portNo).srcPorts());
else
if (portNo)
return validPort(*portNo) // is_linked(node).port(portNo)
and not anchor.watchPort(*portNo).isSrc();
else
if (srcNode and leadNo)
return validLead(*leadNo) // is_linked(node).to(srcNode).asLead(leadNo)
and anchor.leads()[*leadNo]
== *srcNode;
else
if (srcNode)
return contains (anchor.leads() // is_linked(node).to(srcNode)
,*srcNode);
return false;
}
}} // namespace steam::engine

View file

@ -84,7 +84,7 @@
** @remark A future extension to this scheme is conceivable, where common processing pipelines
** are pre-compiled in entirety, possibly combined with hardware acceleration.
**
** @todo WIP-WIP 12/2024 Node-Invocation is reworked from ground up for the »Playback Vertical Slice«
** @todo WIP 2/2025 Node-Invocation is reworked from ground up for the »Playback Vertical Slice«
**
** @see turnout.hpp
** @see turnout-system.hpp
@ -99,11 +99,8 @@
#include "lib/error.hpp"
#include "lib/nocopy.hpp"
#include "lib/hash-value.h"
//#include "steam/asset/proc.hpp"
//#include "steam/mobject/parameter.hpp"
#include "steam/engine/buffhandle.hpp"
#include "steam/engine/turnout-system.hpp"
#include "lib/ref-array.hpp" /////////////////////OOO phase out
#include "lib/format-string.hpp"
#include "lib/several.hpp"
@ -118,6 +115,8 @@ namespace engine {
using std::move;
using std::string;
using std::nullopt;
using std::optional;
using lib::HashVal;
using util::_Fmt;
@ -145,6 +144,10 @@ namespace engine {
virtual BuffHandle weave (TurnoutSystem&, OptionalBuff =std::nullopt) =0;
ProcID& procID;
/// Port has reference semantics: all instances are distinct
friend bool operator== (Port const& pl, Port const& pr){ return & pl == & pr;}
friend bool operator!= (Port const& pl, Port const& pr){ return not (pl == pr); }
};
using PortRef = std::reference_wrapper<Port>;
@ -232,6 +235,10 @@ namespace engine {
return wiring_.ports[portIdx];
}
/// ProcNode has reference semantics: all instances are distinct
friend bool operator== (ProcNode const& nl, ProcNode const& nr){ return & nl == & nr;}
friend bool operator!= (ProcNode const& nl, ProcNode const& nr){ return not (nl == nr); }
/*************************************************************//**
* Engine Core operation: render and pull output from this node.
@ -333,5 +340,47 @@ namespace engine {
}
/** Helper for connectivity-checks in tests */
class _ConCheck
: util::MoveOnly
{
ProcNodeDiagnostic anchor;
ProcNode* srcNode{nullptr};
Port* srcPort{nullptr};
optional<uint> leadNo{nullopt};
optional<uint> portNo{nullopt};
optional<uint> srcNo {nullopt};
optional<uint> srcPNo{nullopt};
public:
_ConCheck (ProcNode& n)
: anchor{watch(n)}
{ }
/** implement decision logic based on context given. */
operator bool();
_ConCheck to (ProcNode& n) { srcNode = &n; return move(*this); }
_ConCheck to (Port& p) { srcPort = &p; return move(*this); }
_ConCheck asLead (uint idx){ leadNo = idx; return move(*this); }
_ConCheck toLead (uint idx){ leadNo = idx; return move(*this); }
_ConCheck asSrc (uint idx){ srcNo = idx; return move(*this); }
_ConCheck port (uint idx){ portNo = idx; return move(*this); }
_ConCheck atPort (uint idx){ srcPNo = idx; return move(*this); }
};
/**
* start a DSL expression to verify node connectivity.
* @see NodeMeta_test::verify_ID_connectivity()
*/
inline _ConCheck
is_linked (ProcNode& n)
{
return _ConCheck{n};
}
}} // namespace steam::engine
#endif /*STEAM_ENGINE_PROC_NODE_H*/

View file

@ -22,7 +22,7 @@ PLANNED "Proc Node connectivity" NodeLink_test <<END
END
PLANNED "Proc Node metadata key" NodeMeta_test <<END
Test "Proc Node metadata key" NodeMeta_test <<END
END

View file

@ -208,6 +208,9 @@ namespace test {
.completePort()
.build()};
CHECK (is_linked(n3).to(n1));
CHECK (is_linked(n3).to(n2));
uint res = invokeRenderNode(n3);
CHECK (res == peek+1 + LIFE_AND_UNIVERSE_4EVER+1 );
CHECK (peek != -1);

View file

@ -90,7 +90,7 @@ namespace test {
CHECK (watch(n1).ports().size() == 1);
// can generate a symbolic spec to describe the Port's processing functionality...
CHECK (watch(n1).getPortSpec(0) == "Test:dummy.op(int)"_expect);
CHECK (watch(n1).getPortSpec(0) == "dummy.op(int)"_expect);
CHECK (watch(n1).getPortSpec(1) == ""_expect);
// such a symbolic spec is actually generated by a deduplicated metadata descriptor
@ -111,15 +111,15 @@ namespace test {
// re-generate the descriptor for the source node (n1)
auto& metaN1 = ProcID::describe("Test:dummy","op(int)");
CHECK (metaN1.genProcSpec() == "Test:dummy.op(int)"_expect);
CHECK (metaN1.genProcName() == "Test:dummy.op"_expect);
CHECK (metaN1.genProcSpec() == "dummy.op(int)"_expect);
CHECK (metaN1.genProcName() == "dummy.op"_expect);
CHECK (metaN1.genNodeName() == "Test:dummy"_expect);
CHECK (metaN1.genNodeSpec(con.leads) == "Test:dummy-◎"_expect);
}
/** @test TODO Build more elaborate Render Nodes linked into a connectivity network
* @todo WIP 1/25 🔁 define implement
/** @test Build more elaborate Render Nodes linked into a connectivity network
* @todo WIP 1/25 🔁 define implement
*/
void
build_connected_nodes()
@ -197,6 +197,13 @@ SHOW_EXPR(watch(n1).getPortSpec(0))
SHOW_EXPR(watch(n1).getPortSpec(1))
SHOW_EXPR(watch(n1.getPort(0)).getProcSpec())
SHOW_EXPR(watch(n1.getPort(0)).isSrc())
CHECK ( is_linked(n2).to(n1));
CHECK (not is_linked(n1b).to(n1));
CHECK (not is_linked(n3).to(n1));
CHECK ( is_linked(n3).to(n1b));
CHECK ( is_linked(n3).to(n2));
}

View file

@ -21,26 +21,22 @@
#include "steam/engine/node-builder.hpp"
#include "lib/format-util.hpp"
#include "lib/test/test-helper.hpp"
//#include "steam/engine/test-rand-ontology.hpp" ///////////TODO
#include "lib/test/diagnostic-output.hpp"/////////////////TODO
//#include "lib/util.hpp"
#include <cmath>
//using std::string;
namespace steam {
namespace engine{
namespace test {
using std::abs;
// using util::join;
/***************************************************************//**
* @test Render node metadata and hash identity keys.
* @todo 2/2025 hash computation is not yet specified...
*/
class NodeMeta_test : public Test
{
@ -77,8 +73,8 @@ namespace test {
CHECK (p2.genProcName() == "N2.+"_expect ); // domain omitted, qualifier joined with '.'
CHECK (p2.genQualifier() == ".+"_expect ); // qualifier includes leading '.'
CHECK (p3.genProcName() == "N3"_expect );
CHECK (p2.genProcSpec() == "U:N2.+(a1,a2)"_expect );
CHECK (p3.genProcSpec() == "O:N3(in/3)(o1,o2/2)"_expect );
CHECK (p2.genProcSpec() == "N2.+(a1,a2)"_expect );
CHECK (p3.genProcSpec() == "N3(in/3)(o1,o2/2)"_expect );
ProcID::ArgModel arg1 = p1.genArgModel();
ProcID::ArgModel arg2 = p2.genArgModel();
@ -109,13 +105,31 @@ namespace test {
}
/** @test TODO aspects of node definition relevant for the ProcID
* @todo WIP 2/25 🔁 define 🔁 implement
/** @test validate the interplay of node connectivity
* with reported properties at the ProcID and
* demonstrate tools to check connectivity.
* - Build a 3-node network with dummy operations,
* which however are built to mimic the very common
* situation where two sources are mixed
* - at exit side, three different »flavours« can be
* produced, which implies that there are three Ports.
* - the source at the »A-side« provided only two flavours,
* and thus an explicit wiring has to be made for the
* A-side connection of the third chain
* - In real usage, the node specification strings will be
* provided from the Media-Lib adapter plug-in. Here it is
* hard wired, and defined in a way to reflect structure.
* - various ways to drill-down into the structure are explored
* by verifying the ProcID specification visible at each point.
* - then the tools for verifying connectivity are demonstrated
* and covered with relevant positive and negative combinations.
* @todo 2/25 🔁 define implement
*/
void
verify_ID_connectivity()
{
// This operation emulates a data source
// These operations emulate data sources
auto src_opA = [](int param, int* res) { *res = param; };
auto src_opB = [](ulong param, ulong* res){ *res = param; };
@ -214,7 +228,8 @@ namespace test {
CHECK (watch(nM).watchPort(2).watchLead(1).getProcName() == "srcB.c"_expect );
CHECK (watch(nM).watchPort(2).watchLead(1).getProcSpec() == "srcB.c(ulong)"_expect);
CHECK (watch(nM).watchPort(2).watchLead(1).isSrc() == true ); // the lead port itself is a source
CHECK (watch(nM).watchPort(2).watchLead(1).srcPorts().size() == 0 );
CHECK (watch(nM).watchPort(2).watchLead(1).srcPorts().size() == 0 ); // ...and thus has an empty source-port-collection
// Helper predicate to verify connectedness to a specific Port given by reference
CHECK (watch(nM).watchPort(2).verify_connected( watch(nA).ports()[0]) == false );
@ -227,8 +242,169 @@ namespace test {
CHECK (watch(nM).watchPort(2).verify_connected(0, watch(nB).ports()[2]) == false );
CHECK (watch(nM).watchPort(2).verify_connected(1, watch(nA).ports()[1]) == false ); // Node-nM.port#2 doesn't connect via source#1 to Node-nA.port#1
///////////////////////////////////////////////////////TODO WIP
UNIMPLEMENTED ("verify connectivity");
//__________________________________
// Inspect Node and Port connectivity
// High-level case: connections between nodes
CHECK (is_linked(nM).to(nA) == true );
CHECK (is_linked(nM).to(nB) == true );
CHECK (is_linked(nA).to(nB) == false);
// additionally qualify the index position
// of the source node in the sequence of »Lead nodes«
CHECK (is_linked(nM).to(nA).asLead(0) == true ); // Node-nA is Lead-#0
CHECK (is_linked(nM).to(nA).asLead(1) == false);
CHECK (is_linked(nM).to(nB).asLead(0) == false);
CHECK (is_linked(nM).to(nB).asLead(1) == true ); // Node-nB is Lead-#1
// Check if a specific Port is connected to a source node
CHECK (is_linked(nM).port(0).to(nA) == true );
CHECK (is_linked(nM).port(0).to(nB) == true );
CHECK (is_linked(nM).port(0).to(nM) == false); // never connected to itself
// Similar, but now pick the source node from the »Leads«
CHECK (is_linked(nM).port(0).toLead(0) == true );
CHECK (is_linked(nM).port(0).toLead(1) == true );
CHECK (is_linked(nA).port(0).toLead(0) == false); // nA is a source node and thus has no further source-connections
// Verify detailed port-to-port connectivity
CHECK (is_linked(nM).port(0).to(watch(nA).ports()[0]) == true ); // Node-nM connected within Port-0 to Port-0 of Node-nA
CHECK (is_linked(nM).port(0).to(watch(nA).ports()[1]) == false); // ......but not connected to Port-1 of Node-nA
CHECK (is_linked(nM).port(0).to(watch(nB).ports()[0]) == true );
CHECK (is_linked(nM).port(0).to(watch(nB).ports()[1]) == false);
CHECK (is_linked(nM).port(0).to(watch(nB).ports()[2]) == false);
CHECK (is_linked(nM).port(2).to(watch(nA).ports()[0]) == false);
CHECK (is_linked(nM).port(2).to(watch(nA).ports()[1]) == true ); // this is the connection routed from port-2 to Node-nA, Port-1
CHECK (is_linked(nM).port(2).to(watch(nB).ports()[0]) == false);
CHECK (is_linked(nM).port(2).to(watch(nB).ports()[1]) == false);
CHECK (is_linked(nM).port(2).to(watch(nB).ports()[2]) == true );
CHECK (is_linked(nM).port(2).to(watch(nM).ports()[2]) == false); // a nonsensical check, nodes are never connected to themselves
CHECK (is_linked(nM).port(0).to(nA).atPort(0) == true );
CHECK (is_linked(nM).port(0).to(nA).atPort(1) == false);
CHECK (is_linked(nM).port(0).to(nB).atPort(0) == true );
CHECK (is_linked(nM).port(0).to(nB).atPort(1) == false);
CHECK (is_linked(nM).port(0).to(nB).atPort(2) == false);
CHECK (is_linked(nM).port(2).to(nA).atPort(0) == false);
CHECK (is_linked(nM).port(2).to(nA).atPort(1) == true );
CHECK (is_linked(nM).port(2).to(nB).atPort(0) == false);
CHECK (is_linked(nM).port(2).to(nB).atPort(1) == false);
CHECK (is_linked(nM).port(2).to(nB).atPort(2) == true );
CHECK (is_linked(nM).port(2).to(nM).atPort(2) == false);
CHECK (is_linked(nM).port(0).toLead(0).atPort(0) == true );
CHECK (is_linked(nM).port(0).toLead(0).atPort(1) == false);
CHECK (is_linked(nM).port(0).toLead(1).atPort(0) == true );
CHECK (is_linked(nM).port(0).toLead(1).atPort(1) == false);
CHECK (is_linked(nM).port(0).toLead(1).atPort(2) == false);
CHECK (is_linked(nM).port(2).toLead(0).atPort(0) == false);
CHECK (is_linked(nM).port(2).toLead(0).atPort(1) == true );
CHECK (is_linked(nM).port(2).toLead(1).atPort(0) == false);
CHECK (is_linked(nM).port(2).toLead(1).atPort(1) == false);
CHECK (is_linked(nM).port(2).toLead(1).atPort(2) == true );
// additionally also qualify the «source slot«
// at which the connection is used as input for the processing-function
CHECK (is_linked(nM).port(0).asSrc(0).to(nA) == true ); // Node-nM, Port-0 uses as source-slot-0 a connection to Node-nA
CHECK (is_linked(nM).port(0).asSrc(1).to(nA) == false );
CHECK (is_linked(nM).port(0).asSrc(0).to(nB) == false );
CHECK (is_linked(nM).port(0).asSrc(1).to(nB) == true );
CHECK (is_linked(nM).port(2).asSrc(0).to(nA) == true );
CHECK (is_linked(nM).port(2).asSrc(1).to(nA) == false );
CHECK (is_linked(nM).port(2).asSrc(0).to(nB) == false );
CHECK (is_linked(nM).port(2).asSrc(1).to(nB) == true );
CHECK (is_linked(nM).port(2).asSrc(1).to(nM) == false ); // never connected to itself
CHECK (is_linked(nM).port(0).asSrc(0).toLead(0) == true ); // Lead-#0 is Node-nA
CHECK (is_linked(nM).port(0).asSrc(1).toLead(0) == false );
CHECK (is_linked(nM).port(0).asSrc(0).toLead(1) == false );
CHECK (is_linked(nM).port(0).asSrc(1).toLead(1) == true );
CHECK (is_linked(nM).port(2).asSrc(0).toLead(0) == true );
CHECK (is_linked(nM).port(2).asSrc(1).toLead(0) == false );
CHECK (is_linked(nM).port(2).asSrc(0).toLead(1) == false );
CHECK (is_linked(nM).port(2).asSrc(1).toLead(1) == true );
// Again detailed port-to-port connections, this time limited by «source slot»
CHECK (is_linked(nM).port(0).asSrc(0).to(watch(nA).ports()[0]) == true ); // Node-nA, Port-0 connects as src-#0 to node-nA at Port-0
CHECK (is_linked(nM).port(0).asSrc(0).to(watch(nA).ports()[1]) == false); // ...and can thus not be connected to any other Port there
CHECK (is_linked(nM).port(0).asSrc(1).to(watch(nA).ports()[0]) == false);
CHECK (is_linked(nM).port(0).asSrc(1).to(watch(nA).ports()[1]) == false);
CHECK (is_linked(nM).port(0).asSrc(0).to(watch(nB).ports()[0]) == false);
CHECK (is_linked(nM).port(0).asSrc(0).to(watch(nB).ports()[1]) == false);
CHECK (is_linked(nM).port(0).asSrc(0).to(watch(nB).ports()[2]) == false);
CHECK (is_linked(nM).port(0).asSrc(1).to(watch(nB).ports()[0]) == true );
CHECK (is_linked(nM).port(0).asSrc(1).to(watch(nB).ports()[1]) == false);
CHECK (is_linked(nM).port(0).asSrc(1).to(watch(nB).ports()[2]) == false);
CHECK (is_linked(nM).port(2).asSrc(0).to(watch(nA).ports()[0]) == false);
CHECK (is_linked(nM).port(2).asSrc(0).to(watch(nA).ports()[1]) == true );
CHECK (is_linked(nM).port(2).asSrc(1).to(watch(nA).ports()[0]) == false);
CHECK (is_linked(nM).port(2).asSrc(1).to(watch(nA).ports()[1]) == false);
CHECK (is_linked(nM).port(2).asSrc(0).to(watch(nB).ports()[0]) == false);
CHECK (is_linked(nM).port(2).asSrc(0).to(watch(nB).ports()[1]) == false);
CHECK (is_linked(nM).port(2).asSrc(0).to(watch(nB).ports()[2]) == false);
CHECK (is_linked(nM).port(2).asSrc(1).to(watch(nB).ports()[0]) == false);
CHECK (is_linked(nM).port(2).asSrc(1).to(watch(nB).ports()[1]) == false);
CHECK (is_linked(nM).port(2).asSrc(1).to(watch(nB).ports()[2]) == true );
CHECK (is_linked(nM).port(2).asSrc(1).to(watch(nM).ports()[2]) == false); // never connected to itself
CHECK (is_linked(nM).port(0).asSrc(0).to(nA).atPort(0) == true );
CHECK (is_linked(nM).port(0).asSrc(0).to(nA).atPort(1) == false);
CHECK (is_linked(nM).port(0).asSrc(1).to(nA).atPort(0) == false);
CHECK (is_linked(nM).port(0).asSrc(1).to(nA).atPort(1) == false);
CHECK (is_linked(nM).port(0).asSrc(0).to(nB).atPort(0) == false);
CHECK (is_linked(nM).port(0).asSrc(0).to(nB).atPort(1) == false);
CHECK (is_linked(nM).port(0).asSrc(0).to(nB).atPort(2) == false);
CHECK (is_linked(nM).port(0).asSrc(1).to(nB).atPort(0) == true );
CHECK (is_linked(nM).port(0).asSrc(1).to(nB).atPort(1) == false);
CHECK (is_linked(nM).port(0).asSrc(1).to(nB).atPort(2) == false);
CHECK (is_linked(nM).port(2).asSrc(0).to(nA).atPort(0) == false);
CHECK (is_linked(nM).port(2).asSrc(0).to(nA).atPort(1) == true );
CHECK (is_linked(nM).port(2).asSrc(1).to(nA).atPort(0) == false);
CHECK (is_linked(nM).port(2).asSrc(1).to(nA).atPort(1) == false);
CHECK (is_linked(nM).port(2).asSrc(0).to(nB).atPort(0) == false);
CHECK (is_linked(nM).port(2).asSrc(0).to(nB).atPort(1) == false);
CHECK (is_linked(nM).port(2).asSrc(0).to(nB).atPort(2) == false);
CHECK (is_linked(nM).port(2).asSrc(1).to(nB).atPort(0) == false);
CHECK (is_linked(nM).port(2).asSrc(1).to(nB).atPort(1) == false);
CHECK (is_linked(nM).port(2).asSrc(1).to(nB).atPort(2) == true );
CHECK (is_linked(nM).port(2).asSrc(1).to(nM).atPort(2) == false);
CHECK (is_linked(nM).port(0).asSrc(0).toLead(0).atPort(0) == true );
CHECK (is_linked(nM).port(0).asSrc(0).toLead(0).atPort(1) == false);
CHECK (is_linked(nM).port(0).asSrc(1).toLead(0).atPort(0) == false);
CHECK (is_linked(nM).port(0).asSrc(1).toLead(0).atPort(1) == false);
CHECK (is_linked(nM).port(0).asSrc(0).toLead(1).atPort(0) == false);
CHECK (is_linked(nM).port(0).asSrc(0).toLead(1).atPort(1) == false);
CHECK (is_linked(nM).port(0).asSrc(0).toLead(1).atPort(2) == false);
CHECK (is_linked(nM).port(0).asSrc(1).toLead(1).atPort(0) == true );
CHECK (is_linked(nM).port(0).asSrc(1).toLead(1).atPort(1) == false);
CHECK (is_linked(nM).port(0).asSrc(1).toLead(1).atPort(2) == false);
CHECK (is_linked(nM).port(2).asSrc(0).toLead(0).atPort(0) == false);
CHECK (is_linked(nM).port(2).asSrc(0).toLead(0).atPort(1) == true );
CHECK (is_linked(nM).port(2).asSrc(1).toLead(0).atPort(0) == false);
CHECK (is_linked(nM).port(2).asSrc(1).toLead(0).atPort(1) == false);
CHECK (is_linked(nM).port(2).asSrc(0).toLead(1).atPort(0) == false);
CHECK (is_linked(nM).port(2).asSrc(0).toLead(1).atPort(1) == false);
CHECK (is_linked(nM).port(2).asSrc(0).toLead(1).atPort(2) == false);
CHECK (is_linked(nM).port(2).asSrc(1).toLead(1).atPort(0) == false);
CHECK (is_linked(nM).port(2).asSrc(1).toLead(1).atPort(1) == false);
CHECK (is_linked(nM).port(2).asSrc(1).toLead(1).atPort(2) == true );
// Some fallback-cases tested when given an incomplete chain:
// Specifying only a Port an source-slot just checks for valid index
CHECK (is_linked(nM).port(0).asSrc(0) == true );
CHECK (is_linked(nM).port(0).asSrc(1) == true );
CHECK (is_linked(nM).port(0).asSrc(2) == false); // has only 2 source-slots
CHECK (is_linked(nA).port(0).asSrc(0) == false); // node-nA is a source-node and thus has no source-slot at all
// A port allone is checked for any incoming connections
CHECK (is_linked(nM).port(0) == true );
CHECK (is_linked(nM).port(1) == true );
CHECK (is_linked(nM).port(2) == true );
CHECK (is_linked(nM).port(3) == false); // node-nM has only 3 ports, i.e. index [0...2]
CHECK (is_linked(nA).port(0) == false); // node-nA is a source node and thus no port can have an incoming connection
CHECK (is_linked(nB).port(0) == false); // same for node-nB
}
};

View file

@ -101858,7 +101858,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
<node COLOR="#435e98" CREATED="1730424032542" ID="ID_311029412" MODIFIED="1736112671179" TEXT="invoke(qual, FUN)">
<node CREATED="1730425989177" ID="ID_1347337581" MODIFIED="1730426088900" TEXT="der qualifier markiert Inhaltliche Eigenschaften">
<linktarget COLOR="#4e40b0" DESTINATION="ID_1347337581" ENDARROW="Default" ENDINCLINATION="-40;101;" ID="Arrow_ID_507591051" SOURCE="ID_162351868" STARTARROW="None" STARTINCLINATION="-43;-150;"/>
<linktarget COLOR="#4e40b0" DESTINATION="ID_1347337581" ENDARROW="Default" ENDINCLINATION="-59;113;" ID="Arrow_ID_507591051" SOURCE="ID_162351868" STARTARROW="None" STARTINCLINATION="-71;-193;"/>
<node CREATED="1730426034938" ID="ID_1707661872" MODIFIED="1730426047611" TEXT="...um zu erkennen, wenn der Cache invalidiert wird"/>
<node CREATED="1730426048856" ID="ID_875923873" MODIFIED="1730426056546" TEXT="und auch als Verifikation f&#xfc;r Tests"/>
<node CREATED="1730425828741" ID="ID_1472232983" MODIFIED="1730426454293" TEXT="auf Level-2 lediglich ein Qualifier-Literal notwendig">
@ -101877,7 +101877,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1728764786662" ID="ID_475636936" MODIFIED="1728765035215" TEXT="Test/Verifizierbarkeit der Resultate">
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1728764786662" ID="ID_475636936" MODIFIED="1728765035215" TEXT="Test/Verifizierbarkeit der Resultate" VGAP="13">
<linktarget COLOR="#ef0066" DESTINATION="ID_475636936" ENDARROW="Default" ENDINCLINATION="-1187;-101;" ID="Arrow_ID_426827896" SOURCE="ID_1876650367" STARTARROW="None" STARTINCLINATION="859;48;"/>
<icon BUILTIN="yes"/>
<node CREATED="1728768899761" ID="ID_533220304" MODIFIED="1728769142319" TEXT="insgesamt: vor allem das Berechnungsergebnis pr&#xfc;fen">
@ -101891,7 +101891,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1729983211127" ID="ID_156488923" MODIFIED="1729983442880">
<node COLOR="#435e98" CREATED="1729983211127" ID="ID_156488923" MODIFIED="1738720248777">
<richcontent TYPE="NODE"><html>
<head/>
<body>
@ -101923,12 +101923,25 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</body>
</html></richcontent>
<icon BUILTIN="yes"/>
<node CREATED="1738720254926" ID="ID_942923280" MODIFIED="1738720259121" TEXT="watch(node)"/>
<node CREATED="1738720260322" ID="ID_937473649" MODIFIED="1738720270675" TEXT="watch(node).watchPort(n)"/>
<node CREATED="1738720273780" ID="ID_964268605" MODIFIED="1738720304963" TEXT="watch(node).watchPort(#).watchLead(#)"/>
</node>
<node CREATED="1728765067388" ID="ID_1708286207" MODIFIED="1728765109597" TEXT="f&#xfc;r eine Node...">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1728765130912" ID="ID_1032840307" MODIFIED="1729986432790" TEXT="die Identit&#xe4;t feststellen k&#xf6;nnen">
<node CREATED="1728765067388" ID="ID_1708286207" MODIFIED="1738715962264" TEXT="f&#xfc;r eine Node...">
<node COLOR="#338800" CREATED="1728765130912" ID="ID_1032840307" MODIFIED="1738720160904" TEXT="die Identit&#xe4;t feststellen k&#xf6;nnen">
<linktarget COLOR="#666a8d" DESTINATION="ID_1032840307" ENDARROW="Default" ENDINCLINATION="312;27;" ID="Arrow_ID_1338984517" SOURCE="ID_1710935234" STARTARROW="None" STARTINCLINATION="158;-13;"/>
<linktarget COLOR="#5e5572" DESTINATION="ID_1032840307" ENDARROW="Default" ENDINCLINATION="-1323;101;" ID="Arrow_ID_1310977916" SOURCE="ID_435456030" STARTARROW="Default" STARTINCLINATION="1366;-77;"/>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1738720166257" ID="ID_455052218" MODIFIED="1738720177652" TEXT="auf zwei Weisen">
<font NAME="SansSerif" SIZE="10"/>
<icon BUILTIN="idea"/>
<node CREATED="1738720180512" ID="ID_1964267963" MODIFIED="1738720231754" TEXT="Verifikation gegen bekanntes Objekt (Referenz-Semantik)">
<font NAME="SansSerif" SIZE="11"/>
</node>
<node CREATED="1738720203517" ID="ID_504569746" MODIFIED="1738720231754" TEXT="Node-Spec-Strings auslesen">
<font NAME="SansSerif" SIZE="11"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1728765172917" ID="ID_33308294" MODIFIED="1729983023889" TEXT="Zahl der Leads und Ports pr&#xfc;fen">
<icon BUILTIN="button_ok"/>
@ -101936,33 +101949,75 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<font NAME="Monospaced" SIZE="9"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1736262340508" ID="ID_1540010113" MODIFIED="1736262527878" TEXT="Verdrahtung der Leads verifizieren">
<linktarget COLOR="#d10172" DESTINATION="ID_1540010113" ENDARROW="Default" ENDINCLINATION="-473;38;" ID="Arrow_ID_1593223212" SOURCE="ID_1980325374" STARTARROW="None" STARTINCLINATION="-242;0;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1736267197593" ID="ID_782732599" MODIFIED="1738696649951" TEXT="isConnected(Node)">
<linktarget COLOR="#377ccf" DESTINATION="ID_782732599" ENDARROW="Default" ENDINCLINATION="118;225;" ID="Arrow_ID_1337974921" SOURCE="ID_1426452060" STARTARROW="None" STARTINCLINATION="259;25;"/>
<node CREATED="1736267212093" ID="ID_175731942" MODIFIED="1738687613351" TEXT=".to(Node)">
<node CREATED="1738687232005" ID="ID_296436750" MODIFIED="1738687616103" TEXT=".asLead(#)"/>
<node COLOR="#338800" CREATED="1736262340508" ID="ID_1540010113" MODIFIED="1738715625389" TEXT="Verdrahtung der Leads verifizieren">
<linktarget COLOR="#01a9d1" DESTINATION="ID_1540010113" ENDARROW="Default" ENDINCLINATION="-477;37;" ID="Arrow_ID_1593223212" SOURCE="ID_1980325374" STARTARROW="None" STARTINCLINATION="-242;0;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1736267197593" ID="ID_782732599" MODIFIED="1738703882479" TEXT="is_linked(Node)">
<linktarget COLOR="#377ccf" DESTINATION="ID_782732599" ENDARROW="Default" ENDINCLINATION="171;440;" ID="Arrow_ID_1337974921" SOURCE="ID_1426452060" STARTARROW="None" STARTINCLINATION="259;25;"/>
<node COLOR="#435e98" CREATED="1736267212093" ID="ID_175731942" MODIFIED="1738703879803" TEXT=".to(Node)">
<node COLOR="#435e98" CREATED="1738687232005" ID="ID_296436750" MODIFIED="1738703891177" TEXT=".asLead(#)"/>
</node>
<node CREATED="1738687304418" ID="ID_1202896757" MODIFIED="1738687610535" TEXT=".port(#)">
<node CREATED="1738687403447" ID="ID_257883570" MODIFIED="1738687618686" TEXT=".toLead(#)"/>
<node CREATED="1738687590798" ID="ID_103314751" MODIFIED="1738687622033" TEXT=".asInput(#)">
<node CREATED="1736267281885" ID="ID_1401668777" MODIFIED="1738687797317" TEXT=".to(Port)">
<arrowlink COLOR="#ffe4bc" DESTINATION="ID_1514661165" ENDARROW="Default" ENDINCLINATION="148;-7;" ID="Arrow_ID_792010004" STARTARROW="None" STARTINCLINATION="73;18;"/>
<node COLOR="#435e98" CREATED="1738687304418" ID="ID_1202896757" MODIFIED="1738704373245" TEXT=".port(#)">
<node COLOR="#435e98" CREATED="1738687403447" ID="ID_257883570" MODIFIED="1738706146897" TEXT=".toLead(#)">
<node COLOR="#435e98" CREATED="1738707252516" ID="ID_1664734051" MODIFIED="1738708762733" TEXT=".atPort(#)"/>
</node>
<node CREATED="1738687785177" ID="ID_961914268" MODIFIED="1738687790183" TEXT="to(Node)"/>
<node CREATED="1738687403447" ID="ID_1094177702" MODIFIED="1738687618686" TEXT=".toLead(#)"/>
<node COLOR="#435e98" CREATED="1738687785177" ID="ID_1202911885" MODIFIED="1738706492900" TEXT="to(Node)">
<node COLOR="#435e98" CREATED="1738707252516" ID="ID_941208072" MODIFIED="1738708769052" TEXT=".atPort(#)"/>
</node>
<node COLOR="#435e98" CREATED="1736267281885" ID="ID_136704903" MODIFIED="1738707214440" TEXT=".to(Port)"/>
<node COLOR="#435e98" CREATED="1738687590798" ID="ID_103314751" MODIFIED="1738709684083" TEXT=".asSrc(#)">
<node COLOR="#435e98" CREATED="1738687785177" ID="ID_961914268" MODIFIED="1738710866242" TEXT="to(Node)">
<node COLOR="#435e98" CREATED="1738707252516" ID="ID_707094818" MODIFIED="1738711584949" TEXT=".atPort(#)"/>
</node>
<node COLOR="#435e98" CREATED="1738687403447" ID="ID_1094177702" MODIFIED="1738711078629" TEXT=".toLead(#)">
<node COLOR="#435e98" CREATED="1738707252516" ID="ID_1499202262" MODIFIED="1738715278082" TEXT=".atPort(#)"/>
</node>
<node COLOR="#435e98" CREATED="1736267281885" ID="ID_1401668777" MODIFIED="1738711083625" TEXT=".to(Port)">
<arrowlink COLOR="#ffe4bc" DESTINATION="ID_1514661165" ENDARROW="None" ENDINCLINATION="148;-7;" ID="Arrow_ID_792010004" STARTARROW="Default" STARTINCLINATION="73;18;"/>
</node>
</node>
</node>
<node CREATED="1738691860188" ID="ID_1515900791" MODIFIED="1738691874771" TEXT="Hilfskonstrukt _ConCheck"/>
</node>
<node COLOR="#338800" CREATED="1738691860188" FOLDED="true" ID="ID_1515900791" MODIFIED="1738720151599" TEXT="Hilfskonstrukt _ConCheck">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1738700465781" ID="ID_572087665" MODIFIED="1738715586864" TEXT="als Datenpool">
<node CREATED="1738715488053" ID="ID_1880401052" MODIFIED="1738715501871" TEXT="ProcNodeDiagnostik als Anker und Startpunkt"/>
<node CREATED="1738715504234" ID="ID_381436875" MODIFIED="1738715514357" TEXT="hierzu">
<node CREATED="1738715515513" ID="ID_350947928" MODIFIED="1738715520780" TEXT="eine andere Node"/>
<node CREATED="1738715521912" ID="ID_1717076432" MODIFIED="1738715526036" TEXT="ein anderer Port"/>
<node CREATED="1738715531951" ID="ID_426868578" MODIFIED="1738715540562" TEXT="Auswahl eines Lead per #"/>
<node CREATED="1738715544685" ID="ID_59514496" MODIFIED="1738715550553" TEXT="Auswahl eines Port per #"/>
<node CREATED="1738715555268" ID="ID_128177372" MODIFIED="1738715566844" TEXT="Auswahl einer Quelle im Port per #"/>
<node CREATED="1738715569484" ID="ID_1706538781" MODIFIED="1738715581036" TEXT="Auswahl eines Quell-Port auf Node oder Lead"/>
</node>
</node>
<node CREATED="1728769243429" ID="ID_1535113263" MODIFIED="1728769249651" TEXT="f&#xfc;r einen Port...">
<node COLOR="#435e98" CREATED="1738700472920" ID="ID_1868872518" MODIFIED="1738715589537" TEXT="flexible Logik &#x27f6; folgt den gegebenen Daten">
<node CREATED="1738715299759" ID="ID_1155060969" MODIFIED="1738715321118" TEXT="Kurzschlu&#xdf;-Regelauswahl"/>
<node CREATED="1738715322836" ID="ID_363705456" MODIFIED="1738715337478" TEXT="mit den am meisten beschr&#xe4;nkten F&#xe4;llen beginnen"/>
<node CREATED="1738715348448" ID="ID_1240975271" MODIFIED="1738715368465" TEXT="in jedem Guard alle eingehenden Parameter auf Vorhandensein pr&#xfc;fen"/>
<node CREATED="1738715369965" ID="ID_1514537699" MODIFIED="1738715380504" TEXT="dagegen Validit&#xe4;t der Indices ist Teil der Auswertung"/>
<node CREATED="1738715381924" ID="ID_1511033653" MODIFIED="1738715396637" TEXT="Platzhalter-Regeln f&#xfc;r innere Auswertungen"/>
<node COLOR="#338800" CREATED="1738715411295" ID="ID_475440038" MODIFIED="1738715470703" TEXT="drei Arten von Checks">
<icon BUILTIN="idea"/>
<node CREATED="1738715419639" ID="ID_153382431" MODIFIED="1738715425113" TEXT="Objekt-Identit&#xe4;t"/>
<node CREATED="1738715428782" ID="ID_1171076314" MODIFIED="1738715437744" TEXT="Port in einer Port-Sequenz gefunden"/>
<node CREATED="1738715439100" ID="ID_1633647108" MODIFIED="1738715461101" TEXT="Kreuzprodukt aus zwei Port-Sequenzen auf Match durchsuchen"/>
</node>
</node>
<node COLOR="#338800" CREATED="1738700499212" ID="ID_1410196474" MODIFIED="1738715595904" TEXT="Vereinfachung: Equality auf ProcNode und Port als object-Identity">
<icon BUILTIN="idea"/>
</node>
</node>
<node COLOR="#338800" CREATED="1738715691754" HGAP="18" ID="ID_215149879" LINK="#ID_238141567" MODIFIED="1738715889160" TEXT="kombinatorischer Test" VSHIFT="-6">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
<node CREATED="1728769243429" HGAP="21" ID="ID_1535113263" MODIFIED="1738715900599" TEXT="f&#xfc;r einen Port..." VSHIFT="4">
<node COLOR="#338800" CREATED="1728769266173" ID="ID_664281474" MODIFIED="1738645454119" TEXT="die Identit&#xe4;t der gebundenen Funktion feststellen">
<icon BUILTIN="button_ok"/>
<node CREATED="1730425962531" ID="ID_162351868" LINK="#ID_1465368594" MODIFIED="1730426145795" TEXT="dies ist eine semantische Identit&#xe4;t">
<arrowlink COLOR="#4e40b0" DESTINATION="ID_1347337581" ENDARROW="Default" ENDINCLINATION="-40;101;" ID="Arrow_ID_507591051" STARTARROW="None" STARTINCLINATION="-43;-150;"/>
<arrowlink COLOR="#4e40b0" DESTINATION="ID_1347337581" ENDARROW="Default" ENDINCLINATION="-59;113;" ID="Arrow_ID_507591051" STARTARROW="None" STARTINCLINATION="-71;-193;"/>
</node>
<node COLOR="#534398" CREATED="1738645368589" ID="ID_1124183685" MODIFIED="1738645445662" TEXT="man kann also nur einen Spec-String wieder zur&#xfc;ckliefern">
<font NAME="SansSerif" SIZE="11"/>
@ -101973,14 +102028,14 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<arrowlink COLOR="#34417f" DESTINATION="ID_786613770" ENDARROW="Default" ENDINCLINATION="-278;-1402;" ID="Arrow_ID_1689861408" STARTARROW="None" STARTINCLINATION="-284;14;"/>
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1736262340508" ID="ID_1424762602" MODIFIED="1736262533421" TEXT="Verdrahtung der Vorg&#xe4;nger-Ports verifizieren">
<linktarget COLOR="#d10172" DESTINATION="ID_1424762602" ENDARROW="Default" ENDINCLINATION="-390;24;" ID="Arrow_ID_329256820" SOURCE="ID_1980325374" STARTARROW="None" STARTINCLINATION="-202;0;"/>
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1736262340508" ID="ID_1424762602" MODIFIED="1738715628820" TEXT="Verdrahtung der Vorg&#xe4;nger-Ports verifizieren">
<linktarget COLOR="#01aad1" DESTINATION="ID_1424762602" ENDARROW="Default" ENDINCLINATION="-405;24;" ID="Arrow_ID_329256820" SOURCE="ID_1980325374" STARTARROW="None" STARTINCLINATION="-202;0;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1736267134171" ID="ID_145839768" MODIFIED="1736267142436" TEXT="watch(Port)">
<node CREATED="1736267174444" ID="ID_1548126776" MODIFIED="1738691264629" TEXT="&#xbb;backdoor&#xab; &#x27f6; srcPorts()"/>
<node CREATED="1736267024072" ID="ID_1514661165" MODIFIED="1736605602244" TEXT="verify_connected(input#, Port&amp;)">
<node CREATED="1736267024072" ID="ID_1514661165" MODIFIED="1738708982922" TEXT="verify_connected(input#, Port&amp;)">
<linktarget COLOR="#fdf9be" DESTINATION="ID_1514661165" ENDARROW="Default" ENDINCLINATION="-451;40;" ID="Arrow_ID_1746815334" SOURCE="ID_1677497952" STARTARROW="None" STARTINCLINATION="-358;-43;"/>
<linktarget COLOR="#ffe4bc" DESTINATION="ID_1514661165" ENDARROW="Default" ENDINCLINATION="148;-7;" ID="Arrow_ID_792010004" SOURCE="ID_1401668777" STARTARROW="None" STARTINCLINATION="73;18;"/>
<linktarget COLOR="#ffe4bc" DESTINATION="ID_1514661165" ENDARROW="None" ENDINCLINATION="148;-7;" ID="Arrow_ID_792010004" SOURCE="ID_1401668777" STARTARROW="Default" STARTINCLINATION="73;18;"/>
</node>
</node>
</node>
@ -102317,11 +102372,15 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1732762778889" ID="ID_379286769" MODIFIED="1732762802542" TEXT="das zwingt mich nun, &#xfc;ber den n&#xe4;chsten Level nachzudenken">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1732762847907" ID="ID_321407774" MODIFIED="1732762856074" TEXT="was f&#xfc;r eine Spec wird gebraucht?">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1732762847907" ID="ID_321407774" MODIFIED="1738720625532" TEXT="was f&#xfc;r eine Spec wird gebraucht?">
<icon BUILTIN="help"/>
<node CREATED="1732762860392" ID="ID_1124313267" MODIFIED="1732762883705" TEXT="erst mal: eine &#xbb;semantische Identit&#xe4;t der Funktion&#xab;">
<node COLOR="#435e98" CREATED="1732762860392" ID="ID_1124313267" MODIFIED="1738720620900" TEXT="erst mal: eine &#xbb;semantische Identit&#xe4;t der Funktion&#xab;">
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1738720592352" ID="ID_969223730" MODIFIED="1738720617902" TEXT="diese Spec wird sp&#xe4;ter aus Layer-3 generiert">
<icon BUILTIN="info"/>
<icon BUILTIN="hourglass"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1732762887780" ID="ID_1061271359" MODIFIED="1732762948258">
<richcontent TYPE="NODE"><html>
<head/>
@ -102450,17 +102509,17 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1728785867907" ID="ID_394739045" MODIFIED="1730682037506" TEXT="Spec generieren">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1728785867907" ID="ID_394739045" MODIFIED="1738720435462" TEXT="Spec generieren">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1728785876033" ID="ID_424140873" MODIFIED="1730774363553" TEXT="Name der Funktion">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1728785882504" ID="ID_607531791" MODIFIED="1730682058719" TEXT="Spec aus dem Turnout">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1729986405645" ID="ID_1710935234" LINK="#ID_355149059" MODIFIED="1732847806724" TEXT="Spec der umschlie&#xdf;enden ProcNode">
<node COLOR="#338800" CREATED="1729986405645" ID="ID_1710935234" LINK="#ID_355149059" MODIFIED="1738720433271" TEXT="Spec der umschlie&#xdf;enden ProcNode">
<arrowlink COLOR="#666a8d" DESTINATION="ID_1032840307" ENDARROW="Default" ENDINCLINATION="312;27;" ID="Arrow_ID_1338984517" STARTARROW="None" STARTINCLINATION="158;-13;"/>
<icon BUILTIN="pencil"/>
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#c8c0b6" CREATED="1730762304054" HGAP="25" ID="ID_1617701375" MODIFIED="1730774167902" VSHIFT="10">
<richcontent TYPE="NODE"><html>
<head/>
@ -102577,14 +102636,15 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node CREATED="1730774260378" ID="ID_1141098746" MODIFIED="1730774271710" TEXT="und erst auf diesen getSrcSpec() anwenden"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1730774330224" ID="ID_1021456970" MODIFIED="1730774355189" TEXT="mit komplexem Node-Tree testen">
<icon BUILTIN="bell"/>
<node COLOR="#338800" CREATED="1730774330224" ID="ID_1021456970" LINK="#ID_1359525383" MODIFIED="1738720522948" TEXT="mit komplexem Node-Tree testen">
<linktarget COLOR="#407485" DESTINATION="ID_1021456970" ENDARROW="Default" ENDINCLINATION="174;12;" ID="Arrow_ID_995595429" SOURCE="ID_969672769" STARTARROW="None" STARTINCLINATION="135;-6;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1736354939404" HGAP="68" ID="ID_510494185" MODIFIED="1736354976439" TEXT="Identifikationen" VSHIFT="5">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1736354949714" ID="ID_1256484351" MODIFIED="1736354965722" TEXT="AUA! hier tut sich ein gro&#xdf;er Abgrund auf">
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1736354939404" HGAP="68" ID="ID_510494185" MODIFIED="1738720544381" TEXT="Identifikationen" VSHIFT="5">
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#500f69" CREATED="1736354949714" ID="ID_1256484351" MODIFIED="1738720463229" TEXT="AUA! hier tut sich ein gro&#xdf;er Abgrund auf">
<icon BUILTIN="broken-line"/>
</node>
<node CREATED="1736354992116" ID="ID_1351993847" MODIFIED="1736355000632" TEXT="die Node-Identity ist noch einfach">
@ -102601,8 +102661,9 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1736355156534" ID="ID_520548947" MODIFIED="1736355172053" TEXT="das ist gr&#xf6;&#xdf;tenteils eine Aufgabe f&#xfc;r die Zukunft">
<icon BUILTIN="hourglass"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1736355173260" ID="ID_969672769" MODIFIED="1736355183523" TEXT="brauche aber JETZT bereits einen Platzhalter">
<icon BUILTIN="flag-pink"/>
<node COLOR="#338800" CREATED="1736355173260" ID="ID_969672769" MODIFIED="1738720522948" TEXT="brauche aber JETZT bereits einen Platzhalter">
<arrowlink COLOR="#407485" DESTINATION="ID_1021456970" ENDARROW="Default" ENDINCLINATION="174;12;" ID="Arrow_ID_995595429" STARTARROW="None" STARTINCLINATION="135;-6;"/>
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1736355185418" ID="ID_1036010265" MODIFIED="1736355223889" TEXT="Zugang durch das Port-Interface">
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
@ -102653,7 +102714,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node COLOR="#5b280f" CREATED="1736367551046" ID="ID_617599358" MODIFIED="1736367560237" TEXT="kein neues API notwendig">
<icon BUILTIN="button_cancel"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1736367561469" ID="ID_622372104" MODIFIED="1736367579365" TEXT="nur Dekoration">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1736367561469" ID="ID_622372104" MODIFIED="1738720531574" TEXT="nur Dekoration">
<icon BUILTIN="ksmiletris"/>
</node>
</node>
@ -102685,23 +102746,24 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1736262408883" HGAP="59" ID="ID_1980325374" MODIFIED="1736262722331" TEXT="wie kann die korrekte Verdrahtung gepr&#xfc;ft werden?" VSHIFT="96">
<arrowlink COLOR="#d10172" DESTINATION="ID_1540010113" ENDARROW="Default" ENDINCLINATION="-473;38;" ID="Arrow_ID_1593223212" STARTARROW="None" STARTINCLINATION="-242;0;"/>
<arrowlink COLOR="#d10172" DESTINATION="ID_1424762602" ENDARROW="Default" ENDINCLINATION="-390;24;" ID="Arrow_ID_329256820" STARTARROW="None" STARTINCLINATION="-202;0;"/>
<linktarget COLOR="#f43058" DESTINATION="ID_1980325374" ENDARROW="Default" ENDINCLINATION="208;11;" ID="Arrow_ID_777099443" SOURCE="ID_527618200" STARTARROW="None" STARTINCLINATION="484;-30;"/>
<node COLOR="#435e98" CREATED="1736262408883" HGAP="59" ID="ID_1980325374" MODIFIED="1738720078594" TEXT="wie kann die korrekte Verdrahtung gepr&#xfc;ft werden?" VSHIFT="96">
<arrowlink COLOR="#01aad1" DESTINATION="ID_1424762602" ENDARROW="Default" ENDINCLINATION="-405;24;" ID="Arrow_ID_329256820" STARTARROW="None" STARTINCLINATION="-202;0;"/>
<arrowlink COLOR="#01a9d1" DESTINATION="ID_1540010113" ENDARROW="Default" ENDINCLINATION="-477;37;" ID="Arrow_ID_1593223212" STARTARROW="None" STARTINCLINATION="-242;0;"/>
<linktarget COLOR="#307df4" DESTINATION="ID_1980325374" ENDARROW="Default" ENDINCLINATION="208;11;" ID="Arrow_ID_777099443" SOURCE="ID_527618200" STARTARROW="None" STARTINCLINATION="484;-30;"/>
<icon BUILTIN="help"/>
<node CREATED="1736262992245" ID="ID_1123908204" MODIFIED="1736262999772" TEXT="das zerf&#xe4;llt in zwei Teilaufgaben">
<node CREATED="1736263008731" ID="ID_622547813" MODIFIED="1736263832709" TEXT="ein Verbindungs-Ziel identifizieren">
<node CREATED="1736263027328" ID="ID_346081728" MODIFIED="1736263046449" TEXT="k&#xf6;nnte im Allgemeinen schwierig werden"/>
<node CREATED="1736263048051" ID="ID_1213127179" MODIFIED="1736263061378" TEXT="w&#xfc;rde vmtl. auf eine Node-Hash-ID aufbauen"/>
<node CREATED="1736263062443" ID="ID_1652250195" MODIFIED="1736263070643" TEXT="ist hier aber einfach...">
<node CREATED="1736263062443" ID="ID_1652250195" MODIFIED="1738720108278" TEXT="ist hier aber einfach...">
<icon BUILTIN="forward"/>
<node CREATED="1736263072178" ID="ID_1730228692" MODIFIED="1736263086300" TEXT="wir pr&#xfc;fen gegen ein festes, erwartetes Layout"/>
<node CREATED="1736263087344" ID="ID_89447455" MODIFIED="1736263104925" TEXT="wir haben die Nodes direkt per Referenz greifbar"/>
</node>
</node>
<node CREATED="1736263001244" ID="ID_471515867" MODIFIED="1736263007599" TEXT="an die Verbindungen rankommen">
<node CREATED="1736263233426" ID="ID_1812769389" MODIFIED="1736263590009" TEXT="f&#xfc;r Nodes gibt es einen Testzugang &#x27f6; lib::Several&lt;NodeRef&gt;"/>
<node CREATED="1736263835188" ID="ID_12001050" MODIFIED="1736263857098" TEXT="f&#xfc;r Ports wird&apos;s schwierig &#x2014; da nicht Gegenstand des Interfaces">
<node CREATED="1736263835188" FOLDED="true" ID="ID_12001050" MODIFIED="1736263857098" TEXT="f&#xfc;r Ports wird&apos;s schwierig &#x2014; da nicht Gegenstand des Interfaces">
<node CREATED="1736263885677" ID="ID_532265632" MODIFIED="1736263906342" TEXT="tritt nur in einem bestimmten WeavingPattern auf"/>
<node CREATED="1736263907378" ID="ID_490139134" MODIFIED="1736263918636" TEXT="...das zwar der Default ist &#x2014; umso schlimmer!"/>
<node CREATED="1736263942477" ID="ID_386851830" MODIFIED="1736266396047" TEXT="die hierf&#xfc;r relevante Node-Info ist weggeworfen worden">
@ -102718,12 +102780,12 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</html></richcontent>
</node>
</node>
<node CREATED="1736266569293" ID="ID_1677497952" MODIFIED="1736605602244" TEXT="Idee: verify-connected-to">
<node BACKGROUND_COLOR="#d8d2b6" COLOR="#435e98" CREATED="1736266569293" FOLDED="true" ID="ID_1677497952" MODIFIED="1738720416652" TEXT="Idee: verify-connected-to">
<arrowlink COLOR="#fdf9be" DESTINATION="ID_1514661165" ENDARROW="Default" ENDINCLINATION="-451;40;" ID="Arrow_ID_1746815334" STARTARROW="None" STARTINCLINATION="-358;-43;"/>
<icon BUILTIN="idea"/>
<node CREATED="1736266601561" ID="ID_1764393519" MODIFIED="1736266615731" TEXT="sollte als ein Test-Tool bereitgestellt werden"/>
<node COLOR="#435e98" CREATED="1736266726272" ID="ID_1019914793" MODIFIED="1738645109330" TEXT="brauche daf&#xfc;r eine Erweiterung des Port-API">
<arrowlink COLOR="#4431d1" DESTINATION="ID_817734322" ENDARROW="Default" ENDINCLINATION="-13;-173;" ID="Arrow_ID_507508399" STARTARROW="None" STARTINCLINATION="33;335;"/>
<node COLOR="#435e98" CREATED="1736266726272" ID="ID_1019914793" MODIFIED="1738720043597" TEXT="brauche daf&#xfc;r eine Erweiterung des Port-API">
<arrowlink COLOR="#4431d1" DESTINATION="ID_817734322" ENDARROW="Default" ENDINCLINATION="-84;-4;" ID="Arrow_ID_507508399" STARTARROW="None" STARTINCLINATION="-57;114;"/>
<icon BUILTIN="yes"/>
<node COLOR="#338800" CREATED="1736266763928" ID="ID_1486436213" MODIFIED="1738644857327" TEXT="getInput(n) &#x27fc; optional&lt;PortRef&gt;">
<linktarget COLOR="#294fe5" DESTINATION="ID_1486436213" ENDARROW="Default" ENDINCLINATION="-752;56;" ID="Arrow_ID_351949496" SOURCE="ID_1002392068" STARTARROW="None" STARTINCLINATION="-733;0;"/>
@ -102771,8 +102833,9 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<arrowlink COLOR="#63707f" DESTINATION="ID_1883362448" ENDARROW="Default" ENDINCLINATION="340;36;" ID="Arrow_ID_1842367707" STARTARROW="Default" STARTINCLINATION="-162;-10;"/>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1736388200280" ID="ID_1983872321" MODIFIED="1736388234147" TEXT="m&#xf6;glicherweise k&#xf6;nnte man so ein breites Port-Interface vermeiden">
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1736388200280" FOLDED="true" ID="ID_1983872321" MODIFIED="1738720048573" TEXT="m&#xf6;glicherweise k&#xf6;nnte man so ein breites Port-Interface vermeiden">
<icon BUILTIN="idea"/>
<icon BUILTIN="hourglass"/>
<node CREATED="1736388236945" ID="ID_1937036501" MODIFIED="1736388974009" TEXT="Erl&#xe4;uterung: weitere virtuelle Funktionen auf dem Port-Interface sind gef&#xe4;hrlich">
<richcontent TYPE="NOTE"><html>
<head/>
@ -102839,8 +102902,8 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d9e098" COLOR="#000699" CREATED="1736391341912" ID="ID_817734322" MODIFIED="1738645182607" TEXT="Analyse: was f&#xfc;r Varianten w&#xfc;rden denn gebraucht">
<linktarget COLOR="#4431d1" DESTINATION="ID_817734322" ENDARROW="Default" ENDINCLINATION="-13;-173;" ID="Arrow_ID_507508399" SOURCE="ID_1019914793" STARTARROW="None" STARTINCLINATION="33;335;"/>
<node BACKGROUND_COLOR="#d9e098" COLOR="#000699" CREATED="1736391341912" FOLDED="true" ID="ID_817734322" MODIFIED="1738645182607" TEXT="Analyse: was f&#xfc;r Varianten w&#xfc;rden denn gebraucht">
<linktarget COLOR="#4431d1" DESTINATION="ID_817734322" ENDARROW="Default" ENDINCLINATION="-84;-4;" ID="Arrow_ID_507508399" SOURCE="ID_1019914793" STARTARROW="None" STARTINCLINATION="-57;114;"/>
<icon BUILTIN="info"/>
<node CREATED="1736433458484" ID="ID_196820134" MODIFIED="1736433468453" TEXT="ID-Anteile">
<node COLOR="#435e98" CREATED="1736433469774" ID="ID_1116337144" MODIFIED="1736605160936" TEXT="procName"/>
@ -102989,8 +103052,8 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1736445851042" ID="ID_338610694" MODIFIED="1738645211452" TEXT="Implementierung">
<arrowlink COLOR="#a90b08" DESTINATION="ID_968052606" ENDARROW="Default" ENDINCLINATION="-139;-705;" ID="Arrow_ID_1420066310" STARTARROW="None" STARTINCLINATION="-1107;159;"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1736445851042" ID="ID_338610694" MODIFIED="1738719988441" TEXT="Implementierung">
<arrowlink COLOR="#3808a9" DESTINATION="ID_968052606" ENDARROW="Default" ENDINCLINATION="-139;-705;" ID="Arrow_ID_1420066310" STARTARROW="None" STARTINCLINATION="-1107;159;"/>
<icon BUILTIN="hourglass"/>
<node COLOR="#338800" CREATED="1738645213947" ID="ID_222416249" MODIFIED="1738645268817" TEXT="Strukturen angelegt">
<font NAME="SansSerif" SIZE="10"/>
@ -103249,8 +103312,8 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node COLOR="#338800" CREATED="1736262594933" ID="ID_891914799" MODIFIED="1736262738364" TEXT="mit Builder-Termen definieren">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1736262614480" ID="ID_527618200" MODIFIED="1736262735092" TEXT="generierte Verschaltung pr&#xfc;fen">
<arrowlink COLOR="#f43058" DESTINATION="ID_1980325374" ENDARROW="Default" ENDINCLINATION="208;11;" ID="Arrow_ID_777099443" STARTARROW="None" STARTINCLINATION="484;-30;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1736262614480" ID="ID_527618200" MODIFIED="1738720089863" TEXT="generierte Verschaltung pr&#xfc;fen">
<arrowlink COLOR="#307df4" DESTINATION="ID_1980325374" ENDARROW="Default" ENDINCLINATION="208;11;" ID="Arrow_ID_777099443" STARTARROW="None" STARTINCLINATION="484;-30;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node COLOR="#5b280f" CREATED="1736262643100" ID="ID_1582622115" MODIFIED="1736262671755" TEXT="Aufruf wird erst im n&#xe4;chsten Beispiel getestet....">
@ -104934,10 +104997,11 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</body>
</html></richcontent>
<linktarget COLOR="#ff461d" DESTINATION="ID_518441567" ENDARROW="Default" ENDINCLINATION="475;-655;" ID="Arrow_ID_743151366" SOURCE="ID_1999491710" STARTARROW="None" STARTINCLINATION="197;254;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1738618246550" ID="ID_480339842" MODIFIED="1738618616535" TEXT="Cache-Key braucht feste und bewegliche Elemente">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1738618246550" ID="ID_480339842" MODIFIED="1738719923738" TEXT="Cache-Key braucht feste und bewegliche Elemente">
<arrowlink COLOR="#952535" DESTINATION="ID_951843735" ENDARROW="Default" ENDINCLINATION="-118;-596;" ID="Arrow_ID_1126783803" STARTARROW="None" STARTINCLINATION="296;16;"/>
<linktarget COLOR="#783a50" DESTINATION="ID_480339842" ENDARROW="Default" ENDINCLINATION="341;-17;" ID="Arrow_ID_1543965957" SOURCE="ID_1541754433" STARTARROW="None" STARTINCLINATION="-621;37;"/>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="yes"/>
<icon BUILTIN="hourglass"/>
</node>
</node>
<node CREATED="1730497062384" ID="ID_1375039507" MODIFIED="1730497334994" TEXT="gebraucht wird: eine stabile und lesbare Notation f&#xfc;r Test und Diagnose">
@ -104977,8 +105041,8 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1730487601562" ID="ID_1132202867" MODIFIED="1730487611994" TEXT="ID-Records">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1730487601562" ID="ID_1132202867" MODIFIED="1738719934584" TEXT="ID-Records">
<icon BUILTIN="button_ok"/>
<node CREATED="1730487688726" ID="ID_355149059" MODIFIED="1730487823126" TEXT="Node ist markiert mit...">
<linktarget COLOR="#708298" DESTINATION="ID_355149059" ENDARROW="Default" ENDINCLINATION="-295;886;" ID="Arrow_ID_1310337579" SOURCE="ID_1784608228" STARTARROW="None" STARTINCLINATION="655;34;"/>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1730487849688" ID="ID_775932850" MODIFIED="1730488237937" TEXT="...rein dem strukturellen Anteil">
@ -105146,7 +105210,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
<node BACKGROUND_COLOR="#ece6a4" COLOR="#690f14" CREATED="1738620081716" ID="ID_1555844568" MODIFIED="1738620127887" TEXT="Design">
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1730508735166" ID="ID_1955634373" MODIFIED="1730509071058" TEXT="generell: auf ein Getter-API setzen">
<node COLOR="#435e98" CREATED="1730508735166" ID="ID_1955634373" MODIFIED="1738719857724" TEXT="generell: auf ein Getter-API setzen">
<icon BUILTIN="yes"/>
<node CREATED="1730508758773" ID="ID_1040159044" MODIFIED="1730508787495" TEXT="bedeutet: komplett abstrahieren von der Berechnung und Storage"/>
<node CREATED="1730508788860" ID="ID_423678075" MODIFIED="1730509061121" TEXT="vermutlich wird das sp&#xe4;ter sogar komplett von den Daten im Node-Graphen getrennt">
@ -105210,11 +105274,11 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1730510962225" ID="ID_786613770" MODIFIED="1738288973161" TEXT="Metadaten-Zugriff / API">
<node BACKGROUND_COLOR="#c4cfad" COLOR="#1f5570" CREATED="1730510962225" ID="ID_786613770" MODIFIED="1738719971199" TEXT="Metadaten-Zugriff / API">
<arrowlink COLOR="#4416dc" DESTINATION="ID_1600745522" ENDARROW="Default" ENDINCLINATION="-224;60;" ID="Arrow_ID_1199285145" STARTARROW="None" STARTINCLINATION="183;0;"/>
<linktarget COLOR="#34417f" DESTINATION="ID_786613770" ENDARROW="Default" ENDINCLINATION="-278;-1402;" ID="Arrow_ID_1689861408" SOURCE="ID_1257287659" STARTARROW="None" STARTINCLINATION="-284;14;"/>
<icon BUILTIN="help"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1730510982342" ID="ID_310976542" MODIFIED="1730510998830" TEXT="Struktur/Modell">
<node BACKGROUND_COLOR="#cacae7" COLOR="#435e98" CREATED="1730510982342" ID="ID_310976542" MODIFIED="1738719881983" TEXT="Struktur/Modell">
<icon BUILTIN="info"/>
<node CREATED="1730511009387" ID="ID_420452584" MODIFIED="1730511031996" TEXT="m&#xf6;gliche Ans&#xe4;tze....">
<node CREATED="1730511036658" ID="ID_1206895083" MODIFIED="1730511110408" TEXT="auf ProcNode und auf Port-API">
@ -105264,8 +105328,8 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</html></richcontent>
<icon BUILTIN="smiley-oh"/>
</node>
<node CREATED="1730598198960" ID="ID_1268799308" MODIFIED="1730598217841" TEXT="&#x27f9; halbwegs sinnvolle Aufrufstruktur">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1730598219853" ID="ID_241387326" MODIFIED="1730733979784" TEXT="ProcID &#x2259; separater Metadaten-Record">
<node COLOR="#435e98" CREATED="1730598198960" ID="ID_1268799308" MODIFIED="1738719827585" TEXT="&#x27f9; halbwegs sinnvolle Aufrufstruktur">
<node BACKGROUND_COLOR="#e8e7a0" COLOR="#610099" CREATED="1730598219853" ID="ID_241387326" MODIFIED="1738719812049" TEXT="ProcID &#x2259; separater Metadaten-Record">
<linktarget COLOR="#fbfeda" DESTINATION="ID_241387326" ENDARROW="Default" ENDINCLINATION="-379;-27;" ID="Arrow_ID_1982618460" SOURCE="ID_423678075" STARTARROW="None" STARTINCLINATION="-161;5;"/>
<icon BUILTIN="idea"/>
<node CREATED="1730598396950" ID="ID_1069190015" MODIFIED="1730598409561" TEXT="soll nur die semantisch relevanten Infos enthalten"/>
@ -105303,8 +105367,8 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1730598425648" ID="ID_1880777702" MODIFIED="1730598433445" TEXT="jedwede Connectivity wird errechnet">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1730598425648" ID="ID_1880777702" MODIFIED="1738719786857" TEXT="jedwede Connectivity wird errechnet">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1730598253584" ID="ID_763084379" MODIFIED="1730685954764" TEXT="wird in einer Registry abgelegt">
@ -105367,8 +105431,8 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<icon BUILTIN="yes"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1730598439357" ID="ID_1991416239" MODIFIED="1730598480466" TEXT="Deskriptoren und Hash-Keys jeweils generieren">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1730598439357" FOLDED="true" ID="ID_1991416239" MODIFIED="1738719844855" TEXT="Deskriptoren und Hash-Keys jeweils generieren">
<icon BUILTIN="hourglass"/>
<node CREATED="1730598456797" ID="ID_1189534095" MODIFIED="1730598466247" TEXT="aus den hinterlegten semantischen Infos">
<node COLOR="#338800" CREATED="1730685985639" ID="ID_1668280746" MODIFIED="1730686128081" TEXT="die Proc-Spec f&#xfc;r den Turnout">
<richcontent TYPE="NOTE"><html>
@ -105394,7 +105458,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node CREATED="1730598486057" ID="ID_75268371" MODIFIED="1730598499661" TEXT="wird als direkte Referenz in das Port-Interface gelegt">
<node COLOR="#435e98" CREATED="1730598486057" ID="ID_75268371" MODIFIED="1738719827585" TEXT="wird als direkte Referenz in das Port-Interface gelegt">
<icon BUILTIN="idea"/>
<node COLOR="#435e98" CREATED="1730598503327" ID="ID_972746982" MODIFIED="1738695915222" TEXT="damit kein Code-Bloat m&#xf6;glich">
<icon BUILTIN="idea"/>
@ -105954,7 +106018,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1736445926470" ID="ID_968052606" MODIFIED="1738641825863" TEXT="Extended-Attributes / Zusatz-Qualifikator">
<linktarget COLOR="#a90b08" DESTINATION="ID_968052606" ENDARROW="Default" ENDINCLINATION="-139;-705;" ID="Arrow_ID_1420066310" SOURCE="ID_338610694" STARTARROW="None" STARTINCLINATION="-1107;159;"/>
<linktarget COLOR="#3808a9" DESTINATION="ID_968052606" ENDARROW="Default" ENDINCLINATION="-139;-705;" ID="Arrow_ID_1420066310" SOURCE="ID_338610694" STARTARROW="None" STARTINCLINATION="-1107;159;"/>
<icon BUILTIN="hourglass"/>
<icon BUILTIN="pencil"/>
<icon BUILTIN="button_ok"/>
@ -106388,9 +106452,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
<node CREATED="1738627937171" ID="ID_1252593350" MODIFIED="1738628206140" TEXT="und das wird dann ziemlich ekelhaft">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
ich glaube nicht, da&#223; es sinnvoll ist, eine Attribut-Map als Ganzes zu de-duplizieren. Empirisch entscheiden k&#246;nnen wir das aber leider erst viel sp&#228;ter. Ja aber, was machen wir dann blo&#223;? Wenn-w&#228;re-h&#228;tte?? Die Node-Storage <b>mu&#223; unbedingt</b>&#160;klein gehalten werden. Kann aber derzeit &#252;berhaupt nicht entscheiden, ob die Vorraussetzungen f&#252;r eine <i>persistente Datenstruktur</i>&#160;(im Sinne der funktionalen Programmierung) gegeben sind....
@ -106416,8 +106478,8 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node CREATED="1736454444496" ID="ID_1712779274" MODIFIED="1738641786651" TEXT="Korrektheit">
<arrowlink COLOR="#ce3644" DESTINATION="ID_1160836625" ENDARROW="Default" ENDINCLINATION="75;-69;" ID="Arrow_ID_298743045" STARTARROW="None" STARTINCLINATION="-76;15;"/>
<node CREATED="1736454444496" ID="ID_1712779274" MODIFIED="1738719771532" TEXT="Korrektheit">
<arrowlink COLOR="#3682c0" DESTINATION="ID_1160836625" ENDARROW="Default" ENDINCLINATION="75;-69;" ID="Arrow_ID_298743045" STARTARROW="None" STARTINCLINATION="-76;15;"/>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1736454504668" ID="ID_1002392068" MODIFIED="1738644857327">
@ -106484,10 +106546,10 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1736454082544" ID="ID_1160836625" MODIFIED="1738518258829" TEXT="Test f&#xfc;r Metadaten-Verwaltung">
<arrowlink COLOR="#5387dc" DESTINATION="ID_15277358" ENDARROW="Default" ENDINCLINATION="-1313;202;" ID="Arrow_ID_1843979731" STARTARROW="None" STARTINCLINATION="-1286;110;"/>
<linktarget COLOR="#ce3644" DESTINATION="ID_1160836625" ENDARROW="Default" ENDINCLINATION="75;-69;" ID="Arrow_ID_298743045" SOURCE="ID_1712779274" STARTARROW="None" STARTINCLINATION="-76;15;"/>
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1736454082544" ID="ID_1160836625" MODIFIED="1738719760951" TEXT="Test f&#xfc;r Metadaten-Verwaltung">
<arrowlink COLOR="#5387dc" DESTINATION="ID_15277358" ENDARROW="Default" ENDINCLINATION="-1314;184;" ID="Arrow_ID_1843979731" STARTARROW="None" STARTINCLINATION="-1286;110;"/>
<linktarget COLOR="#3682c0" DESTINATION="ID_1160836625" ENDARROW="Default" ENDINCLINATION="75;-69;" ID="Arrow_ID_298743045" SOURCE="ID_1712779274" STARTARROW="None" STARTINCLINATION="-76;15;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1736610754727" ID="ID_575487435" LINK="#ID_25381362" MODIFIED="1738518268810" TEXT="Grobstruktur zerlegen">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1736629324669" ID="ID_127221331" MODIFIED="1736629345486" TEXT="f&#xfc;hre noch Trennund in Node-Domain und Symbol ein">
@ -106502,8 +106564,9 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1738518284585" ID="ID_87127284" MODIFIED="1738518301786" TEXT="Fehlt noch: Qualifier aufgreifen">
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1738518284585" ID="ID_87127284" MODIFIED="1738719749739" TEXT="Fehlt noch: Qualifier aufgreifen">
<icon BUILTIN="bell"/>
<icon BUILTIN="hourglass"/>
</node>
</node>
<node COLOR="#338800" CREATED="1736610781361" ID="ID_1231919908" LINK="#ID_25381362" MODIFIED="1738518231270" TEXT="Argument-Listen parsen">
@ -106521,9 +106584,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<icon BUILTIN="hourglass"/>
<node COLOR="#435e98" CREATED="1738695743450" ID="ID_1968117372" LINK="#ID_1885873000" MODIFIED="1738695847168" TEXT="vorerst vertagt...">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...wird eigentlich erst f&#252;r die Hash / Cache-Key-Berechnung relevant; <i>dann aber</i>&#160;w&#228;ren erst einige kniffelige technische Probleme zu l&#246;sen, die ich im Moment nicht recht bestimmen kann...
@ -106533,16 +106594,21 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<font NAME="SansSerif" SIZE="11"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1736610803062" ID="ID_1920110927" LINK="#ID_238141567" MODIFIED="1736611024746" TEXT="Node connectivity">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1738696062413" ID="ID_1426452060" MODIFIED="1738696649951" TEXT="Verifikations-DSL aufbauen">
<arrowlink COLOR="#377ccf" DESTINATION="ID_782732599" ENDARROW="Default" ENDINCLINATION="118;225;" ID="Arrow_ID_1337974921" STARTARROW="None" STARTINCLINATION="259;25;"/>
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1736610803062" ID="ID_1920110927" LINK="#ID_238141567" MODIFIED="1738719715743" TEXT="Node connectivity">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1738696062413" ID="ID_1426452060" MODIFIED="1738715860679" TEXT="Verifikations-DSL aufbauen">
<arrowlink COLOR="#377ccf" DESTINATION="ID_782732599" ENDARROW="Default" ENDINCLINATION="171;440;" ID="Arrow_ID_1337974921" STARTARROW="None" STARTINCLINATION="259;25;"/>
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1738696070912" ID="ID_553062903" MODIFIED="1738696077767" TEXT="im Test-Beispiel verifiziert"/>
<node COLOR="#338800" CREATED="1738696070912" ID="ID_553062903" MODIFIED="1738719631692" TEXT="im Test-Beispiel verifiziert">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1738719634341" ID="ID_1359525383" MODIFIED="1738719665806" TEXT="3-Node-Chain mit einer Mix-Node als Ausgang"/>
<node COLOR="#435e98" CREATED="1738719646257" ID="ID_679842838" MODIFIED="1738719665806" TEXT="extensiv alle logisch m&#xf6;glichen Kombinationen ausformuliert"/>
<node COLOR="#435e98" CREATED="1738719723607" ID="ID_1685178725" MODIFIED="1738719741876" TEXT="auch high-level-Verbindungen zwischen Nodes"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1736610811589" ID="ID_745350162" LINK="#ID_238141567" MODIFIED="1738696045880" TEXT="Port connectivity">
<icon BUILTIN="pencil"/>
</node>
<node COLOR="#338800" CREATED="1736610811589" ID="ID_745350162" LINK="#ID_238141567" MODIFIED="1738719719089" TEXT="Port connectivity">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1738561050694" ID="ID_480573349" MODIFIED="1738561636218" TEXT="Zugriff via &#xbb;Backdoor&#xab; auf die Predecessor-Ports">
<arrowlink COLOR="#587793" DESTINATION="ID_866197683" ENDARROW="Default" ENDINCLINATION="140;240;" ID="Arrow_ID_1588669375" STARTARROW="None" STARTINCLINATION="462;-13;"/>
<icon BUILTIN="button_ok"/>
@ -107242,8 +107308,9 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1733525978260" ID="ID_15277358" MODIFIED="1736454430847" TEXT="NodeMeta_test">
<linktarget COLOR="#5387dc" DESTINATION="ID_15277358" ENDARROW="Default" ENDINCLINATION="-1313;202;" ID="Arrow_ID_1843979731" SOURCE="ID_1160836625" STARTARROW="None" STARTINCLINATION="-1286;110;"/>
<node COLOR="#338800" CREATED="1733525978260" ID="ID_15277358" MODIFIED="1738719609617" TEXT="NodeMeta_test">
<linktarget COLOR="#5387dc" DESTINATION="ID_15277358" ENDARROW="Default" ENDINCLINATION="-1314;184;" ID="Arrow_ID_1843979731" SOURCE="ID_1160836625" STARTARROW="None" STARTINCLINATION="-1286;110;"/>
<icon BUILTIN="button_ok"/>
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1736611061150" ID="ID_64541698" MODIFIED="1736611092737" TEXT="Abzudecken...">
<icon BUILTIN="yes"/>
@ -107262,8 +107329,8 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<icon BUILTIN="hourglass"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1736610744078" ID="ID_25381362" MODIFIED="1736629424535" TEXT="verify_ID_specification">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1736610744078" ID="ID_25381362" MODIFIED="1738719595883" TEXT="verify_ID_specification">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1736610824003" ID="ID_1668456426" LINK="#ID_575487435" MODIFIED="1738518218666" TEXT="Definition einer ProcID">
<icon BUILTIN="button_ok"/>
</node>
@ -107274,16 +107341,19 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<icon BUILTIN="hourglass"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1736610750940" ID="ID_238141567" MODIFIED="1736611008867" TEXT="verify_ID_properties">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1736610859183" ID="ID_1146666158" MODIFIED="1736611020835" TEXT="Node-Connectivity aufbauen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1736610750940" ID="ID_238141567" MODIFIED="1738719597715" TEXT="verify_ID_connectivity">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1736610859183" ID="ID_1146666158" MODIFIED="1738719592813" TEXT="Node-Connectivity aufbauen">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1736610894914" ID="ID_1506981856" MODIFIED="1736611020834" TEXT="explizit gegebene Specs verifizieren">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1736610894914" ID="ID_1506981856" MODIFIED="1738719591041" TEXT="explizit gegebene Specs verifizieren">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1736610903513" ID="ID_479704860" LINK="#ID_745350162" MODIFIED="1736611020834" TEXT="durch ProcID zug&#xe4;ngliche Connectivity">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1736610903513" ID="ID_479704860" LINK="#ID_745350162" MODIFIED="1738719588153" TEXT="durch ProcID zug&#xe4;ngliche Connectivity">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1738715801834" ID="ID_397959020" LINK="#ID_553062903" MODIFIED="1738719690211" TEXT="Verifikations-DSL zum expliziten detaillierten Pr&#xfc;fen">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>