これはコマンド PDL::Dataflowp で、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの 1 つを使用して、OnWorks 無料ホスティング プロバイダーで実行できます。
プログラム:
NAME
PDL::Dataflow -- データフローの哲学の説明
SYNOPSIS
pdl> $ a = ゼロ(10);
pdl> $b = $a->slice("2:4:2");
pdl> $b ++;
pdl> print $a;
[0 0 1 0 1 0 0 0 0]
警告
データフローは非常に実験的なものです。多くの機能、特に 2.0 では無効になっています。
一方向データフローのファミリー。一方向のデータフローを使用する場合は、
何か、まず作者に連絡してください。機能させる方法を検討します。
再び。
双方向データフロー (実装 ->スライス() など) ただし、完全に機能します。
ピドル内の値のサブセットを返すほぼすべての関数は、
バインディング
$a = 何かの謎
$b = $a->slice("一部");
$b->set(3,3,10);
$a 内の対応する要素も変更します。 $b は事実上、一部の人々への窓口となっている
$a のサブ要素。さまざまなタイプの処理を実行する独自のルーチンを定義することもできます。
サブセット。 $b を $a への窓口にしたくない場合は、次のようにする必要があります。
$b = $a->slice(「一部」)->コピー;
コピーにより、2 つのピドル間のすべてのデータフローがオフになります。
一方向のデータフローの問題は、次のようなシーケンスに関連しています。
$b = $a + 1;
$b++;
ここでは、いくつかの可能な結果があり、セマンティクスが少し曖昧になります。
DESCRIPTION
データフローは PDL2.0 の新機能です。データフローの背後にある基本哲学は次のとおりです。
> $a = pdl 2,3,4;
> $b = $a * 2;
> $b を印刷
[2 3 4]
> $a->set(0,5);
> $b を印刷します。
[10 3 4]
機能するはずです。そうではありません。これを行うと混乱しすぎる可能性があると考えられました。
初心者やその言語を時々使用する人。したがって、明示的にオンにする必要があります。
データフローなので、
> $a = pdl 2,3,4;
> $a->doflow();
> $b = $a * 2;
...
予期せぬ結果が生じます。このドキュメントの残りの部分では、さまざまな機能と
データフロー実装の詳細。
不精な 評価
上記のような計算をしてみると
> $a = pdl 2,3,4;
> $a->doflow();
> $b = $a * 2;
この時点では何も計算されていません。 $bの内容の記憶さえも
割り当てられていません。コマンドのみ
> $b を印刷
実際には $b が計算されます。これを行う際に留意することが重要です
パフォーマンスの測定とベンチマーク、およびエラーの追跡時に使用します。
この動作には説明があります。サイクルを節約できる可能性がありますが、さらに重要なことは、
次のことを想像してください。
> $a = pdl 2,3,4;
> $b = pdl 5,6,7;
> $c = $a + $b;
...
> $a->リサイズ(4);
> $b->リサイズ(4);
> $c を印刷します。
ここで、$c が 2 つのサイズ変更の間で評価された場合、互換性のないエラー条件が発生します。
サイズが発生します。
現在のバージョンでは、$a のサイズを変更すると $c でフラグが立てられます。
"PDL_PARENTDIMSCHANGED" と $b は同じフラグを再度立てるだけです。次に $c が評価されるとき、
フラグがチェックされ、再計算が必要であることがわかります。
もちろん、遅延評価では、エラーが発生する可能性があるため、デバッグがさらに困難になる場合があります。
予期しない場所で発生します。エラーのより良いスタック トレースは、
PDL で動作します。おそらく、スイッチ $PDL::traceevals を切り替えて、適切な結果を得ることができるためです。
実際にエラーが発生した場所のトレース。
ご家族
これは、一方向データフローのより複雑な概念の 1 つです。考えます
次のコード ($a と $b はデータフローが有効になっている PDL):
$c = $a + $b;
$e = $c + 1;
$d = $c->diagonal();
$d++;
$f = $c + 1;
$e と $f には何を含めるべきでしょうか? $a が変更され、再計算が行われた場合はどうなるでしょうか。
引き金になった。
データフローを期待どおりに機能させるには、かなり奇妙な概念が必要です。
家族の紹介。図を作ってみましょう:
ab
\/
c
/|
/ |
ED
これは、PDL が最初の 3 行以降に実際にメモリ内に保持しているものです。 $dを変更すると、
$c を変更したいのですが、$e はすでにグラフ上にあるため、変更したくありません。それ
なぜ変更したくないのか今は明確ではないかもしれませんが、コードが 40 行あったとします。
2 行目と 4 行目の間にあるはずです。したがって、$c と $d のコピーを作成する必要があります。
ab
\/
c' 。 。 。 c
/| |\
/ | | \
e d' 。 。 。 df
元の c と d はオブジェクトに対応していないため、プライミングしたことに注意してください。
$c と $d にはもう入りません。また、2 つのオブジェクト間の点線にも注目してください。
変更され、この図が再評価されると、$c は実際に次の条件を使用して c' の値を取得します。
対角線が増加しました。
上記を一般化すると、piddle が変更されるたびに、つまり実際の *値* が
強制的に変更されました (参照だけではありません:
$d = $d + 1
完全に異なる結果が生成されます ($c と $d はバインドされなくなりますが、
$d .= $d + 1
$d++ と同じ結果が得られます)、これに結合された他のすべてのピドルで構成される「ファミリー」
双方向変換による突然変異したpiddleが作成され、それらがすべてコピーされます。
元の pdl のサブセットを単純に選択するすべてのスライスまたは変換は双方向です。
逆行列はそうあるべきです。算術演算子はありません。
ソース
前のセクションで言われたことは完全に真実ではありません。説明されている動作は次のとおりです。
*常に*あなたが望むものではありません。場合によっては、データの「ソース」が必要になることがあります。
$a = pdl 2,3,4; $b = pdl 5,6,7;
$c = $a + $b;
行($c);
ここで、$a が変更されることがわかっており、その子を次のように変更したいとします。
それをデータ ソースに宣言できます (XXX は現在のバージョンでは実装されていません)。
$a->情報源(1);
この後、 $a++ または $a .= something は新しいファミリーを作成しませんが、 $a を変更してカットします。
前の親との関係。そのすべての子は現在の値に従います。
したがって、前のセクションの $c がソースとして宣言されていた場合、$e と $f は残ります。
等しい。
バインディング
データフロー メカニズムは、イベントをバインドする機能がなければあまり役に立ちません。
データを変更しました。したがって、次のようなメカニズムを提供します。
> $a = pdl 2,3,4
> $b = $a + 1;
> $c = $b * 2;
> $c->bind( sub { print "A の現在: $a、C の現在: $c\n" } )
> PDL::dowhenidle();
現在の A: [2,3,4]、現在 C: [6 8 10]
> $a->set(0,1);
> $a->set(1,1);
> PDL::dowhenidle();
現在の A: [1,1,4]、現在 C: [4 4 10]
コールバックは PDL::dowhenidle 中にのみ呼び出されることに注目してください。インターフェースへの簡単な方法
これを Perl のイベント ループ メカニズム (Tk など) に適用することが計画されています。
この機能には、自己更新グラフなど、さまざまな用途があります。
どうにかこうにかXXXの詳しい説明
製品制限
Dataflow 自体は、Perl 上にかなり限定的に追加されたものです。より洗練されたものを得るには
さらに、Perl の内部を少しハッキングする必要があります。真の実装では、
あらゆるものの流れを可能にする
データ
データサイズ
データ・タイプ
管理ツール
現時点では最初の 50 つだけです (まあ、数か月で XNUMX% は悪くありません ;)
これだけでも便利です。ただし、特に最後のものが望ましいです。
クロージャが場所から場所へと流れる可能性が追加され、多くのクロージャが作成されます。
物事をより柔軟に。
残りを機能させるには、おそらくデータフローの内部を変更する必要があります。
より一般的なフレームワーク。
さらに、データを時間内に、明瞭にフローできれば素晴らしいでしょう (そうすれば、
あらゆる種類の信号処理を簡単に定義できます)。
onworks.net サービスを使用してオンラインで PDL::Dataflowp を使用する
