Invocation: develop more complex text data manipulations

The overall goal is eventually to arrive at something akin to a ''»Dummy Media-processing Library«''
 * this will offer some „Functionality“
 * it will work on different ''kinds'' or ''flavours'' of data
 * it should provide operations that can be packaged into ''Nodes''

However — at the moment I have no clue how to get there...
And thus I'll start out with some rather obvious basic data manipulation functions,
and then try to give them meaningful names and descriptors. This in turn
will allow to build some multi-step processing netwaorks — which actually
is the near-term goal for the ''main effort'' (which is after all, to get
the Render Node code into some sufficient state of completion)...
This commit is contained in:
Fischlurch 2024-11-28 02:15:59 +01:00
parent 3bdb5b9dd6
commit ec0c14e129
6 changed files with 240 additions and 66 deletions

View file

@ -191,7 +191,6 @@ apply functor to each tuple element::
- provided as `lib::meta::forEach` in 'lib/meta/tuple-helper.hpp
- The design of the `DataTable` with CSV-Formatting is based on this technique, see 'lib/stat/data.hpp'
- 'lib/iter-zip.hpp' uses this to construct a tuple-of-iterators
- 'test-rand-ontology.cpp' uses this in `manipulateFrame()` to accept an arbitrary number of input chains
+
unpack iterator into tuple::
Under controlled conditions this is possible (even while it seems like time travel from the runtime into

View file

@ -6,7 +6,7 @@ PLANNED "Proc Node basics" NodeBasic_test <<END
END
PLANNED "Proc Node development" NodeDevel_test <<END
TEST "Proc Node test support" NodeDevel_test <<END
END

View file

@ -24,8 +24,11 @@
#include "lib/random.hpp"
//#include "lib/util.hpp"
#include <vector>
using lib::zip;
using lib::izip;
using std::vector;
namespace steam {
@ -69,6 +72,8 @@ namespace test {
processing_generateFrame();
processing_generateMultichan();
processing_duplicateMultichan();
processing_manipulateMultichan();
processing_manipulateFrame();
processing_combineFrames();
}
@ -87,6 +92,7 @@ namespace test {
generateFrame (buff, frameNr, flavour);
CHECK ( buff->isSane());
CHECK ( buff->isPristine());
CHECK (*buff == TestFrame(frameNr,flavour));
}
@ -102,19 +108,91 @@ namespace test {
uint channels = 1 + rani(50);
CHECK (1 <= channels and channels <= 50);
Buffer buffs[50];
Buffer buff[50];
for (uint i=0; i<channels; ++i)
CHECK (not buffs[i]->isSane());
CHECK (not buff[i]->isSane());
generateMultichan (buffs[0], channels, frameNr, flavour);
generateMultichan (buff[0], channels, frameNr, flavour);
for (uint i=0; i<channels; ++i)
{
CHECK (buffs[i]->isSane());
CHECK (*(buffs[i]) == TestFrame(frameNr,flavour+i));
CHECK (buff[i]->isPristine());
CHECK (*(buff[i]) == TestFrame(frameNr,flavour+i));
}
}
/** @test function to apply a numeric computation to test data frames
/** @test clone copy of multichannel test data */
void
processing_duplicateMultichan()
{
size_t frameNr = defaultGen.u64();
uint flavour = defaultGen.u64();
uint channels = 1 + rani(50);
Buffer srcBuff[50];
generateMultichan (srcBuff[0], channels, frameNr, flavour);
Buffer clone[50];
for (uint i=0; i<channels; ++i)
CHECK (not clone[i]->isSane());
duplicateMultichan (clone[0],srcBuff[0], channels);
for (uint i=0; i<channels; ++i)
{
CHECK (clone[i]->isPristine());
CHECK (*(clone[i]) == *(srcBuff[i]));
}
}
/** @test multichannel data hash-chain manipulation
* - use multichannel pseudo random input data
* - store away a clone copy before manipulation
* - the #manipulateMultichan() operates in-place in the buffers
* - each buffer has been marked with a new checksum afterwards
* - and each buffer now differs from original state
* - verify that corresponding data points over all channels
* have been linked by a hashcode-chain, seeded with the `param`
* and then consecutively hashing in data from each channel.
*/
void
processing_manipulateMultichan()
{
size_t frameNr = defaultGen.u64();
uint flavour = defaultGen.u64();
uint channels = 1 + rani(50);
Buffer buff[50], refData[50];
generateMultichan (buff[0], channels, frameNr, flavour);
// stash away a copy of the test data for verification
duplicateMultichan(refData[0],buff[0], channels);
for (uint c=0; c<channels; ++c)
CHECK (buff[c]->isPristine());
uint64_t param = defaultGen.u64();
manipulateMultichan(buff[0], channels, param);
const uint SIZ = buff[0]->data64().size();
vector<uint64_t> xlink(SIZ, param); // temporary storage for verifying the hash-chain
for (uint c=0; c<channels; ++c)
{
CHECK (buff[c]->isSane()); // checksum matches
CHECK (not buff[c]->isPristine()); // data was indeed changed
CHECK (*(buff[c]) != *(refData[c]));
for (auto& [i, link] : izip(xlink))
{
auto const& refPoint = refData[c]->data64()[i];
lib::hash::combine (link, refPoint);
CHECK (link != refPoint);
CHECK (link == buff[c]->data64()[i]);
}
}
}
/** @test function to apply a numeric computation to test data frames;
* @remark here basically the same hash-chaining is used as for #manipulateMultichan,
* but only one hash-chain per data point is used and output is written to a different buffer.
*/
void
processing_manipulateFrame()

View file

@ -77,6 +77,47 @@ namespace test {
new(buffArry+i) TestFrame{uint(frameNr), flavour+i};
}
/**
* @param chanCnt size of the array of frames to clone
* @param inArry pointer to storage holding a TestFrame[chanCnt]
* @param outArry pointer to allocated storage sufficient to hold a clone copy of these
*/
void
duplicateMultichan (TestFrame* outArry, TestFrame* inArry, uint chanCnt)
{
REQUIRE (inArry);
REQUIRE (outArry);
for (uint i=0; i<chanCnt; ++i)
new(outArry+i) TestFrame{inArry[i]};
}
/**
* @param chanCnt size of the array of frames to manipulate
* @param buffArry pointer to an array of several frames (channels)
* @param param parameter to control or »mark« the data manipulation (hash-combining)
* @remark this function in-place processing of several channels in one step: data is processed
* in 64-bit words, by hash-chaining with \a param and then joining in the data items.
* All data buffers will be manipulated and marked with as valid with a new checksum.
*/
void
manipulateMultichan (TestFrame* buffArry, uint chanCnt, uint64_t param)
{
REQUIRE (buffArry);
const uint SIZ = buffArry->data64().size();
for (uint i=0; i<SIZ; ++i)
{
uint64_t feed{param};
for (uint c=0; c<chanCnt; ++c)
{
auto& data = buffArry[c].data64()[i];
lib::hash::combine(feed, data);
data = feed;
}
}
for (uint c=0; c<chanCnt; ++c)
buffArry[c].markChecksum();
}
/**
* @param out existing allocation to place the generated TestFrame into
* @param in allocation holding the input TestFrame data

View file

@ -40,6 +40,12 @@ namespace test {
/** produce planar multi channel output of random data frames */
void generateMultichan (TestFrame* buffArry, uint chanCnt, size_t frameNr =0, uint flavour =0);
/** create an identical clone copy of the planar multi channel frame array */
void duplicateMultichan (TestFrame* outArry, TestFrame* inArry, uint chanCnt);
/** »process« a planar multi channel array of data frames in-place */
void manipulateMultichan (TestFrame* buffArry, uint chanCnt, uint64_t param);
/** »process« random frame date by hash-chaining with a parameter */
void manipulateFrame (TestFrame* out, TestFrame const* in, uint64_t param);

View file

@ -20093,9 +20093,7 @@
<node CREATED="1666307233042" ID="ID_1411306141" MODIFIED="1666307262873" TEXT="...und w&#xfc;rde dadurch das differenzierte, partielle Verbergen st&#xf6;ren"/>
<node CREATED="1666307264414" ID="ID_594632089" MODIFIED="1666307445275" TEXT="&#x27f9; sollte den tats&#xe4;chlichen visibility-Status wiederherstellen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
nach dem Setzen eines neuen Label-Texts m&#252;ssen wir die L&#228;nge des IDLabel erneut ausmessen, und dazu m&#252;ssen alle seine Komponenten vorr&#252;bergehend visible() gesetzt werden; hatte bisher darauf gesetzt, da&#223; der size-constraint-Algo dann von selber wieder auf den richtigen Status kommt...
@ -20496,9 +20494,7 @@
<node CREATED="1666449028556" ID="ID_1698685222" MODIFIED="1666449045090" TEXT="Koordiniert die Anzeige f&#xfc;r die ganze TimelinePane"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1666449046546" ID="ID_1275285489" MODIFIED="1666449073667" TEXT="(davon kann es aber mehrere geben)">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
also bitte nicht mit statischen Globals arbeiten!
@ -20944,9 +20940,7 @@
</node>
<node CREATED="1575137898463" ID="ID_1536688578" MODIFIED="1575137949950" TEXT="diese werden in TrackBody selber implementiert">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
denn, ohne da&#223; dies nach Au&#223;en sichtbar w&#228;re, ist TrackBody selbst die ViewHookable-Implementierung
@ -21388,9 +21382,7 @@
<node CREATED="1575566591719" ID="ID_159346735" MODIFIED="1575566622379" TEXT="TrackBody -&gt; parent==ViewHook -&gt; Child-TrackBody(=hooked)"/>
<node CREATED="1575566626210" ID="ID_668544074" MODIFIED="1575566899896" TEXT="ist dann aber eigentlich redundant">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
denn wenn alle Methoden auf dem TrackBody liegen, kann man diese auch von au&#223;en direkt aufrufen
@ -22490,9 +22482,7 @@
</node>
<node CREATED="1480123741362" ID="ID_586646895" MODIFIED="1576282358085" TEXT="unsauber, h&#xe4;sslich, ungl&#xfc;cklich">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<ul>
<li>
@ -24060,9 +24050,7 @@
<icon BUILTIN="flag-yellow"/>
<node CREATED="1582930831025" ID="ID_1768705376" MODIFIED="1582930913112" TEXT="hatte einzelne Vorf&#xe4;lle im Testcode zum relativen Clip-Placement">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
wenn man die mark &quot;test&quot;-Nachricht an eine Timeline schickt, die vorher per Population &quot;reingeschossen&quot; wurde, ohne sie jemals im UI anzuzeigen. Das hei&#223;t, im Moment haben wir da <b>definitiv</b>&#160;eine offene Flanke -- allerdings ist das ganze Thema auch bisher ehr ein draft
@ -27442,9 +27430,7 @@
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1677283530663" ID="ID_643259548" MODIFIED="1677284165733">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
die konkrete Aufgabe ist mit FreeCAD elegant<br />&#8212; aber Resultate sind schwer zug&#228;nglich &#8212;
@ -36016,9 +36002,7 @@
<node CREATED="1477343022529" ID="ID_1585028268" MODIFIED="1518487921084" TEXT="owns">
<node CREATED="1477343030104" ID="ID_350881879" MODIFIED="1576282358036" TEXT="gtk::UiManager">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
A Gtk::UIManager constructs a user interface (menus and toolbars) from one or more UI definitions,
@ -39420,9 +39404,7 @@
<icon BUILTIN="messagebox_warning"/>
<node COLOR="#5e4398" CREATED="1621097410434" HGAP="30" ID="ID_222549022" MODIFIED="1621097540645" TEXT="nein: es ist exakt" VSHIFT="-6">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
sobald man globale Screen-Koordinaten f&#252;r die Delta-Berechnung verwendet; der Button <i>klebt jetzt exakt </i>an der Stelle, an der zuerst geklickt wurde
@ -40771,9 +40753,7 @@
</node>
<node CREATED="1667604115641" ID="ID_340228791" MODIFIED="1667604155428">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
mein Anspruch ist, hier eine <b>absolut fehlerfrei</b>&#160;arbeitende Komponente zu schreiben
@ -41541,9 +41521,7 @@
</node>
<node CREATED="1667871761244" ID="ID_550353046" MODIFIED="1667871901718" TEXT="hierzu &#xe4;ndere ich die Spezifikation: auch relatives Zoomen kann nun Canvas erweitern">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
warum auch nicht?
@ -42059,9 +42037,7 @@
</node>
<node CREATED="1668703498792" ID="ID_622549972" MODIFIED="1668703538961">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
Vorsicht: Ergebnis-Faktor kann trotzdem <i><font color="#f41bbc">giftig sein</font></i>
@ -42363,9 +42339,7 @@
</node>
<node COLOR="#435e98" CREATED="1670598462329" ID="ID_1937499858" MODIFIED="1670608058331" TEXT="Einsicht: Problem liegt bei der Umkehrung">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Der Rechenweg ist hier eine &#187;Einbahnstra&#223;e&#171; : durch einen Kniff ist es gelungen die Quatisierung zu berechnen Metrik &#10236; pxWidth. Aber die Umkehrfunktion k&#246;nnen wir nicht berechnen, weil es in der Berechnung zu einem &#220;berlauf kommt. Daher k&#246;nnen wir die Fehler-Korrektur nicht einfach ausrechnen, weil wir nicht einfach von einen Pixel-&#916; auf ein Metrik-&#916; zur&#252;ckrechnen k&#246;nnen
@ -42767,9 +42741,7 @@
<node CREATED="1670684604442" ID="ID_1823756460" MODIFIED="1670684622968" TEXT="dieses Problem habe ich aber sp&#xe4;ter analog zu detox() gel&#xf6;st"/>
<node COLOR="#435e98" CREATED="1670684628318" ID="ID_1042201800" MODIFIED="1670695155347">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
bleibt noch der Belang: die Duration soll hier auf &#181;-Tick <b>aufgerundet</b>&#160; werden
@ -87673,18 +87645,47 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1730830293781" ID="ID_1464679892" MODIFIED="1730850532210" TEXT="Strukturen der TestDomainOntology anlegen">
<arrowlink COLOR="#f01c36" DESTINATION="ID_124715076" ENDARROW="Default" ENDINCLINATION="-1234;-110;" ID="Arrow_ID_1508179375" STARTARROW="None" STARTINCLINATION="1225;76;"/>
<icon BUILTIN="pencil"/>
<node CREATED="1730850551731" ID="ID_569300878" MODIFIED="1730850558012" TEXT="processing functions">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1732762364610" ID="ID_1911911586" MODIFIED="1732762650541" TEXT="schrittweise entwickeln was die &#xbb;Test-Ontology&#xab; eigentlich sein soll">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Ich hab das mit der &#187;Domain-Onology&#171; bisher nur auf einem abstrakt-logischen Level konzipiert &#8212; nach dem &#8222;m&#252;&#223;te so hinhauen&#8220;-Schema. Auf dem Weg bin ich jetzt so weit, da&#223; ich sehe, was f&#252;r elementare Berechnugs-Primitive n&#252;tzlich <i>sein k&#246;nnten. </i>Also implementiert man die mal und sieht dann weiter....
</p>
<p>
&#187;Dann weiter&#171; l&#228;uft darauf hinaus, da&#223; eine &#187;Dummy-Media-Processing-Library&#171; entsteht. Das hei&#223;t, die wird dann auch ihre eigene Beschreibung von Datentypen haben, wie.z.B. Anzahl Kan&#228;le. Aktuell sind das erst mal Parameter f&#252;r TestFrame, aber das w&#252;rde dann l&#228;ngerfristig auf sowas hinauslaufen wie einen StreamType-ImplType.
</p>
<p>
</p>
<p>
Gut m&#246;glich, da&#223; man das &#252;berhaupt erst im <i>n&#228;chsten Vertical-Slice</i>&#160;wird zusammenschalten k&#246;nnen
</p>
</body>
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1730850551731" HGAP="22" ID="ID_569300878" MODIFIED="1732762660137" TEXT="processing functions" VSHIFT="-16">
<node COLOR="#338800" CREATED="1730862521858" ID="ID_1019281023" MODIFIED="1730862530365" TEXT="processing_generateFrame">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1730862527871" ID="ID_1565354242" MODIFIED="1730862531851" TEXT="processing_generateMultichan">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1730862533053" ID="ID_708999522" MODIFIED="1730862564593" TEXT="processing_manipulateFrame">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1732762310414" ID="ID_59781046" MODIFIED="1732762335512" TEXT="processing_duplicateMultichan();">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1730862558806" ID="ID_450962417" MODIFIED="1730862564593" TEXT="processing_combineFrames">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1732762310414" ID="ID_1988986104" MODIFIED="1732762334228" TEXT="processing_manipulateMultichan();">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1732762310415" ID="ID_479327342" MODIFIED="1732762332955" TEXT="processing_combineFrames();">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1730862533053" ID="ID_708999522" MODIFIED="1732762330921" TEXT="processing_manipulateFrame">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1730862558806" ID="ID_450962417" MODIFIED="1732762330920" TEXT="processing_combineFrames">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
@ -93390,7 +93391,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
</node>
</node>
<node CREATED="1728782162715" ID="ID_647461586" MODIFIED="1728783566268" TEXT="Berechnung unabh&#xe4;ngig pro Datenpunkt">
<node COLOR="#435e98" CREATED="1728782162715" ID="ID_647461586" MODIFIED="1732761559831" TEXT="Berechnung unabh&#xe4;ngig pro Datenpunkt">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -93399,14 +93400,14 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<icon BUILTIN="yes"/>
<node CREATED="1732717089403" ID="ID_1509612203" MODIFIED="1732717099901" TEXT="mit Einschr&#xe4;nkung : rechne in 64bit"/>
<node CREATED="1732717102481" ID="ID_1246427992" MODIFIED="1732717115729" TEXT="also Zugriff &#xfc;ber data64()-Array"/>
</node>
<node CREATED="1732145995543" ID="ID_209219518" MODIFIED="1732146006347" TEXT="Verkn&#xfc;pfung mehrerer Eingabpuffer">
<node COLOR="#338800" CREATED="1732145995543" ID="ID_209219518" MODIFIED="1732761553289" TEXT="Verkn&#xfc;pfung mehrerer Eingabpuffer">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1732146009058" ID="ID_422352708" MODIFIED="1732146038271" TEXT="linearer Mix von zwei Eingabepuffern"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1732146039895" ID="ID_136718896" MODIFIED="1732146062196" TEXT="N-fach Kombination mit Parameter-Seed">
<icon BUILTIN="flag-yellow"/>
</node>
<node COLOR="#435e98" CREATED="1732146039895" ID="ID_136718896" MODIFIED="1732761551198" TEXT="N-fach Kombination mit Parameter-Seed"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1728783585707" ID="ID_288581450" MODIFIED="1732146078102" TEXT="f&#xfc;r jede Berechnung gibt es eine human-readable spec">
<richcontent TYPE="NOTE"><html>
@ -93418,6 +93419,26 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</body>
</html></richcontent>
<icon BUILTIN="flag-yellow"/>
<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?">
<icon BUILTIN="help"/>
<node CREATED="1732762860392" ID="ID_1124313267" MODIFIED="1732762883705" TEXT="erst mal: eine &#xbb;semantische Identit&#xe4;t der Funktion&#xab;">
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1732762887780" ID="ID_1061271359" MODIFIED="1732762948258">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
&#10233; als n&#228;chstes mu&#223; aus aus den Manipulationen eine <i>richtige Funktion</i>&#160;gemacht werden
</p>
</body>
</html>
</richcontent>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1728772511968" ID="ID_1684753208" MODIFIED="1729981657484" TEXT="EventLog zuschaltbar f&#xfc;r jeden Schritt">
@ -93644,16 +93665,44 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1730825075913" ID="ID_265868890" MODIFIED="1730825103541" TEXT="der zweite und dritte Port ist explzit zu verdrahten"/>
</node>
</node>
<node CREATED="1730827694080" ID="ID_124715076" MODIFIED="1730850532211" TEXT="Test-Code bereitstellen">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1730827694080" ID="ID_124715076" MODIFIED="1732762760766" TEXT="Test-Code bereitstellen">
<linktarget COLOR="#f01c36" DESTINATION="ID_124715076" ENDARROW="Default" ENDINCLINATION="-1234;-110;" ID="Arrow_ID_1508179375" SOURCE="ID_1464679892" STARTARROW="None" STARTINCLINATION="1225;76;"/>
<icon BUILTIN="pencil"/>
<node CREATED="1730827701591" ID="ID_1382558170" MODIFIED="1730827720498" TEXT="mu&#xdf; nun beginnen, die Test-Processing-Funktionen zu organisieren">
<icon BUILTIN="smily_bad"/>
</node>
<node COLOR="#338800" CREATED="1730827749568" ID="ID_607130868" MODIFIED="1732716870574" TEXT="die Basis-Funktionen als free-functions realisieren">
<node COLOR="#338800" CREATED="1730827749568" ID="ID_607130868" MODIFIED="1732762700480" TEXT="die Basis-Funktionen als free-functions realisieren">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Es geht hier zun&#228;chst darum, die eigentliche Rechen-Funktionalit&#228;t bereitzustellen. Erst in weiteren Schritten werde ich dann daraus eine Test-Manipulations-Umgebung aufmachen, die diese Funktionalit&#228;t in sinnvolle Operationen und Verkn&#252;fpungen verpackt. Was im Moment die Parameter f&#252;r TestFrame sind, k&#246;nnte mal die Emulation eines StreamType-ImplType werden
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#556273" DESTINATION="ID_391399838" ENDARROW="Default" ENDINCLINATION="-384;24;" ID="Arrow_ID_290133862" STARTARROW="None" STARTINCLINATION="257;-992;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1730828045224" ID="ID_874340553" MODIFIED="1732716867458" TEXT="generateFrame"/>
<node COLOR="#435e98" CREATED="1730828224345" ID="ID_1955731193" MODIFIED="1732716867458" TEXT="generateMultichan"/>
<node COLOR="#435e98" CREATED="1730828224345" ID="ID_1955731193" MODIFIED="1732716867458" TEXT="generateMultichan">
<node CREATED="1732762149470" ID="ID_1342945058" MODIFIED="1732762166590" TEXT="&#xbb;multi-channel&#xab; hier einfach als Array benachbarter TestFrame-Instanzen"/>
</node>
<node COLOR="#435e98" CREATED="1732755174913" ID="ID_1860715528" MODIFIED="1732761928017" TEXT="duplicateMultichan"/>
<node COLOR="#435e98" CREATED="1732755180691" ID="ID_1402307258" MODIFIED="1732761519922" TEXT="manipulateMultichan">
<node CREATED="1732761940052" ID="ID_681048377" MODIFIED="1732762145519" TEXT="hier Quer-Verkettung korrespondierender Datenpunkte">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Stelle eine Hash-Kette her, die jeweils &#8222;quer&#8220; &#252;ber die Datenpunkte in benachbarten Frames l&#228;uft. Ein &#187;param&#171;-Wert dient als Seed und k&#246;nnte sp&#228;ter vom Node-Hash genommen werden. Dann wird der jeweilige original-Datenwert eingehasht und durch das Ergebnis der Kette ersetzt.
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1732761976785" ID="ID_996613214" MODIFIED="1732762002294" TEXT="als in-place-Manipulation im Quellbuffer realisiert">
<icon BUILTIN="idea"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1730828061609" ID="ID_234342122" MODIFIED="1732716867457" TEXT="manipulateFrame">
<node COLOR="#338800" CREATED="1730835481751" ID="ID_936086670" MODIFIED="1730835554245" TEXT="brauche nun direkten Zugang zu den payload-Daten">
<arrowlink COLOR="#77313e" DESTINATION="ID_442258905" ENDARROW="Default" ENDINCLINATION="381;-48;" ID="Arrow_ID_1047269362" STARTARROW="None" STARTINCLINATION="-36;80;"/>
@ -93668,9 +93717,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1730827961401" ID="ID_927640003" MODIFIED="1730827975594" TEXT="die Test-Ontology als Singleton zug&#xe4;nglich machen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1730900496156" ID="ID_744198194" MODIFIED="1730900506692" TEXT="erweiterte Verifikationen f&#xfc;r den TestFrame">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1730900509282" ID="ID_683548249" MODIFIED="1730900578353">
<node COLOR="#338800" CREATED="1730900496156" ID="ID_744198194" MODIFIED="1732762744509" TEXT="erweiterte Verifikationen f&#xfc;r den TestFrame">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1730900509282" ID="ID_683548249" MODIFIED="1732762735846">
<richcontent TYPE="NODE"><html>
<head/>
<body>
@ -93683,6 +93732,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</body>
</html></richcontent>
<arrowlink COLOR="#6f2328" DESTINATION="ID_442258905" ENDARROW="Default" ENDINCLINATION="366;-47;" ID="Arrow_ID_1067356199" STARTARROW="None" STARTINCLINATION="5;52;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1730827998905" ID="ID_1794368282" MODIFIED="1730828011958" TEXT="Adapter-&#x3bb; bereitstellen">