
ノードグラフ・アーキテクチャは、ノードグラフの概念に基づいて構築されたソフトウェア設計です。ソースコードとユーザーインターフェースはどちらも、アトミックな機能ユニットの編集と合成(またはリンク)を中心に設計されています。ノードグラフは、ビジュアルプログラミング言語の一種です。
ソフトウェア アプリケーションのソースコードは、ノードと呼ばれるアトミックな機能単位に編成されます。これは通常、すべてのノードの基本クラスから派生したクラスを使用して行われます。各ノードには入力と出力があり、これらも通常、すべての入力とすべての出力の基本クラスから派生したクラスを使用して実装されます。出力と入力は、通常、他の出力または入力のインスタンスへのポインターを保持することにより、相互に参照できます。ノードが機能を実行する際、入力に格納されているポインターをたどって他のノードから出力されたデータを取得し、入力を取得します。次に、ノードはこれらの入力に対して操作を実行し、独自の出力を生成します。このようにノードをリンクできるため、複雑なタスクや問題を理解しやすいアトミックなノード単位に分解できます。
ソフトウェアアプリケーションのユーザーインターフェースでは、多くの場合、ノードグラフが視覚的に表示されます。ノードは通常、長方形で描画され、ノード間の接続は線またはスプラインで描画されます。
ノードグラフアーキテクチャの使用は1960年代に始まりました。[要出典]今日、ノードグラフの使用は爆発的に増加しています。グラフィックス、ゲーム、機械学習の分野でこのソフトウェア設計が主に採用されており、ほとんどのツールがノードグラフアーキテクチャを使用しています。[要出典]
今日に至るまで、ビジュアルプログラミングとノードグラフアーキテクチャの利点については議論が続いています。支持者は、ノードグラフが提供する抽象化によってツールが使いやすくなることを強調しています。一方、批判者は、ビジュアルプログラミングには制約が多すぎること、そしてタスクを実行するためにソースコードやスクリプトを修正せざるを得ないことを指摘しています。
Eric Hosick氏がTwitterで、ほとんどのソフトウェアアプリケーションのノードグラフユーザーインターフェースのスナップショットを収集する取り組みを続けています。この取り組みは、ノードグラフユーザーインターフェースの進化と爆発的な発展を、そのルーツから記録しようとするものです。このビジュアルヒストリーは、「Visual Programming Languages - Snapshots」というブログページで公開されています。ノードグラフアーキテクチャとビジュアルプログラミングにつながる研究は、1960年代、「マンマシンコミュニケーション」として知られる分野から始まったようです。
ウィリアム・ロバート・サザーランドは、1966年にMITで学位論文「手続きのオンライン・グラフィカル仕様」を執筆し、2次元の図形言語に関するトピックを解説・分析しました。これは、データフローベースのワークフローやプログラムに関する初期の研究の一つです。以来、彼の学位論文は「先行技術」として、今日におけるデータフローに関するアイデアをめぐる訴訟を阻止するために利用されてきました。彼の研究は、今日のコンピュータ支援設計(CAD)の発展を先導したとよく考えられています。
1969年、T.O.エリス、J.F.ヒーフナー、WL.シブリーは、グラフィカル入力言語(GRAIL)に関する論文を発表しました。彼らの研究は、イヴァン・サザーランドが行った、ユーザーがタブレットに直接コンピュータコマンドを書き込めるシステムであるスケッチパッドの研究に端を発するRANDタブレットに関連していました。GRAILシステムはフローチャートベースのグラフィカルプログラミング言語を使用し、手書きの文字やジェスチャーを認識することができました。[2]アラン・ケイはGRAILシステムのデモを数多く行っていますが、システムの開発には関わっていません。
ノードグラフアーキテクチャの最近の応用例のいくつかは、2005年頃に始まりました。この時期のノードグラフは、ノードグラフの複雑さに対処するためのパラダイムを開発し始めました。複雑さは、グラフ内のノードとリンクの数が増えるにつれて増加しました。複雑さに対処する主要なアイデアの一つは、グループまたはパッケージノードの概念でした。これは、ノードを自身の内部に隠し、グループの入力と出力のみを公開します。
論文「ソフトウェアアーキテクチャにおける階層的スモールワールド」[3]において、著者のセルジ・バルベルデは、大規模ソフトウェアシステムのほとんどがモジュール型かつ階層的に構築されており、ノードグラフは大規模ソフトウェアシステムの分析に利用できると主張しています。他の多くのソフトウェア分析論文でも、大規模ソフトウェアシステムの分析にノードグラフが頻繁に用いられており、ノードグラフはソフトウェアの内部構造と動作の優れたモデルであることが示唆されています。[4]
ノードグラフは、より広義のビジュアルプログラミング言語のサブセットです。ノードグラフを使用すると、ソースコードを作成する代わりに、視覚的かつ構造化された方法でプログラムを設計できます。映画やビデオゲーム業界では、ノードグラフはビジュアルプログラミングと同義です。現在、ノードグラフとビジュアルプログラミング言語の能力、抽象化、そして必要性については議論が続いています。
これは現在も活発な議論が交わされている分野であり、現在もオープンフォーラムで新たな議論が交わされています。以下は、これまでで最も大きな議論のいくつかです。
研究では、こうした議論をより詳細に掘り下げ、ノードグラフの長所と短所をより明確に強調する傾向があります。ノードグラフとビジュアルプログラミングは初心者には理解しやすいものの、ユーザーがより複雑なタスクに取り組むようになると、テキスト形式のソースコードの作成に頼らざるを得なくなることが示されています。[7]別の調査では、ビジュアルプログラミングの認知効果に関する人々の考え方に焦点を当てており、プロのプログラマーがビジュアルプログラミングに最も懐疑的であることがわかりました。[8]他の研究では、心理学実験において、ビジュアルプログラミングが認知タスクのパフォーマンスに有意なプラスの影響を与える可能性があることが示されています。[9]

