2009-10-02[n年前へ]
■IronRubyとMathematica Playerの良い組み合わせ方を考える
さて、.NETで動くRubyであるIronRubyと無料で使うことができるMathematica Playerを組み合わせて遊んでいると、とりあえずは、Rubyの中で数式処理結果を使いたければ、EvaluateToInputFormを使って評価を行い、人間が評価結果を眺めたければ、EvaluateToOutputForm を使って評価を行うのが便利だ、という当たり前の事実に突き当たります。
たとえば、こんなコードを書いてみます。4 x+3==0 という1次方程式を解くだけのコードです。
include System require 'Wolfram.NETLink' include Wolfram::NETLink kernelLink=MathLinkFactory.CreateKernelLink() kernelLink.WaitAndDiscardAnswer() result=kernelLink.EvaluateToInputForm( "Solve[4 x+3==0,x]", 0) puts result kernelLink.closeこのスクリプトを走らせると、
{{x -> -3/4}}という風に答えが返ってきます。こういった形式で答えが返ってくれば、このMathematicaによる数式処理結果を用いてRubyの中で(xを-3/4で)置換を行い何か処理を実行させる・・・といった使い方がいくらでも簡単にわかりやすく書けそうです。 これが、もし EvaluateToInputForm をEvaluateToOutputForm に入れ替えれてみたとするならば、
3 {{x -> -(-)}} 4という答えが返ってくることになります。もちろん、こちらの記述の方が人間はわかりやすいですが、Ruby中で数式評価結果を使おうとすると、これでは不便極まりない表記としか言いようがありません。(もちろん、MathematicaですらOutputFormで出力した結果を直接再利用することはできません)
Mathematica と IronRuby を上手く組み合わせると、結構面白いことができそうです。久しぶりにATOKの機能拡張であるAmetMultiでも引っ張り出して使ってみるか、それともATOK for Windows 無償試用版でもダウンロードしてみて面白い使い方ができないかどうか、少し挑戦してみることにしましょうか…。
2009-10-03[n年前へ]
■「IronRuby」+「Mathematica Player」=「∞の可能性」
まだまだ、「(.NETで動くRubyである)IronRubyと(無料配布されている)Mathematica Playerの組み合わせ技」にハマっています。素晴らしく楽しく使うことができる言語環境Mathematicaと、やはり素晴らしく便利なRubyと、そして(多分便利な).NETを一緒に用いることができるというのは、とてもエキサイティングな体験だからです。
今日は、まずは「Mathematicaの使い方」を眺めながら、クラスタ分析をIronRuby+Mathematica Playerでなぞってみました。
include System require 'Wolfram.NETLink' include Wolfram::NETLink kernelLink=MathLinkFactory.CreateKernelLink() kernelLink.WaitAndDiscardAnswer() result=kernelLink.EvaluateToOutputForm( 'datarecords = { {"Joe", "Smith", 158, 64.4}, {"Mary", "Davis", 137, 64.4}, {"Bob", "Lewis", 141, 62.8}, {"John", "Thompson", 235, 71.1}, {"Lewis", "Black", 225, 71.4}, {"Sally", "Jones", 168, 62.}, {"Tom", "Smith", 243, 70.9}, {"Jane", "Doe", 225, 71.4}};', 0) result=kernelLink.EvaluateToOutputForm( 'FindClusters[Drop[datarecords, None, {1, 2}] -> datarecords]', 0) puts result kernelLink.closeこうコードを書くと、各人の身長と体重のデータを用いて、それらの人を何グループかにクラスタリングを行うことが簡単にできます。たとえば、こんな結果が返ってきます。
{{{Joe, Smith, 158, 64.4}, {Mary,Davis, 137, 64.4}, {Bob, Lewis, 141, 62.8},{Sally, Jones, 168, 62.}}, {{John,Thompson, 235, 71.1}, {Lewis, Black, 225, 71.4}, {Tom, Smith, 243,70.9}, {Jane, Doe, 225, 71.4}}}見事にクラスタリングされています。もちろん、これは、Mathematicaのマニュアルそのままのコードです。けれどそんな処理をRubyで行うことができて、その結果をRubyでさらに使うことができるのはとても便利です。
あるいは、
include System require 'Wolfram.NETLink' include Wolfram::NETLink kernelLink=MathLinkFactory.CreateKernelLink() kernelLink.WaitAndDiscardAnswer() result=kernelLink.EvaluateToOutputForm( 'FindShortestTour[ {{4, 3}, {1, 1}, {2, 3}, {3, -5}, {-1, 2}, {3, 4}}]', 0) puts result kernelLink.closeなんていうコードを書けば、二次元座標群を「どうすれば最短時間(距離)で巡ることができるか?」という巡回セールスマン問題を解くことができます。もちろん、答えはすぐ返ってきて、
{11 + Sqrt[2] + Sqrt[5] + 3 Sqrt[10], {1, 3, 5, 2, 4, 6}}というように、「最短距離」と「どのように点(都市)を廻れば良いか」がたちどころにわかります。
クラスタ分析、巡回セールスマン問題・・・ありとあらゆる問題を、IronRubyとMathematica Playerのタッグは解いてくれます。「IronRuby」+「Mathematica Player」を使っていると、「∞の可能性」を実現できるような「錯覚」を覚えます
2009-10-04[n年前へ]
■IronRubyとMathematica Playerで経済データも自由自在
本当に、「(.NETで動くRubyである)IronRubyと(無料配布されている)Mathematica Player」を組み合わせたツールの可能性は無限大だ、と思います。しかも、その組み合わせが無料だというところがまた素晴らしいです。素晴らしすぎて、「そういう実装でウルフラム・リサーチは良いと考えているのだろうか?」と疑問に思ってしまうくらいです。
今日の例題は、MathematicaのCountryData関数を使って、日本の最近40年間くらのGDP(国内総生産)を習得してみることにします。書くコードはこんな感じです。
include System require 'Wolfram.NETLink' include Wolfram::NETLink kernelLink= MathLinkFactory.CreateKernelLink() kernelLink.WaitAndDiscardAnswer() gdp=kernelLink.EvaluateToInputForm( 'CountryData["Japan", {{"GDP"}, {1970, 2008}}]', 0) puts gdp kernelLink.closeこれで、1970年から2008年までの日本の国内総生産(GDPデータ)が時系列的に手に入ります。ちなみに、結果はこういう形式で返ってきます。
{{{1970, 1, 1, 0, 0, 0}, 2.0295777757538376*^11}, {{1971, 1, 1, 0, 0, 0}, 2.2925 011052164844*^11}, {{1972, 1, 1, 0, 0, 0}, 3.0359415844215283*^11}, {{1973, 1, 1 , 0, 0, 0}, 4.124671054658262*^11}, {{1974, 1, 1, 0, 0, 0}, 4.578535174149201*^1 1}, {{1975, 1, 1, 0, 0, 0}, 4.978680032023408*^11}, {{1976, 1, 1, 0, 0, 0}, 5.59 553536053367*^11}, {{1977, 1, 1, 0, 0, 0}, 6.886633644946532*^11}, {{1978, 1, 1, 0, 0, 0}, 9.675983051549285*^11}, {{1979, 1, 1, 0, 0, 0}, 1.0071187368835983*^1 2}, {{1980, 1, 1, 0, 0, 0}, 1.0552047308073224*^12}, {{1981, 1, 1, 0, 0, 0}, 1.1 662277105414326*^12}, {{1982, 1, 1, 0, 0, 0}, 1.0838309489751625*^12}, {{1983, 1 , 1, 0, 0, 0}, 1.182236662061611*^12}, {{1984, 1, 1, 0, 0, 0}, 1.258002926042118 4*^12}, {{1985, 1, 1, 0, 0, 0}, 1.3467326711952527*^12}, {{1986, 1, 1, 0, 0, 0}, 1.9954327828900427*^12}, {{1987, 1, 1, 0, 0, 0}, 2.4200293838043384*^12}, {{198 8, 1, 1, 0, 0, 0}, 2.9383777035023525*^12}, {{1989, 1, 1, 0, 0, 0}, 2.9401349260 95067*^12}, {{1990, 1, 1, 0, 0, 0}, 3.018112125973376*^12}, {{1991, 1, 1, 0, 0, 0}, 3.4512768484608447*^12}, {{1992, 1, 1, 0, 0, 0}, 3.766884938703116*^12}, {{1 993, 1, 1, 0, 0, 0}, 4.3237911294441895*^12}, {{1994, 1, 1, 0, 0, 0}, 4.76016480 3785754*^12}, {{1995, 1, 1, 0, 0, 0}, 5.24425055236488*^12}, {{1996, 1, 1, 0, 0, 0}, 4.620457424448448*^12}, {{1997, 1, 1, 0, 0, 0}, 4.2337825304782827*^12}, {{ 1998, 1, 1, 0, 0, 0}, 3.8422661071666924*^12}, {{1999, 1, 1, 0, 0, 0}, 4.3476506 956717817*^12}, {{2000, 1, 1, 0, 0, 0}, 4.649614280538379*^12}, {{2001, 1, 1, 0, 0, 0}, 4.0877256836277627*^12}, {{2002, 1, 1, 0, 0, 0}, 3.904822831192468*^12}, {{2003, 1, 1, 0, 0, 0}, 4.231254569386364*^12}, {{2004, 1, 1, 0, 0, 0}, 4.58488 9737074735*^12}, {{2005, 1, 1, 0, 0, 0}, 4.559019715540946*^12}, {{2006, 1, 1, 0 , 0, 0}, 4.434993203595208*^12}}つまり、時間と国内総生産を並べたリスト形式で返ってきます。
もちろん、日本のGDPだけでなく、任意の国のGDPでも、どこかの企業の株価でも、それがどこのマーケットでもいつの時代でも、(基本的には)関数一つで手に入るようになります。もちろん、入手したデータの処理をすることだって、至極簡単です。経済問題をコメンテーターのように評論している文章を見ると、「データを自分で扱い、自分で咀嚼・消化してから話して欲しいものだ」と思ったりしますが、そういった作業を簡単に自分の手で行うことができます。競馬や競輪、はたまた、競艇予想のごとく、経済や株価の行方を実証・予想してみるのにも、IronRuby+Mathematica Playerの組み合わせなら簡単至極にデータ九取得・処理を行うことができます。
これが、最近のMathematicaの便利さでもあり、無料のMathematica Playerを使うことでそのMathematicaの機能を自由にシームレスに使うことができる「(.NETで動くRubyである)IronRubyと(無料配布されている)Mathematica Player」の組み合わせの凄さでもあります。
「データの見せ方」「ビジュアライズ」はとても大切です。けれど「データそのものを手に入れること」「データを加工・処理すること」の重要性は、決して「ビジュアライズ」に劣るものではありません。基本的には、それらすべてが優れていることが理想的であり、現実的には、それらの中で一番弱い部分が相和の効果・力を決めると思っています。
無料で使うことができる Mathematica Playerの一番の便利さ・凄さは、「データ取得」「データ処理機能・言語機能」に関して、本家本元のMathematicaに比べて決して劣っているわけでなく。基本的にはほぼそのままの機能を使うことができるようにしている、というところにあるように思えます。
Rubyから透過的に、Mathematicanを使って入手・計算可能なデータをそのまま自由自在に使うことができる、というのは意外なほどに凄まじい機能拡張だとは思いませんか…?
2009-10-06[n年前へ]
■無料配布MathematicaカーネルとNET Framework実装IronRubyでグリッド・Matheatica計算環境は5分で作れる
今日も、「無料配布のMathematicaカーネルと(やはり同じく無料で使うことができる).NET Framework上で動作するRubyであるIronRuby」を使って色々なことをしてみよう、という話の続きです。もちろん、さらにパワーアップした可能性を追求してみたいと思います。
数式処理環境であるMathematicaには、オプション製品としてgridMathematicaという製品があります。Mathematicaでグリッド・コンピューティングを実現する、というようなネーミングの製品ではありますが、実際にはMathematicaで並列(パラレル)計算を実現するための拡張オプションです。価格は・・・眼の球が10cmくらいは前に突き出てしまうほどのお値段になっています。
さて、「無料配布のMathematicaカーネルと(やはり同じく無料で使うことができる).NET Framework上で動作するRubyであるIronRuby」を使えば、色々なことができるわけです。そこで、今日はgridMathematicaが可能にするようなことを、誰でも入手可能なツールで実現してみることに挑戦してみようと思います。
本来ならば、分散処理環境をRubyで実装したdRubyなどを使いたいところですが、いくつかの理由から、今日は(IronRubyで動作する)ごくごく普通のRubyライブラリを使って、Mathematicaカーネルをネットワーク上で並列計算させることができるコードを書いてみることにします。
まずは、(無料配布されている)Mathematicaカーネルを扱うサーバ・アプリを書いてみます。といっても、単にこれだけのコードです。
class Mathematica require 'Wolfram.NETLink' include Wolfram::NETLink def initialize() end def open @kernelLink=MathLinkFactory.CreateKernelLink() @kernelLink.WaitAndDiscardAnswer() end def do(command) @kernelLink.EvaluateToInputForm(command, 0) end def close @kernelLink.EvaluateToInputForm('MVClose[]', 0) end end require 'webrick' include WEBrick m=Mathematica.new m.open s=HTTPServer.new(:Port=>ARGV[0].to_i, :DocumentRoot=>'', :RequestTimeout=>600, :MaxClients=>1) s.mount_proc("/restart") {m.close;m.open} s.mount_proc("/shutdown") {s.shutdown} s.mount_proc("/"){|req,res| res.body='use /evaluate/command' if /evaluate\/(.+)$/=~req.path res.body=m.do($1) end } trap("INT"){m.close;s.shutdown} s.startこれは、例題のため、多くの処理をはしょっていますが、例題の範囲ではきちんと動作するコードです。ひとことで言えば、URIを介して渡されたコマンドを実行した結果を返すWEBサーバアプリです。
ちなみに、このスクリプトを mathematicaServer.rb と名付ければ、
ir.exe mathematicaServer.rb 80という具合で、ポート80番でコマンドを待ち受けるWEBサーバが起動します。あるいは、
ir.exe mathematicaServer.rb 81とすれば、ポート81番でコマンドを待ち受けるWEBサーバが起動します。複数台のPC上で実行しても構いませんし、あるいは、(テスト用として)一台のPC上で複数のサーバを実行しても構いません。もちろん、多数台のPC上でサーバー群を立ち上げる方が高性能になるのは言うまでもありません。
さて、ここまで来たら、後はそれらのサーバ群に"Mathematica"による並列計算をさせるスクリプトを書いてみることにしましょう。たとえば、こんな感じです。
require 'pp' require 'net/http' Net::HTTP.version_1_2 result=[] threads = [] command='2+2' uri=['localhost','localhost'] port=[80,81] 2.times do |i| threads.push( Thread.new do Net::HTTP.start(uri[i],port[i]){ |http| r=http.get('/evaluate/'+command); result<<r.body;} end ) end threads.each do |t| t.join end pp resultこのスクリプトをmathematicaController.rbとでも名付け、
ir.exe mathematicaController.rbという風に起動してやります。もちろん、この並列計算を行わせるコントローラ側はIronRubyである必要はありませんから、
ruby mathematicaController.rbでも構いませんし、計算サーバ群は結局のところ単なるWEBサーバ群なのですから、Rubyプログラムである必要もありません。
このスクリプトの内容はとても簡単です。上の例であれば、ローカルPC上で動いている、2つのMathematicaカーネルを使ったサーバに対して、"2+2"という計算をパラレル(並列)に投げて、その結果を受け取りまとめているわけです。その結果、
["4","4"]という計算結果が最終的には手に入ることになります。httpを使い、また、コマンドのをエンコード処理を行わずGETで投げつけていますが、それはあくまで簡単なテスト用であるためです。
Mathematicaという最高の開発環境を使い、並列計算も可能にし、さらに、そういったプログラムを自分で書くことができる・・・なんて、とても楽しそうではありませんか?この「無料配布のMathematicaカーネルと(やはり同じく無料で使うことができる).NET Framework上で動作するRubyであるIronRubyを使って、遊んでみよう」というシリーズ!?の可能性はまだまだ広がりそうです。
さまざまなデータに対し透過的にアクセスが可能で、並列計算もとても簡単にできたなら、色々なことができそうだ、と思えますよね?無料配布のMathematicaカーネルとNET Framework実装IronRubyでグリッド・Matheaticaコンピューティングのプログラムは、実際のところ5分程度で作ることができます。
無料配布のMathematicaカーネルなのに、それが実に多くのことができることに驚かされます。少し時間ができたとき、こんなプログラムを作って遊んでみるのはいかがでしょうか。
2009-10-12[n年前へ]
■引数付きのMathLinkFactory.CreateKernelLinkの書き方
無料配布のMathematicaカーネルを(やはり同じく無料で使うことができる).NET Framework上で動作するRubyであるIronRubyから使うときに、引数無しの"MathLinkFactory.CreateKernelLink() "を使うと、毎回ダイアログが開き"MathKernel.exe"のパスを尋ねられます。そして、毎回パスを入力します。
その作業は、やはり面倒くさいものです。そこで、「MathLinkFactoryでリンクを作成する」といったドキュメントを頼りに、(「ありがち」なMathematicaカーネルのパスを指定して)自動でMathematicaカーネルと通信を開始するスクリプトを書いてみます。(大文字小文字が最初の記事投稿では間違えていたので、mathkernel.exeからMathKernel.exeへと修正してあります)
require 'pp' class Mathematica require 'Wolfram.NETLink' include Wolfram::NETLink def initialize @kernelLink=MathLinkFactory.CreateKernelLink( "-linkmode launch -linkname 'C:\\Program Files\\Wolfram Research\\ Mathematica Player\\7.0 \\MathKernel.exe'") @kernelLink.WaitAndDiscardAnswer() end def do(command) @kernelLink.EvaluateToInputForm(command, 0) end def close @kernelLink.EvaluateToInputForm( 'MVClose[]', 0) end end m=Mathematica.new pp m.do('Table[i,{i,1,10}]') m.closeCreateKernelに引数をつけただけですが、Mathematica Playerのインストール先が決まっているなら、とても便利で手間要らずになるのでここにメモしておくことにします。