Location : Home > Languages > Perl > Package
Title : Math::ematica
Toolbox Logo

名称

 Math::ematica - Mathematica(TM) と接続するための Perl 拡張


概要

use Math::ematica qw(:PACKET :TYPE :FUNC);

警告

 これはアルファソフトウェアである。ユーザにわかるレベルでの改変があるかもしれない。
 モジュールは完全に書き換えられた。文字通り古いものは1行たりとも使っていない(聞かないでくれ−それから私はいろいろ学習したのだ ;-)  もし古い version 1.006 を使っているならユーザインタフェースが変わっていることに注意して欲しい。これで大きな悲鳴が聞こえてくるようなら互換性を持たせるような工夫を行う。
 修正や拡張の示唆は自由に。今のところ実際の業務では Mathematica を使っていないので緊急のニーズを予見できないかも知れない。インタフェースがすごいと思っても完全なドキュメント化は望めないかも。私はネイティブな英語人ではないのでAPI が安定化するまで実際のドキュメント化をするのに時間がかかるのだ。
 Linux 2.0.30 box の Mathematica 3.0.1 を用いて本モジュールを開発した。Solaris 用の Mathematica 4.0 でも動作を確認した。Mathematica の他のバージョンで稼動し、他のor does B work on other *nix では稼動しないかを知らせて欲しい。
 本モジュールは Linux 2.6 の libc-2.3.2. での Mathematica 5.0 でコンパイルしている。


説明

 The Math::ematica モジュールは MathLink(TM) ライブラリへのインタフェースを提供している。関数はエクスポートされずメソッドとして呼び出される。そのため Perl名称では 'ML' プレフィクスがはずされている。Perl は複数の返り値を扱うことができるので、メソッドは参照パラメータにおいて結果を渡す代わりに値を返すリンクからの要素を返す。
 Perl と Mathematica の間で渡されるデータの表現は Perl において括弧付きで表現される記号をのぞいてそのままである。


エクスポートされた定数

PACKET

 PACKET タグはパケット型として使用される定数を特定する。

print "Got result packet" if $link->NextPacket == RETURNPKT;

TYPE

 TYPE タグは要素型として使用される定数を特定する。

print "Got a symbol" if $link->GetNext == MLTKSYM;

エクスポートされた関数

FUNC

 現時点では FUNC タグは所与の名称に対する記号を返す symbol 関数のみを含んでいる。

$sym = symbol 'Sin';

単純なインタフェース

 メソッドは MathLink 関数への直接アクセスを可能にする。
 詳しく知らないからと言って落胆する必要はない。便利なレイヤを用意している。 ;-). 以下のメソッドでは対応する C 関数と異なる振る舞いをするときだけコメントしている。詳しくは MathLink マニュアルを見よ。

new

 コンストラクタは MLOpenArgv へのラッパである。

$ml = new Math::ematica '-linklaunch', '-linkname', 'math -mathlink';

 リンクは生成時に自動的にアクティベートされ、終了時に解放される。そのため MLCloseLink はアクセスできない。リンクを保存したければ undef または独自の変数を用いること。グローバル変数を用い、リンクを強制的に閉じなければ全体の終了時に警告を発することになる。

ErrorMessage

print $link->ErrorMessage;

EndPacket

Flush

NewPacket

Ready

PutSymbol

PutString

PutInteger

PutDouble

PutFunction

GetNext

GetInteger

GetDouble

GetString

 本メソッドは適切な MLDisownString 呼び出しを行う。

GetByteString

 本メソッドは適切な MLDisownByteString 呼び出しを行う。

GetSymbol

 モジュールは適切な MLDisownSymbol 呼び出しを行う。パッケージ Math::ematica::symbol に結果の文字列括弧つきで渡す。

Function

 リストコンテキストでは関数名と引数の数を返す。スカラコンテキストでは関数名を返す。

GetRealList

 実数の配列を返す。


便利なインタフェース

PutToken

 渡されたデータ型にしたがって単一トークンを渡す。

$link->PutToken(1); # MLPutInteger

 追加的なパラメータを渡されたら記号は MLPutFunction に変換される。

$link->PutToken(symbol 'Pi');     # MLPutSymbol
$link->PutToken(symbol 'Sin', 1); # MLPutFunction