ソフトウェアアーキテクチャにおけるノードグラフとは、ソフトウェアの機能をノードと呼ばれる原子単位に編成したもので、ノードはリンクを介して相互に接続されます。ノードグラフ内のノードとリンクの操作は、多くの場合、プログラム可能なAPIまたはマウスを使用したビジュアルインターフェースを通じて行われます。上の図では、ノードグラフは右側に表示されています。
現代の用法では、「ノードグラフ」という用語はオープン複合語です。しかし、古いソフトウェアでは「ノードグラフ」、つまりクローズド複合語と呼ばれていました。
ノードは何らかの計算を実行します。この実行可能な機能をカプセル化し、多くの場合、入力を受け取り、実行の副産物として出力を生成します。簡単な例として、2つの数値を加算するノードが挙げられます。入力は加算する2つの数値であり、出力は2つの数値の合計です。
ノードは次の形式の数学関数に類似しています。
ここで、 はノードの計算、はノードの入力値のベクトル、はノードの出力値のベクトルです。
視覚的には、ノードは長方形で表現されることが多いです。しかし、これはすべてのアプリケーションで採用されている慣例ではありません。上の図には、「ビデオ」、「星を追加」、「円を追加」というラベルの付いた3つのノードがあります。
ノードには、その実行を定義する追加のパラメータがしばしば存在します。これらのパラメータは、ノードのソースコード内のデータ型によってサポートされます。
数学的には、これらはノードの計算関数への追加の入力値と考えることができます。唯一の違いは、これらの値は他のノードの実行結果の副産物として出力されるのではなく、ユーザーが直接制御することです。例えば、上記の2つの数値を加算するノードの簡単な例では、ノードにバイアスパラメータを導入することで、ノードが合計値に固定値を追加できるようにすることができます。
視覚的には、ノードのパラメータはユーザーがノードをクリックした後に公開されることが多いです。これにより、ノードグラフの視覚的な煩雑さを軽減できます。上の図では、「Add Star」ノードの横にパラメータウィンドウが開いています。
前述の通り、ノードには多くの場合、入力と出力があります。入力と出力は、ノードのソースコード内のデータ型によってサポートされます。入力と出力は、ノードの実行前後の値を保存するために不可欠です。
数学的には、ノードの入力と出力は関数の入力値と出力値に類似しています。
ここで、 はノードの計算、はノードの入力値のベクトル、はノードの出力値のベクトルです。
視覚的には、ノードの入力と出力は円で表されることが多いです。
リンクは、異なるノード間でデータ型に格納された値を転送します。これは数学的な構成に似ています。例えば、ノードAが出力をノードBに送る場合、数学的には次のように表すことができます。
ここで、およびはノード B とノード A によって実行される操作であり、はノード A の入力値のベクトルであり、はノード B の出力値のベクトルです。
ノードのタイプは、実行時にどの計算操作を実行するかを示します。ノードグラフには、多くの場合、複数の異なるノードタイプが存在します。以下にいくつか例を示します。
複雑性を管理する上で最も重要なノードタイプはグループノードです。このノードタイプは、他のノードとは異なり、ソフトウェアコードを実行しません。このノードは、接続されたノードのサブセットをグループ化し、グループへの入出力を管理します。これにより、複雑性がグループノード内に隠蔽され、グループ外の他のノードとの結合が制限されます。これにより、より小さなグラフがグループノードに埋め込まれた階層構造が実現されます。以下は、接続されたノードのサブセットをグループ化し、グラフを簡素化するために使用されるグループノードの例です。
ノードグラフアーキテクチャを採用したソフトウェアアプリケーションは、通常、ノードグラフを視覚的またはグラフィカルにユーザーに公開し、ユーザーがノードグラフに変更を加えることができるようにします。マウスを使用することで、ユーザーは通常、以下の操作を行うことができます。
ノードグラフの利用が増えるにつれ、ユーザーフレンドリーなインターフェースの作成への注目が高まっています。これらの新しいインターフェースは、多くの場合、ユーザーインターフェースの専門家やグラフィカルデザイナーによって設計されています。以下は、アーティストやデザイナーによって設計されたユーザーインターフェースの一部です。

