2009年3月1日日曜日

swig boost_random 今度はrubyで

 そもそも自分が使わないものを作ってどうすんだ?って部分はありますが、いつかは swig ってみたいと思っていたのも事実です。で、需要の方がサッパリわかりませんが、swig でベースを書いても案外自分の使いたい言語に落とし込む cmake 等の作業の方で、敷居が高いのかもしれない?と思って、今回は ruby してみました。

 CMakeLists.txt の後半 Perl 部分を以下のように書き換えます

FIND_PACKAGE (Ruby)

FIND_PACKAGE (SWIG REQUIRED)
INCLUDE (${SWIG_USE_FILE})

SET (CMAKE_SWIG_FLAGS "")
SET_SOURCE_FILES_PROPERTIES (random.i PROPERTIES CPLUSPLUS ON)
SWIG_ADD_MODULE(boost_random ruby random.i random.cpp)

INCLUDE_DIRECTORIES (${RUBY_INCLUDE_PATH} ${INCLUDE_DIRECTORIES})

IF (WIN32)
IF (NOT RUBY_LIBRARY)
SET (RUBY_LIBRARY "c:/program files/ruby-1.8/lib/msvcrt-ruby18.lib")
ENDIF (NOT RUBY_LIBRARY)
ENDIF (WIN32)
IF (RUBY_LIBRARY)
SWIG_LINK_LIBRARIES(boost_random "${RUBY_LIBRARY}")
ENDIF (RUBY_LIBRARY)


続いて runme.rb です。

require 'boost_random'

print "Uniform_mt19937\n";
mt19937 = Boost_random::Uniform_mt19937.new( 32 );
100.times do
print mt19937.get().to_s + ",";
end;

print "\Exp_necuyer1988\n";
ecuyer = Boost_random::Exp_ecuyer1988.new( 3, 4, 2.0 );
100.times do
print ecuyer.get().to_s + ",";
end;

print "\nNormal_lagged_fibonacci2281\n";
fibo = Boost_random::Norm_lagged_fibonacci2281.new( 50.0, 10.0 );
100.times do
print fibo.get().to_s + ",";
end;

print "\nLognormal kreutzer1986\n";
kreu = Boost_random::Log_kreutzer1986.new( 5, 0.5, 2.0 );
100.times do
print kreu.get().to_s + ",";
end;

 クラス命名規則が煩いな…と思いました。swig だと、いろんな言語を対象にする訳ですが、中には大文字小文字を区別しない言語やアンダーバーを使えない言語もあるかもしれません。

 尚、テストは windows 上の ActiveScriptRuby で行いました。msvc6.0 が必要です。どうしても…という場合は、config.h

#if _MSC_VER != 1200
//#error MSC version unmatch: _MSC_VER: 1200 is expected.
#endif

をすれば動作しますが、ランタイムのアロケータが異なっているために、メモリリークを引き起こしかねないので、やめましょう(ruby の内部構造を知らないので、可能性の話です)。

0 件のコメント: