Dies ist der Befehl PDL::Dataflowp, der beim kostenlosen Hosting-Anbieter OnWorks mit einer unserer zahlreichen kostenlosen Online-Workstations wie Ubuntu Online, Fedora Online, dem Windows-Online-Emulator oder dem MAC OS-Online-Emulator ausgeführt werden kann
PROGRAMM:
NAME/FUNKTION
PDL::Dataflow – Beschreibung der Datenflussphilosophie
ZUSAMMENFASSUNG
pdl> $a = Nullen(10);
pdl> $b = $a->slice("2:4:2");
pdl> $b ++;
pdl> print $a;
[0 0 1 0 1 0 0 0 0 0]
WARNUNG
Dataflow ist sehr experimentell. Insbesondere für Version 2.0 sind viele Funktionen deaktiviert
Familien für einen unidirektionalen Datenfluss. Wenn Sie einen unidirektionalen Datenfluss für verwenden möchten
Wenn Sie etwas benötigen, kontaktieren Sie bitte zuerst den Autor und wir werden herausfinden, wie wir es funktionsfähig machen können
erneut.
Zweidirektionaler Datenfluss (der -> implementiert).Scheibe() etc.) ist jedoch voll funktionsfähig.
Nahezu jede Funktion, die eine Teilmenge der Werte in einem Piddle zurückgibt, erstellt eine
verbindlich damit
$a = irgendein Rätsel
$b = $a->slice("einige Teile");
$b->set(3,3,10);
ändert auch das entsprechende Element in $a. $b ist für einige praktisch zu einem Fenster geworden
Unterelemente von $a. Sie können auch Ihre eigenen Routinen definieren, die verschiedene Arten von Aufgaben ausführen
Teilmengen. Wenn Sie nicht möchten, dass $b ein Fenster zu $a ist, müssen Sie dies tun
$b = $a->slice("einige Teile")->copy;
Durch das Kopieren wird der gesamte Datenfluss zwischen den beiden Piddles unterbrochen.
Die Schwierigkeiten beim unidirektionalen Datenfluss hängen mit Sequenzen wie zusammen
$b = $a + 1;
$b ++;
wo es mehrere mögliche Ergebnisse gibt und die Semantik etwas unklar wird.
BESCHREIBUNG
Dataflow ist neu in PDL2.0. Die Grundphilosophie hinter dem Datenfluss ist Folgendes
> $a = pdl 2,3,4;
> $b = $a * 2;
> $b drucken
[2 3 4]
> $a->set(0,5);
> $b drucken;
[10 3 4]
sollte arbeiten. Das ist nicht der Fall. Es wurde angenommen, dass dies zu verwirrend sein könnte
Anfänger und gelegentliche Benutzer der Sprache. Daher müssen Sie es explizit aktivieren
Datenfluss, also
> $a = pdl 2,3,4;
> $a->doflow();
> $b = $a * 2;
...
erzeugt das unerwartete Ergebnis. Der Rest dieses Dokuments erklärt verschiedene Funktionen und
Details zur Datenflussimplementierung.
Faul Auswertung
Wenn Sie so etwas wie oben berechnen
> $a = pdl 2,3,4;
> $a->doflow();
> $b = $a * 2;
Zu diesem Zeitpunkt wird noch nichts berechnet sein. Sogar der Speicher für den Inhalt von $b
wurde nicht zugewiesen. Nur der Befehl
> $b drucken
wird tatsächlich dazu führen, dass $b berechnet wird. Dies ist bei der Durchführung unbedingt zu beachten
Leistungsmessungen und Benchmarks sowie bei der Fehlerverfolgung.
Für dieses Verhalten gibt es eine Erklärung: Es kann zwar Zyklen einsparen, aber was noch wichtiger ist:
Stellen Sie sich Folgendes vor:
> $a = pdl 2,3,4;
> $b = pdl 5,6,7;
> $c = $a + $b;
...
> $a->Größe(4);
> $b->Größe(4);
> $c drucken;
Wenn nun $c zwischen den beiden Größenänderungen ausgewertet wurde, wird die Fehlerbedingung „Inkompatibel“ angezeigt
Größen auftreten würden.
Was in der aktuellen Version passiert, ist, dass die Größenänderung von $a ein Flag in $c auslöst:
„PDL_PARENTDIMSCHANGED“ und $b setzen einfach das gleiche Flag erneut. Wenn $c das nächste Mal ausgewertet wird,
Die Flags werden überprüft und es wird festgestellt, dass eine Neuberechnung erforderlich ist.
Natürlich kann eine verzögerte Auswertung manchmal das Debuggen schwieriger machen, weil es zu Fehlern kommen kann
an einem Ort auftreten, an dem man sie nicht erwarten würde. Eine bessere Stapelverfolgung für Fehler finden Sie im
funktioniert für PDL, wahrscheinlich damit Sie einen Schalter $PDL::traceevals umlegen und ein gutes Ergebnis erhalten können
Spur, wo der Fehler tatsächlich war.
Familien
Dies ist eines der komplexeren Konzepte des unidirektionalen Datenflusses. Bedenke die
Folgender Code ($a und $b sind PDLs, bei denen der Datenfluss aktiviert ist):
$c = $a + $b;
$e = $c + 1;
$d = $c->diagonal();
$d ++;
$f = $c + 1;
Was sollten $e und $f jetzt enthalten? Was ist, wenn $a geändert wird und eine Neuberechnung erfolgt?
Ausgelöst.
Damit der Datenfluss wie erwartet funktioniert, muss ein ziemlich seltsames Konzept vorliegen
eingeführt: Familien. Lassen Sie uns ein Diagramm erstellen:
ab
\ /
c
/|
/ |
und
Dies ist, was PDL nach den ersten drei Zeilen tatsächlich im Speicher hat. Wenn $d geändert wird,
Wir möchten, dass sich $c ändert, aber wir möchten nicht, dass sich $e ändert, da es bereits in der Grafik enthalten ist. Es
Möglicherweise ist jetzt nicht klar, warum Sie nicht möchten, dass sich etwas ändert, aber wenn es 40 Codezeilen gäbe
zwischen der 2. und 4. Zeile würden Sie. Also müssen wir eine Kopie von $c und $d erstellen:
ab
\ /
C' . . . C
/| |\
/ | | \
ed' . . . df
Beachten Sie, dass wir die ursprünglichen c und d geprimt haben, da sie nicht den Objekten entsprechen
in $c und $d nicht mehr. Beachten Sie auch die gepunkteten Linien zwischen den beiden Objekten: when $a is
geändert und dieses Diagramm neu ausgewertet wird, erhält $c tatsächlich den Wert von c' mit dem
diagonal erhöht.
Um das oben Gesagte zu verallgemeinern: Wann immer ein Piddle mutiert ist, d. h. wenn sein tatsächlicher *Wert* ist
zwangsweise geändert (nicht nur die Referenz:
$d = $d + 1
würde ein völlig anderes Ergebnis liefern ($c und $d wären nicht mehr gebunden, wohingegen
$d .= $d + 1
würde dasselbe ergeben wie $d++), eine „Familie“, die aus allen anderen Piddles besteht, die mit dem verbunden sind
Durch eine bidirektionale Transformation wird ein mutiertes Piddle erstellt und alle diese werden kopiert.
Alle Slices oder Transformationen, die einfach eine Teilmenge der ursprünglichen PDL auswählen, sind bidirektional.
Die Matrix sollte invers sein. Es gibt keine arithmetischen Operatoren.
Quellen
Was Ihnen im vorherigen Abschnitt gesagt wurde, stimmt nicht ganz: Das beschriebene Verhalten stimmt
nicht *immer* das, was du willst. Manchmal möchten Sie wahrscheinlich eine Datenquelle haben:
$a = pdl 2,3,4; $b = pdl 5,6,7;
$c = $a + $b;
Zeile($c);
Nun, wenn Sie wissen, dass sich $a ändern wird und Sie möchten, dass sich seine untergeordneten Elemente mit ändern
Sie können es in einer Datenquelle deklarieren (XXX in der aktuellen Version nicht implementiert):
$a->Datenquelle(1);
Danach wird mit $a++ oder $a .= irgendetwas keine neue Familie erstellen, sondern $a ändern und ausschneiden
seine Beziehung zu seinen früheren Eltern. Alle seine untergeordneten Elemente folgen seinem aktuellen Wert.
Wenn also $c im vorherigen Abschnitt als Quelle deklariert worden wäre, würden $e und $f übrig bleiben
gleich.
Buchbindung
Ein Datenflussmechanismus wäre ohne die Möglichkeit, Ereignisse daran zu binden, nicht sehr nützlich
geänderte Daten. Daher bieten wir einen solchen Mechanismus an:
> $a = pdl 2,3,4
> $b = $a + 1;
> $c = $b * 2;
> $c->bind( sub { print "A jetzt: $a, C jetzt: $c\n" } )
> PDL::dowhenidle();
A jetzt: [2,3,4], C jetzt: [6 8 10]
> $a->set(0,1);
> $a->set(1,1);
> PDL::dowhenidle();
A jetzt: [1,1,4], C jetzt: [4 4 10]
Beachten Sie, dass die Rückrufe nur während PDL::dowhenidle aufgerufen werden. Eine einfache Möglichkeit zur Schnittstelle
Dies auf Perl-Ereignisschleifenmechanismen (wie Tk) ist in Planung.
Es gibt viele Einsatzmöglichkeiten für diese Funktion: zum Beispiel selbstaktualisierende Diagramme.
Bla bla bla XXX mehr Erklärung
Einschränkungen
Dataflow als solcher ist eine relativ begrenzte Ergänzung zu Perl. Um eine verfeinerte Darstellung zu erhalten
Darüber hinaus müssen die Interna von Perl ein wenig gehackt werden. Eine echte Implementierung würde
Ermöglichen Sie den Fluss von allem, einschließlich
die Datenerfassung
Datengröße
Datentyp
Geschäftstätigkeit
Im Moment haben wir nur die ersten beiden (hey, 50 % in ein paar Monaten ist nicht schlecht ;), aber
selbst das ist an sich schon nützlich. Allerdings ist vor allem Letzteres wünschenswert, da es
würde die Möglichkeit fließender Schließungen von Ort zu Ort hinzufügen und viele machen
Dinge flexibler.
Damit der Rest funktioniert, müssen die Interna des Datenflusses wahrscheinlich in a geändert werden
allgemeineren Rahmen.
Darüber hinaus wäre es schön, die Daten rechtzeitig und klar fließen zu lassen (so dass Sie das könnten).
Sie können ganz einfach alle Arten von Signalverarbeitungsfunktionen definieren.
Nutzen Sie PDL::Dataflowp online über die Dienste von onworks.net