read_packet

 現在のパケットを読み込み、ネスト化したデータ構造として返す。実装は完全ではない。しかし MLTKREAL, MLTKINT, MLTKSTR, MLTKSYM, MLTKFUNC で構成されたパケットについてはただしい。関数記号 List は自動的に削除される。そのため Mathematica での表現 List[1,2,3] は Perl での表現 [1,2,3] に変換される。
 これは過剰に便利かもしれない。

call

 メインのインタフェースを呼び出す。この呼び出しによりほとんどの処理ができる。
 構文は Mathematica における FullForm とほとんど同じである。関数名が括弧の中にあり、',' で区分されている点のみが違う。メソッドは read_packet により読み込まれたネスト化されたデータ構造を返す。

$link->call([symbol 'Sin', 3.14159265358979/2]); # 1 に近い値を返す。

 変数のテーブルを取得するには以下のようにする。

$link->call([symbol 'Table',
            [symbol 'Sin', symbol 'x'],
            [symbol 'List', symbol 'x',  0, 1, 0.1]]);

 倍精度の配列への参照を返す。
 最初の symbol はなくともよい。Symbol に対するデフォルトのマッピングの選択をしておくこと。

install

 これが見にくいのであれば install メソッドを使って Mathematica 関数を Perl 関数としてインストールしてもよい。

$link->install('Sin',1);
$link->install('Pi');
$link->install('N',1);
$link->install('Divide',2);

Sin(Divide(Pi(),2.0)) # 1 を返す。
                      # 倍精度で正確に表すには '2.0' で。;-)

 install メソッドは Mathematica 関数名・引数の数・(オプションで)Perl 関数名を引数に取る。

$link->install('Sin',1,'sin_by_mathematica');

 インストールされた関数を $link を外した後で呼び出さないこと。何が起こるかわからないので。

send_packet

call の送信部分である。式を変換して Mathematica パッケージに私、リンクを生成する。

register

 本メソッドにより Mathematica に Perl 関数を登録することができる。
 登録された関数は計算の間中利用することができる。

sub addtwo {
   $_[0]+$_[1];
}

$link->register('AddTwo', \&addtwo, 'Integer', 'Integer');
$link->call([symbol 'AddTwo',12, 3]) # returns 15

 undef を使えば引数型が決まっていない関数も登録することができる。

sub do_print {
   print @_;
}

$link->register('DoPrint', undef);
$link->call(['DoPrint',12]);
$link->call(['DoPrint',"Hello"]);

main

 Mathematica セッションを稼動させるためにインストールされた Perl スクリプトを稼動させる。Perl スクリプト try.pl が以下のようだとすると

use Math::ematica;
sub addtwo {
   my ($x, $y) = @_;

   $x + $y;
}

$ml->register('AddTwo', \&addtwo, 'Integer', 'Integer');
$ml->main;

Mathematica 内部ではこのように処理している。

Install["try.pl"]
AddTwo[3,5];

 確かに Mathematica 内部で数値を加えるほうが簡単である。DNS lookup または SQL データベース はどうだろうか。


著者

 Ulrich Pfeifer, <pfeifer@wait.de>


参考資料

 perl(1) 及び Mathematica・MathLinkのドキュメントを見よ。また本ディストリビューションの t/*.t ファイル見よ。


謝辞

 The Perl Journal の Jon Orwant、The Mathematica Journal の Nancy Blachman、Wolfram Research の Brett H. Barnhart に謝意を表したい。
 Jon は本モジュールの初期バージョンを提供してくれ、Nancy Blachman に引き合わせてくれた。彼女は Brett H. Barnhart にコンタクトを採ってくれた。彼はこの作業のための試行用ライセンスを与えてくれた。
 本モジュールを使用する際には(Mathematica のライセンスが必要なのは言うまでもないが)まだ登録していなければ The Perl Journal と The Mathematica Journal に登録して欲しい。本モジュールについてさらに読んでくれればいいが。 ;-)
 モジュールの名づけについては Randal L. Schwartz に感謝。.

 また本モジュールが Mathematica 4.0 で稼動することを確認するために Solaris box にログインさせてくれた Richard Jones にも謝意を表明する。


著作権

 Math:ematica モジュールの著作権は Ulrich Pfeifer に帰属する。
 Copyright (c) 1996,1997,1998,2000,2005 Ulrich Pfeifer. Germany. All rights reserved.

 Perl の README ファイルにおいて指定されている GNU General Public License または the Artistic License の条件の下で配布することができる。
 Mathematica 及び MathLink は Wolfram Research の登録商標である。

Toolbox Logo
Updated : 2008/10/23