平成7年度 委託研究ソフトウェアの 成果ソフトウェア

(16) 並列論理型言語を用いた最尤法による分子進化系統樹作成プログラムに関する研究

研究代表者:國藤 進 教授
      北陸先端科学技術大学院大学 情報科学研究科


The molecular evolution inference software


[はじめに・論理型言語による自然科学におけるデータ解析の意義]

論理型言語は一時期万能の「枠組」として期待され、それに関係する様々な研 究がなされてきました。現在もその研究は続いています。しかしながら、一時 期の熱狂に比べると、論理型言語への過大な期待は消え失せ、その短所も指摘 されるようになってきました。

ある意味で論理型言語は冬の時代を迎えたとも言えます。しかし我々は感傷的 になる必要はありません。イデオロギーに走っていた論理型言語に対する人々 の態度が、ようやく冷静なものになりつつあることを意味していると私は思う からです。今後は、論理型言語の本質を理解した人々によって、論理型言語は 地道に研究されてゆくことでしょう。このことはむしろ喜ぶべきことだと思い ます。

従来、多量のデータ解析、とくに浮動小数点演算を多量に含むような数値計算 に論理型言語が使われた例はあまりありませんでした。そもそも実装された論 理型言語は、大規模な計算機資源を用意して初めてまともに機能する、いささ か扱いにくい処理系であることが多かったのです。当然のことながら高速な処 理がすべてあるような大規模データ解析のような仕事では、論理型言語の処理 系の「重さ」は大きな足枷となることが予想されました。したがって、スピー ド至上主義の人々が論理型言語使った大規模なデータ解析を考えることはまれ であったわけです。

このこと、「足枷」の存在は現在でも本質的には変わっていません。非常にポー タブルな処理系klicでさえ、同一の処理を他の手続き型言語で記述した場合と 比較すると、要求される計算機資源は大きく、処理効率は必ずしも高くありま せん。

しかしながら、これは我々が限られた計算機資源しか持ち得ない場合の話です。 現在、ハードウェアの価格はどんどん下がり、我々は望むだけ多くのハードウェ アを手にすることができます。「ハードウェアはただ」の時代がもうそこまで 来ているのです。このような状況下では、多くの計算機を結合し、処理を分散 させようという考え方が自然に出てきます。しかしこうなると、今度はこのよ うな分散環境で正しく機能するソフトウェアを書く仕事が問題になってきます。 それは決して簡単なことではありません。一般にこのような分散環境で並列動 作するソフトウェアは複雑で、間違いを含みやすいからです。

論理型言語は本質的にこのような並列動作を含むプログラムの記述に向いてい ると考えられます。というのは、手続き的な概念を含まないために、やっかい な同期の問題を意識しないで済むからです^*。物理的な並列処理と理論上の並 列実行可能性を切り離して考えられるのも大きな特徴です。いったん論理型言 語で記述されたプログラムは、様々な並列処理の形態を、アルゴリズムを変え ることなく取ることができるのです。

*論理型言語の動作を手続き的に解釈すると、それは同期を取りながらの並列 動作に他ならないことがわかります(それだけに手続き的な解釈は困難を究め るわけですが)。

どんな高速な計算機も、完成した瞬間から旧式になることを忘れてはいけませ ん。ある時点でチューンナップされた高速計算器用のプログラムを書いても、 その計算機が旧態依然としたものとなれば、そのプログラムの寿命もそこで尽 きてしまいます。むしろそれよりは、ハードウェアに依存性の少ない、より抽 象化されたソフトウェアを書くべきです。そうすればソフトウェアは生物の遺 伝子のように、あるハードウェアが滅んでも、次から次へハードウェアを乗り 換えて生き延びることができます(おそらく進化しながら!)。論理型言語は、 そのような目的にうってつけの言語と言えます。

自然科学の研究において、どのような情報処理が要求されるかは自然科学者自 身にもわかっていないことが多いのです。したがって、彼らは自らの手で、試 行錯誤を経て、データ解析やシミュレーションのためのコードを書くことが多 いのです。彼らの興味は論理であって、実装のためのテクニックではありませ ん。論理がすなわちコードとなる論理型言語の特徴は、実は自然科学の研究に おいてもっとも有用であると考えられます。

DeepForestはこのようなことを踏まえて、おしきせのアプリケーションを提供 するというよりは、進化に興味のある自然科学者が自らプログラムを書く場合 に、有用なモジュール(述語のセット)を提供することに主眼を置いています。

私自身のモットーは「(コンピューターを使うということ)≡(ソフトウェアを書く ということ)」です。

[機能]

DeepForestは分子進化系統樹を推定するためのソフトウェアです。DeepForest は分子進化系統樹を作成するために必要な様々なモジュールを含んでいます。 あなたはこれらのモジュールをあなた自身の書いたプログラムから呼び出すこ とで、より複雑なデータ解析を行うことができます。また、DeepForestはklic を処理系として用いているため、強力な分散処理機能を持っています。つまり、 DeepForestはスーパーコンピューターからパーソナルコンピュータまでをプラッ トフォームとして横断的に利用することができるのです。