グラフ理論の多くの理論的成果は、特にトポロジーに関して、ノードグラフにも適用できます。ノードが互いにリンクされてグラフを形成するこの分野は、よく研究されています。
ノードグラフの評価において特に懸念されるのは、サイクルです。ノードグラフにサイクルが存在する場合、ノードはリンクをたどって継続的に実行されるため、評価は永遠に終わりません。これらの問題を回避するために、多くのノードグラフアーキテクチャは、有向非巡回グラフと呼ばれるグラフのサブセットに限定されています。

ソフトウェア設計におけるノードグラフアーキテクチャの活用は、映画業界やビデオゲーム業界で特に人気があります。上の図は、動画編集・制作ツールの簡略化されたユーザーインターフェースを示しています。ノードは長方形で表され、曲線(ベジェ曲線)で相互に接続されています。このソフトウェアの動作モデルでは、動画シーケンスは線を通して次のノードに渡され、各ノードが動画シーケンスに何らかの追加変更を加えます。この例では、1つの動画が2D変換され、もう1つの動画がピクセル化され、最終的に両方のストリームが結合されます。
以下は、映画およびビデオゲーム業界でノード グラフ アーキテクチャを使用しているソフトウェアの例です。

ソフトウェア設計におけるノードグラフアーキテクチャの使用は、近年、機械学習アプリケーションで非常に人気が高まっています。上の図は、3層で構成されたシンプルなニューラルネットワークを示しています。3層とは、入力層、隠れ層、出力層のことです。各層の要素は重みであり、他の層の重みに接続されています。推論中、機械学習アルゴリズムは、前の層の重みに対する一連の機能評価を通じて、出力層の重みを評価します。トレーニング中、機械学習アルゴリズムは最適化を使用して損失関数を最小化します。損失関数は、出力層の重みと期待値の差に依存します。ノードグラフは、これらのニューラルネットワーク層を視覚化、構成、デバッグするために使用されます。
以下は、ノード グラフのグラフィカル インターフェイスなしでノード グラフ アーキテクチャを使用する機械学習ソフトウェアの例です。
以下は、ノードグラフアーキテクチャを使用した機械学習ソフトウェアの例です。
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)が必要です
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)が必要です
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)が必要です{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)が必要です{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)が必要です