phyphox Forums
Beispiele Attribut "clear" Editor/Analysis - Printable Version

+- phyphox Forums (https://phyphox.org/forums)
+-- Forum: German / deutsch (https://phyphox.org/forums/forumdisplay.php?fid=11)
+--- Forum: Allgemein (https://phyphox.org/forums/forumdisplay.php?fid=12)
+--- Thread: Beispiele Attribut "clear" Editor/Analysis (/showthread.php?tid=615)



Beispiele Attribut "clear" Editor/Analysis - S.Weick - 02-06-2020

Hallo,
ich hab mich noch mal ausführlich mit dem Editor auseinandergesetzt und auch einiges im Wiki gelesen, aber mit einer Sache werde ich noch immer nicht so richtig warm, dem Attribut clear="true"/"false" im Analysis-Teil.
Huh 
Ich glaube mir fehlen zum Verständnis mal 1-2 konkrete Beispiele, an denen das Setzten dieses Attributs verständlich wird. Kann mir da jemand weiter helfen?
Vielen Dank!


RE: Beispiele Attribut "clear" Editor/Analysis - Sebastian Staacks - 02-07-2020

Ja, das mit dem clear-Attribut ist im Editor nicht ganz leicht zu verstehen und wird auch nicht sehr anschaulich dargestellt. Das Problem ist, dass unser eigentliches Dateiformat ein bisschen anders funktioniert als der Editor suggeriert und der Editor darauf ausgelegt ist, eine vereinfachte Variante darzustellen um neue Nutzer nicht abzuschrecken. Beim clear-Attribut stößt man da aber schon ein bisschen an die Grenze dessen, was in der Darstellung sinnvoll möglich ist.

Zur Erklärung, beschreibe ich am besten erstmal, wie unser eigentliches Dateiformat interpretiert wird. Dieses definiert eine ganze Reihe von Puffern mit vorgegebener Größe. Also Beispielsweise "Puffer 1" hat die Größe 1", "Puffer 2" hat die Größe 100 und "Puffer 3" hat die Größe 0 (was als unbegrnezter Puffer interpretiert wird).

Nun wird eine folge von Analysis-Modulen definiert, die phyphox immer wieder in einer Schleife ausführt. Als Beispiel
"Addiere Puffer 1 und Puffer 2 und schreibe das Ergebnis in Puffer 3" (add-Modul)
"Nimm Puffer 1 und Puffer 2, hänge beides aneinander und schreibe das Ergebnis in Puffer 3" (append-Modul)

Phyphox würde die beiden Anweisungen nun einfach hintereinander ausführen, rein sprachlich ist nun noch nicht klar, was passiert, wenn schon Werte im Ausgangs-Puffer sind und was mit den Werten passiert, die gerade genutzt wurden. Hier kommt das clear-Attribut ins Spiel. Wenn es auf "false" steht, bleiben die benutzten Daten erhalten und am Ausgang werden neue Daten einfach hinten dran gepackt.

Beispiel:
Puffer 1 hat erst den Wert "7"
Puffer 2 hat erst den Wert "1, 2, 3"
Puffer 3 ist zunächst leer.
Im ersten Durchgang addiert phyphox nun Puffer 1 zu Puffer 2 und erhält "8, 9, 10". Da clear überall auf false steht, wird es einfach angehangen und nichts gelöscht. Also ist der Zustand dann
Puffer 1: 7
Puffer 2: 1, 2, 3
Puffer 3: 8, 9, 10
Beim zweiten Befehl wird Puffer 2 an Puffer 1 gehangen, was "7, 1, 2, 3" ergibt und auch an Puffer 3 angehangen:
Puffer 1: 7
Puffer 2: 1, 2, 3
Puffer 3: 8, 9, 10, 7, 1, 2, 3
Wichtig ist nun, dass das auch gilt, wenn der nächste Durchlauf erfolgt. Nichts wird gelöscht und Puffer 3 wächst immer weiter.
Nach der nächsten Addition kommt wieder ein "8, 9, 10" hinzu
Puffer 1: 7
Puffer 2: 1, 2, 3
Puffer 3: 8, 9, 10, 7, 1, 2, 3, 8, 9, 10
Und dann wird wieder "7, 1, 2, 3" angehangen:
Puffer 1: 7
Puffer 2: 1, 2, 3
Puffer 3: 8, 9, 10, 7, 1, 2, 3, 8, 9, 10, 7, 1, 2, 3

Das ist selten, was man haben möchte. Die Standardeinstellung im Editor ist daher "clear at the output", was im eigentlichen Dateiformat heißt, dass "clear=true" beim Ausgang der Analysis-Blöcke gesetzt wird. Das wiederum heißt, dass die Daten im Ausgangspuffer gelöscht werden, bevor das Ergebnis reingeschrieben wird. Der alte Wert wird also ersetzt:

Beispiel:
Puffer 1 hat erst den Wert "7"
Puffer 2 hat erst den Wert "1, 2, 3"
Puffer 3 ist zunächst leer.
Im ersten Durchgang addiert phyphox nun Puffer 1 zu Puffer 2 und erhält "8, 9, 10". Da clear am Ausgang nun auf true steht, das Ergebnis ersetzt (ist ja eh noch nichts drin) und am Eingang weiterhin nichts gelöscht, da in diesem Beispiel hier noch false steht. Also ist der Zustand dann erstmal wie vorher, da Puffer 3 schon leer war:
Puffer 1: 7
Puffer 2: 1, 2, 3
Puffer 3: 8, 9, 10
Beim zweiten Befehl wird Puffer 2 an Puffer 1 gehangen, was "7, 1, 2, 3" ergibt und auch an Puffer 3 angehangen. Dieses Mal wird aber das Ergebnis ersetzt, da clear="true":
Puffer 1: 7
Puffer 2: 1, 2, 3
Puffer 3: 7, 1, 2, 3
Beim nächsten Durchlauf wird Puffer 3 auch wieder gelöscht wenn das Ergebnis der Addition reingeschrieben wird:
Puffer 1: 7
Puffer 2: 1, 2, 3
Puffer 3: 8, 9, 10
Und dann wird wieder "7, 1, 2, 3" angehangen:
Puffer 1: 7
Puffer 2: 1, 2, 3
Puffer 3: 7, 1, 2, 3

In dem Beispiel macht es nun keinen Sinn, das beide Operationen zu Puffer 3 führe, da die zweite das Ergebnis der ersten ersetzt, aber man kann hier schon eher sehen, dass man das oft brauchen kann. Wenn man beispielsweise werte vom Beschleunigungssensor sammelt und zum kalibrieren einen Offset dazu addieren möchte, sollen die Rohdaten nicht gelöscht werden (clear am Eingang steht auf false), aber die berechneten Werte sollen sich nicht ansammeln, sondern jede Berechnung stellt das gesamte Ergebnis dar, so dass die vorherigen Werte gelöscht werden sollen.

Problem hier ist, dass bei jedem Durchgang alles neu berechnet wird obwohl man zum gleichen Ergebnis kommt. Das kann man auch umdrehen, indem clear beim Ausgang auf false steht und statt dessen am Eingang clear=true gewählt wird (clear at the input im editor). Dann werden die Werte der Eingänge gelöscht nachdem sie verwendet wurden.

Beispiel:
Puffer 1 hat erst den Wert "7"
Puffer 2 hat erst den Wert "1, 2, 3"
Puffer 3 ist zunächst leer.
Im ersten Durchgang addiert phyphox nun Puffer 1 zu Puffer 2 und erhält "8, 9, 10". Da clear nun am Eingang auf true steht, werden die Eingangspuffer anschließend geleert:
Puffer 1: (leer)
Puffer 2: (leer)
Puffer 3: 8, 9, 10
Beim zweiten Befehl wird Puffer 2 an Puffer 1 gehangen, was nun etwas witzlos ist, da beide leer sind. Das Ergebnis ist auch "leer" und wenn wir am Ausgang clear="false" haben, wird einfach eine leere Liste an das vorhandene Ergebnis angehangen:
Puffer 1: (leer)
Puffer 2: (leer)
Puffer 3: 8, 9, 10
Beim nächsten Durchlauf sind Puffer 1 und 2 immer noch leer und das Ergebnis wird nicht überschrieben. So lange also nichts in Puffer 1 oder 2 hinzu kommt, passiert nichts mehr:
Puffer 1: (leer)
Puffer 2: (leer)
Puffer 3: 8, 9, 10

Hier kann man sich aber gut vorstellen, dass neue Messwerte vom Sensor berechnet und and die Liste der Werte in Puffer 3 angehangen werden. Man bekommt zu jedem Sensorwert einen berechneten Wert, muss jeden aber nur einmal neu berechnen. Nachteil ist hier, dass die Rohdaten gelöscht werden. Das könnte man dann dadurch umgehen, dass man die eingehenden Daten jeweils an eine Rohdatenliste anhängt ohne zu löschen und dann mit löschen die Berechnung startet:

Beispiel:
Wir haben einen Puffer "acc", der Werte vom Beschleunigungssensor erhält. Einen Puffer "acc-roh", der die Rohdaten sammeln soll und einen Puffer "acc5", der als berechneten Wert das fünffache erhalten soll.
Die Analysis-Module sehen dann idealerweise so aus:
append: acc (clear="false") -> accroh (clear="false")
multiply: acc (clear="true") -> acc5 (clear="false")
Wir starten mit leeren Puffern und zunächst passiert nichts. Leere Puffer werden an die leeren accroh und acc5-Puffer angehangen. Nun kommt "1,2,3" vom Sensor in den Puffer "acc" und im nächsten Durchgang passiert das was wir haben wollen:
acc: 1, 2, 3
accroh: (leer)
acc5: (leer)
Erst append mit beiden clear-Attributen auf false:
acc: 1, 2, 3
accroh: 1, 2, 3
acc5: (leer)
Dann werden erst die Daten vom Sensor gelöscht, wenn die Multiplikation mit clear bei input ausgeführt wird und das fünffache mit "5, 10, 15" ergibt:
acc: (leer)
accroh: 1, 2, 3
acc5: 5, 10, 15
Wie zuvor passiert nun erstmal nichts mehr solange keine Daten rein kommen, da am Ausgang nichts gelöscht wird. Dann kommt vom Sensor "4, 5":
acc: 4,5
accroh: 1, 2, 3
acc5: 5, 10, 15
Append sichert erstmal die Rohdaten:
acc: 4,5
accroh: 1, 2, 3, 4, 5
acc5: 5, 10, 15
Und beid er Multiplikation werfen wir dann alles in acc weg:
acc: (leer)
accroh: 1, 2, 3, 4, 5
acc5: 5, 10, 15, 20, 25

Das ist nur eines von vielen Beispielen, warum man das einstellen möchte.

Das Problem beim Editor ist nun, dass die Puffer nicht als solche aufgelistet werden. Statt dessen werden die Puffer nur als Verbindungslinie zwischen den Modulen dargestellt. Dadurch können wir das Beispiel oben schon gar nicht im Editor darstellen, denn wir können nicht zwei Module in den gleiche Puffer schreiben lassen. Aber auch in den Beispielen in denen nicht in den gleichen Puffer geschrieben wird, ist es sehr unintuitiv, dass Werte gelöscht oder nicht gelöscht werden - denn die stecken ja quasi in der Verbindungslinie. Die typischen Editor-Beispiele arbeiten daher mit "clear=false" am Eingang und "clear=true" am Ausgang. Nicht effizient, passt aber zur Darstellung.

Das war nun lang, aber ich hoffe, das macht einiges klarer. Wenn nicht, gerne nach fragen Smile