2009-03-14 10 views
21

私は結節インタフェース、各ノードは、それの入力接続の操作を実行し、(あなたが別のノードに接続することができます)何かノードベースのグラフィカルインターフェイスの実装?

いくつかのサンプルアプリケーションを出力し、基本的DAGを実装したいと思います:


、私は2ノードとグラフィカルアプリケーションしたいと思います。単純に固定数を出力する「数字」と、2つの入力を受け取り、それらの和を出力する「追加」ノードとを含む。

人々はそれまで答えてきたように、私は擬似コードを探してPython'y、例えば、コードでデータを表現する方法の大まかなアイデアを持っている:私はラッピングについて得ただろうか

class Number: 
    def __init__(self, value): 
     self.value = value 

    def eval(self): 
     return self.value 

class Add: 
    def __init__(self, input1, input2): 
     self.input1 = input1 
     self.input2 = input2 

    def eval(self): 
     return self.input1.eval() + self.input2.eval() 


a = Number(20) 
b = Number(72) 

adder = Add(a, b) 
print adder.eval() 

この周りのカスタムGUI?次のようなものが、手で描かれたものはわずかです!

nodal UI mockup

私が始まるのでしょうか?私は現在Objective-C/Cocoaに書いていますが、私は他の言語のための提案はしていません。

答えて

4

私はいくつかの基本的なインタフェース(GUIの意味ではなくOOPの意味で)をモデリングすることから始めます。私には、入力の集まりと単一の出力を受け入れるノードがあると思われます。あなたはデータ型がどれほど広いかについて何の示唆もしていませんでしたが、入力/出力を表す適切な方法が必要です。あなたの最初の目標のために、これは整数かもしれません。いくつかの一般的なCスタイルのOOP言語では

(それは理にかなって願っています)

class Node<T> { 
    Node<T>[] inputs; 
    T eval(); 
} 

class AdderNode extends Node<int> { 
    int eval() { 
     int accum = 0; 
     for (inputs : i) 
      accum += i.eval(); 
     return i; 
    } 
} 

class ConstNode<int I> extends Node<int> { 
    int eval() { return I; } 
} 

AdderNode a; 
a.inputs.add(ConstNode<2>()); 
a.inputs.add(ConstNode<3>()); 
a.eval(); 

あなたは、いくつかの抽象クラス、ジェネリック、またはインタフェースにint型を置き換えることで、この上で展開することができます。実際の実装は実際の言語に基づいて異なります。

1

興味深い操作をモデリングすることから始めます。最終的にはそれらをUIに接続しますが、それはエンジンではなくハンドルとガスペダルです。

ビルドしようとしているのは、変数、値、型、式、評価など、プログラミング言語と共通点があります。メタファの多くは適用可能であり、いくつかのガイダンスを提供します。

.NET 3.5を使用している場合は、Expression Treesというオプションがあります。実行時にコード式を表現してコンパイルできます。

たとえば、あなたの最初の目標モデル化する:式を呼び出すには

using System.Linq.Expressions; 

ConstantExpression theNumber2 = Expression.Constant(2); 
ConstantExpression theNumber3 = Expression.Constant(3); 

BinaryExpression add2And3 = Expression.Add(theNumber2, theNumber3); 

を、我々はこの方法でadd2And3をラップする必要があります。これは、ラムダ式を用いて行われる:

Expression<Func<int>> add2And3Lambda = Expression.Lambda<Func<int>>(add2And3); 

Func<int>はパラメータを取らず、intを返すメソッドを表します。 C#では、add2And3Lambdaによって表されるコードは次のようになります。

() => 2 + 3 

それでは、私たちが持っていることは、ルート手法である式ツリーです。方法は呼び出し可能ですので、我々は根本的なデリゲート型のインスタンスにツリーをコンパイルすることができます

int theNumber5 = add2And3Func(); 

に利用できるすべての式を:

Func<int> add2And3Func = add2And3Lambda.Compile(); 

今、私たちは私たちが構築されたコードを呼び出すことができます。 NET言語がサポートされています。

グラフ内のすべてのノードに、Expressionが関連付けられているとします。それはあなたに表現木の力と、この仕事でどのようにあなたを助けることができるかという考えを与えるかもしれません。

1

これらのノードシステムでは、いずれも関数型プログラミング言語が記述されています。関数は、複数のパラメータを取り、設計目的にかかわらず単一の結果を返します。いくつかの例:

  • グラフィックス:ブラー(画像、カーネル、半径) - >画像

  • 数学:追加(番号、ナンバー) - >数

  • 関係:フィルタ(表、述語) - >表

は、基本的には)Func<object[], object>(C#のような関数シグネチャに帰着します。

ノードシステムを永続化する方法の問題に直面します。 1つのノードの結果を他の1つのノード(ツリー)または複数のノード(グラフ)だけでパラメータとして使用できるようにしますか?

ツリーの例、直接パラメータの子ノードがあります:リスト内のすべてのノードを保存し、参照のみを使用し、グラフの

Add(
    Multiply(
    Constant(5), 
    Constant(4) 
), 
    Multiply(
    Constant(5), 
    Constant(3) 
) 
) 

例:

A := Constant(5) 
B := Constant(4) 
C := Constant(3) 

D := Func(Multiply, A, B) 
E := Func(Multiply, A, C) 

F := Func(Add, D, E) 
0

たぶんbwiseにしています興味のあるもの?

this pageの下半分には、bwiseを使用して2つの数値を入力とする乗算ブロックを作成する例が示されています。

1

私はココアで、このようなインターフェイスを実装する上でいくつかの有用な情報が見つかりました:

0

あなたはこのプロジェクトに説明のように、私は、実行グラフを実装: GRSFramework

をソースコードはhereを見つけることができます。

現在、私はプロジェクトExecutionGraphでこのシステムのより良い、きれいなバージョンをリリースしようとしています。
あなたにとっても興味深いかもしれません。

は、その後も同様の解決策を研究している間、私はこのスレッドにつまずい

0

TensorFlow実装同様のシステムを持っているGoogleからのTensorFlowライブラリがあります。 最近、私はgithubの素晴らしいプロジェクトを見つけましたhttps://github.com/nodebox/nodebox あなたが探しているものとまったく同じようです。少なくとも1人はプロジェクトからエディタコンポーネントを抽出して採用することができます。

よろしく、 ステファン

+0

は、StackOverflowのに貢献するだけでがっかりされたリンクと答えたいのための感謝を歓迎します。 [回答ガイドライン](https://stackoverflow.com/help/how-to-answer)を参照してください。経験則はリンクなしであなたの答えを見ることです。価値がほとんどまたはまったくない場合は、拡大を検討してください。 – JaredMcAteer

関連する問題