MathLink(TM) は Mathematica と双方向通信する C 言語のライブラリ。 Ruby/Mathematica はこれを wrap した Ruby 拡張ライブラリです。 とはいえ、全部の関数を実装してるわけじゃないです。それは課題です。
しかし、用意されているごくわずかなメソッドだけで、Mathematica と 会話して計算を行なうことができます。 MathLink 万歳。
使い方ですが、Todd のチュートリアル <URL:http://www.mathsource.com/cgi-bin/msitem?0206-693> と Ruby/Mathematica のソースを読んで自分で理解して下さい。
というわけにもいかないので、このドキュメントを用意しました。 実際 Todd のチュートリアルは C 言語のライブラリ MathLink の使い方 を説明しているので、 Ruby/Mathematica でどう書くかを知らないと 使えないわけです。(とはいえ、拡張ライブラリの作法にならって、 C 言語の仕様をできるだけ忠実に守っているつもりです)
ま、何かサンプルを見ながら説明するほうが、説明する側からすれば楽です。 さっそく n 番目の素数を求めるプログラムを準備致しました。 素数ってなんだよ、おいとか思う人もいるかもしれませんが、 Ruby/Mathematica を使う上では本質ではないので、無視して下さい。 というか、数字を引数として、数字を返す関数が一番書くのが簡単だったので、 僕の趣味でとりあげたまでです。
このサンプルは ../samples/prime.rb に置いてありますので、 一所懸命タイプしなくても結構です。使い回して下さい。 説明のためにコメント文が入っています。そのため見にくいかもしれない。
# prime.rb for Unix # one of the sample Ruby/Mathematica # -- *** 1 *** -- require 'mathematica/mathlink' include Mathematica include MathLink # --- *** 2 *** --- argv = ['-linkname', 'math -mathlink'] link = MathLink.new.open(argv.size, argv) # --- *** 3 *** --- print 'Please type positive number:' num = STDIN.gets # --- *** 4 *** --- link.put_function('Prime', 1) link.put_integer(num) link.end_packet # --- *** 5 *** --- link.new_packet while(link.next_packet != RETURNPKT) # --- *** 6 *** --- printf "%d-th prime number is %d.\n", num, link.get_integer exit
これだけで、 num 番目の素数が手に入ります。Mathematica って便利だなあ。 もちろん素数だけじゃなくてうんざりする積分とか行列演算とかまあ、 考えられるほとんどの計算は Mathematica で計算できるわけですね。
次の章で、詳細を述べます。わざわざコメントを 6つもつけたんだし。
Ruby/Mathematica の MathLink を直接いじるためのインターフェースを使う 宣言です。
# -- *** 1 *** -- require 'mathematica/mathlink' include Mathematica include MathLink
ま、おまじないみたいなもんです。
次もおまじない。おまじないばかりでめげるかもしれませんが。
# --- *** 2 *** --- argv = ['-linkname', 'math -mathlink'] link = MathLink.new.open(argv.size, argv)
配列 argv には Mathematica の起動オプションが入っています。 なんだよそれ、と調べたくなった人は Mathematica のヘルプでも見てみましょう。 Mathematica のマニュアルにはうんざりするほどいろいろなオプションが載ってます。
Windows や Macintosh から起動する場合はオプションが違うので注意して下さい。 でも、Ruby/Mathematica version 0.0.1 ではそもそも Windows/Macintosh で動くか どうかなんて知らないので、いいよね。(動くはずだけど)
英語で書いたドキュメントと同じにしたかったので、 英語で聞いてきます。ごめん。
# --- *** 3 *** --- print 'Please type positive number:' num = STDIN.gets
説明のためにシンプルな例にしたけど、 Ruby/Tk で作った電卓だろうが、 Ruby/SQL で尋ねたデータベースだろうが、WebのCGIだろうが、入力をとれる ことに思いを馳せてほしい。(作者としては)
たといシンプルであれ、Ruby の正規表現を使えたりするわけで、 ここらへんが C 言語の MathLink を使ったり、Mathematica そのものを使うのと 違うところだ。注目してほしい。
今回は僕の趣味で素数を計算することにしたので、 Mathematica 関数の Prime を送ることにする。引数は一つなので 1 をくっつける。 ついで、引数を送る。そしたら、もう送るものはないので end_packet を投げる。
# --- *** 4 *** --- link.put_function('Prime', 1) link.put_integer(num) link.end_packet
これが、 MathLink の作法なのだ。文句があるかもしれないが守ってほしい。
Mathematica は一瞬で答を返してくれるけど、プログラムでは待つルーチンを 書かないといけません。
# --- *** 5 *** --- link.new_packet while(link.next_packet != RETURNPKT)
これはすごくシンプルに待つ例。 RETURNPKT がくるまでパケットを読み飛ばす。 本当はすべてのパケットに意味があるんだけど、今回は結果だけ欲しいのと、 説明を簡単にするために読み飛ばしちゃう。
無事、答をもらえます。
# --- *** 6 *** --- printf "%d-th prime number is %d.\n", num, link.get_integer
出力についても Ruby の強力な機能を使えることに注意して欲しい。
../samples ディレクトリを見て下さい。 MathLink の C ライブラリのあったパス(インストールするときに探したあれです) のそばに C 言語で書かれたサンプルがあるんですが、それを Ruby に翻訳して おきました。 Ruby のおかげですごくシンプルになってるので喜んでもらえたら 嬉しいなあ。
Rubyについて
MathLinkについて
IRC で聞いて下さい。 メールをくれてもいいです。 でも、反応は悪いかも。作者はメールの返事が遅いことでかなり有名です。 ごめんなさい、ごめんなさい。
大歓迎リスト:
その他、ありとあらゆる作者への善意。
池上 大介 IKEGAMI Daisuke <URL:daisu-ik@is.aist-nara.ac.jp>
Last modified: "Sun Jun 10 20:56:20 2001"