実験科学が主流である生物学において、ひとつだけ例外的な分野があります。 それが進化学です。生命は非常に長い時間をかけてゆっくりと進化してきたと 考えられるので、我々は実験室で進化という現象を再現することができません。 しかし、進化という概念を抜きに生命現象を扱うことは不可能です。なぜなら、 この概念は生命現象の定義のひとつであり、様々な生物種の生命現象を統一的 に扱うための鍵であるからです。

では私達は進化という現象をどう「科学的」に扱ったらよいのでしょうか。た とえばあなたが実験で出したデータに進化的な側面から考察を加えたい場合、 あなたはそのデータをどう処理したらよいのでしょうか。もっとも合理的な方 法は、手元にあるデータと参照可能なデータから、直接は観察することのでき ない進化という現象を「定量的」に推定することでしょう。このような考えの もとに発展してきた学問が分子進化遺伝学です。DeepForestはこの分子進化遺 伝学で培われた様々なデータ解析の手法の中で、特に重要であると考えられる 系統樹の推定手法ををモジュールという形でてユーザに提供します。また、単 なるデータ解析にとどまらず、進化的現象のシミュレーションを行うためのモ ジュールも含んでいます。

DeepForestは実際の分子進化研究の現場で使用されたプログラムをライブラリ としてまとめたものであり、効率や巨大なデータを扱える点に秀でています。

DeepForestは平成7年および8年の二年計画の委託研究により開発されます。今 回、中間報告の意味も兼ねて、DeepForestのプロトタイプ版を公開することに なりました。プロトタイプ版はいくつかのモジュールを結合して作った小さな 最尤系統樹推定プログラムで、go/0と仮称されています。この名前は生命の原 初(=Origin=(time=0))を見てみよう、という意味を含んでいます。

go/0は主にKL1の処理系であるklicの性質(主に浮動小数点演算について)を調 べるために書かれました。実用性はまったく度外視したため、きわめて小さな データしか扱うことができません。さらに単純な再帰構造を多用しているため に、処理速度が遅くなっています。その代わり、実に素直なアルゴリズムを採 用しています。klicのデバッガでgo/0トレースをしてみれば、最尤推定の様子 がよくわかると思います。

[go/0の動作環境]

基本的な動作環境はklic 2.002の実装してあるUNIXです。つまり、モジュール はklic 2.002でコンパイルする必要があります。また、分散環境で並列処理を させる場合はPVMも実装してある必要があります。

[go/0のファイル構成]

アーカイブファイルを展開すると、以下のファイルができます。

	advertise.txt	DeepForestの紹介
	DeepForest.doc	使用説明書
	Document	この研究の発表先一覧、著作件者氏名など
	Readme		DeepForestに関する一般的な説明(英文)
	pimos		pimos用ディレクトリ
	unix		unix用ディレクトリ
ディレクトリunixは以下のファイルを含んでいます。
--------------------------------------------------------------------
サイズ(bytes)	ファイル名		記述	
--------------------------------------------------------------------
 2228		calculate.kl1	簡単な数式の値を評価するためのモジュ
				ールです(go/0では使っていません)。

21391		clike.kl1	条件付き尤度を計算するためのモジュー
				ルです。
 8410		get_seq.kl1	アミノ酸配列データをgo/0が処理できる
				ように変換します。
 2712		get_seq_2.kl1	アミノ酸配列データをgo/0が処理できる
				ように変換します(go/0では使っていません)。
 2708		go.kl1		go/0そのものです。
 1969		list.kl1	組み込みのモジュールにはないような、
				リストを扱うための述語を含むモジュー
				ルです。
 1479		max.kl1		より大きな値を持つ数式を選択します
				(go/0では使っていません)。
 1457		plot_like.kl1	尤度曲面をプロットします(go/0では使っ
				ていません)。
 3449		remove_gap_site.kl1
				ギャップを含むサイトを削除します。
 4562		remove_gap_site_2.kl1
				ギャップを含むサイトを削除します
				(go/0では使っていません)。
 1168		string.kl1	組み込みのモジュールにはないような、
				文字列を扱うための述語を含むモジュー
				ルです。
  837		symbol.kl1	簡単な数式処理をするためのモジュール
				です(go/0では使っていません)。
 1570		termio.kl1	組み込みのモジュールにはないような、
				項の入出力を扱うための述語を含むモジュー
				ルです。
56823		traverse.kl1	枝長の最尤推定をするためのモジュール
				です。
11837		tree.kl1	木構造を持ったデータを扱うためのモジュ
				ールです。	
--------------------------------------------------------------------
ディレクトリpimosは以下のモジュールを含んでいます。

これらのモジュールは、PIMにアクセスできる好運な人々にだけ実行すること ができます。PIM/m(64PE)での動作を確認しています。ただし、核酸の配列デー タのみをサポートしています。

--------------------------------------------------------------------
サイズ(bytes)	name		記述
--------------------------------------------------------------------
26726		contour.kl1	尤度曲面をプロットします。
59915		traverse.kl1	枝長の最尤推定をします。
--------------------------------------------------------------------

[FTP]



www-admin@icot.or.jp