設定
|
ALGLIB設定数値計算/データ処理ライブラリー ALGLIB (C++版)を Ubuntu 14.04 にインストールし,その動作確認を行いました.その時のメモです. 目次インストールの方法私のメイン PC の動作環境は,Ubuntu 14.04 です.プログラム開発は,それで GCC を使っています.このような環境でALGLIB を使うため,以下のように設定しました.
以上で,インストールというか設定は終わりです. ALGLIBを使うALGLIB はライブラリーの形で配布されていませんので,リンカーでリンクしません.ALGLIB のC++のソースファイル(先の例:/usr/local/src/alglib/*.cpp)とユーザー作成のファイルをコンパイルして,オブジェクトファイルをリンクします. サンプルプログラムダウンロードしたファイルを解凍するとマニュアルが現れます.そのマニュアル(manual.cpp.html)に含まれている「fft_real_d1 example」を例に,コンパイルと実行方法示します. ソースファイルプログラムリストを以下に示します.このプログラム(Real FFT: simple example)は,データ列 (1, 1, 1, 1)をフーリエ変換,その結果を逆変換します. 001 #include "stdafx.h" 002 #include <stdlib.h> 003 #include <stdio.h> 004 #include <math.h> 005 #include "fasttransforms.h" 006 007 using namespace alglib; 008 009 010 int main(int argc, char **argv) 011 { 012 // 013 // first we demonstrate forward FFT: 014 // [1,1,1,1] is converted to [4, 0, 0, 0] 015 // 016 real_1d_array x = "[1,1,1,1]"; 017 complex_1d_array f; 018 real_1d_array x2; 019 fftr1d(x, f); 020 printf("%s\n", f.tostring(3).c_str()); // EXPECTED: [4,0,0,0] 021 022 // 023 // now we convert [4, 0, 0, 0] back to [1,1,1,1] 024 // with backward FFT 025 // 026 fftr1dinv(f, x2); 027 printf("%s\n", x2.tostring(3).c_str()); // EXPECTED: [1,1,1,1] 028 return 0; 029 } まずは,このプログラムをコピーし,「fft_real_d1.cpp」というファイル名で保存します.このプログラムが,ALGLIB をつかったユーザーが作成するプログラムの例になっています.ALGLIB をつかうと,FFT の処理をするプログラムはたったこれだけで記述できます. リンクするALGLIB ファイル次にこのプログラムをコンパイル/リンクするために必要な ALGLIB のソースファイルを捜します.これがかなり面倒だ作業です.通常はマニュアルの「8 ALGLIB packages and subpackages」から使う ALGLIB のソースファイルを見つけ,それからインクルードするファイルを探します.深い階層でインクルードされていると探すのがかなり面倒になります.コンパイル/リンク作業でエラーが出たら,その情報から必要なファイルを探すことも可能と思われます. 具体的な例として,先に示したリスト1の「fft_real_d1.cpp」がリンクすべき ALGLIB ファイルを探します.
以上の探索により,「fft_real_d1.cpp」から実行ファイルを作成するためには,「fasttransforms.cpp」と「ap.cpp」,「alglibinternal.cpp」をリンクする必要があることが分かります. マニュアルに書かれている実行ファイル作成リンクすべき ALGLIB ファイルが分かったので,コンパイル/リンクを実行し,実行ファイルを作成します.マニュアルに書かれているコンパイル方法は,次の通りです.
さきのプログラム「fft_real_d1.cpp」であれば,「fasttransforms.cpp」と「ap.cpp」,「alglibinternal.cpp」をワーキングディレクトリーにコピーします. $ cp /usr/local/src/alglib/fasttransforms.cpp . $ cp /usr/local/src/alglib/ap.cpp . $ cp /usr/local/src/alglib/alglibinternal.cpp . 次に,すべてのソースファイルをコンパイルします. $ g++ -c fft_real_d1.cpp -I/usr/local/include/alglib $ g++ -c fasttransforms.cpp -I/usr/local/include/alglib $ g++ -c ap.cpp -I/usr/local/include/alglib $ g++ -c alglibinternal.cpp -I/usr/local/include/alglib すると,4つのオブジェクトファイル「fft_real_d1.o」と「fasttransforms.o」,「ap.o」,「alglibinternal.o」ができあがります.これらをリンクして実行ファイルを作成します. $ g++ -o FFT fft_real_d1.o fasttransforms.o ap.o alglibinternal.o すると,実行ファイル「FFT」ができあがります.実行方法とその解釈は,このページのちょっと下にある実行に示します. Makefile を使った実行ファイルの作成先に示した方法でのコンパイル・リンクの作業は,かなり面倒です,Makefile を使いこれらの作業の手間を省きます,リスト2に Make file の例を示します.この 「Makefile」とユーザーのソースファイル「fft_real_d1.cpp」を同じディレクトリーに入れます.ALGLIB のソースファイル「fasttransforms.cpp」と「ap.cpp」,「alglibinternal.cpp」は,コピーする必要はありません.そして,次のコマンドを実行します. $ make
オプション「-Wall」をつけたので,いくつかの警告(Warning)が出ますが,無視ししても問題ないです,このコマンドにより,実行ファイル「FFT」ができあがります.実行方法とその解釈は,次節の実行に示します. 001 #-------------- basic settings --------------- 002 TARGET = FFT 003 CFLAGS = -Wall 004 CC = g++ 005 INCLUDE = -I/usr/local/include/alglib 006 SRCDIR = /usr/local/src/alglib/ 007 008 #-------------- compile and link --------------- 009 $(TARGET):Makefile fft_real_d1.o fasttransforms.o ap.o alglibinternal.o 010 $(CC) $(CFLAGS) -o $(TARGET) ap.o fasttransforms.o fft_real_d1.o alglibinternal.o 011 012 fft_real_d1.o:Makefile fft_real_d1.cpp 013 $(CC) $(CFLAGS) -O3 -c -o $@ $*.cpp $(INCLUDE) 014 015 fasttransforms.o:Makefile $(SRCDIR)fasttransforms.cpp 016 $(CC) $(CFLAGS) -O3 -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 017 018 ap.o:Makefile $(SRCDIR)ap.cpp 019 $(CC) $(CFLAGS) -O3 -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 020 021 alglibinternal.o:Makefile $(SRCDIR)alglibinternal.cpp 022 $(CC) $(CFLAGS) -O3 -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 023 024 #-------------- others ------------------------ 025 .PHONY: clean 026 clean: 027 rm *.o 028 rm $(TARGET) 実行コンパイル・リンクで作成された実行ファイル「FFT」は, $ ./FFT
で実行できます.以下に実行結果を示します.
$ ./FFT
[4.000,0,0,0]
[1.000,1.000,1.000,1.000]
この結果は,次のように解釈します.
この結果を見ると,正しく計算されていることが分かります. テストファイルのコンパイルと実行ダウンロードした alglib-3.10.0.cpp.gpl.zip には,二つのテストファイルが含まれます.これを解凍すると,ディレクトリー「cpp/tests/」に,三つのファイル「test_c.cpp」と「test_i.cpp」,「test_x.cpp」ができます.このうち最初の二つがテストファイルです.最後の「test_x.cpp」は用途が不明で,私の環境ではコンパイルもできません. 計算テスト(test_c.cpp)計算テストのプログラムは,「tests/test_c.cpp」です.アルゴズムやストレス,自動適にに生成される大規模な問題のテストを行います.実行時間はかなり必要で,私の環境ではプログラムの終了まで 483秒かかりました. リスト3に,計算テスト「tests/test_c.cpp」の Makefile を示します. 001 #-------------- basic settings --------------- 002 TARGET = comp_test 003 CFLAGS = -Wall -O3 004 CC = g++ 005 INCLUDE = -I/usr/local/include/alglib 006 SRCDIR = /usr/local/src/alglib/ 007 008 #-------------- compile and link --------------- 009 $(TARGET): Makefile test_c.o alglibinternal.o alglibmisc.o ap.o dataanalysis.o diffequations.o fasttransforms.o integration.o interpolation.o linalg.o optimization.o solvers.o specialfunctions.o statistics.o 010 $(CC) $(CFLAGS) -o $(TARGET) test_c.o alglibinternal.o alglibmisc.o ap.o dataanalysis.o diffequations.o fasttransforms.o integration.o interpolation.o linalg.o optimization.o solvers.o specialfunctions.o statistics.o 011 012 test_c.o: Makefile test_c.cpp 013 $(CC) $(CFLAGS) -c -o $@ $*.cpp $(INCLUDE) 014 015 alglibinternal.o: Makefile $(SRCDIR)alglibinternal.cpp 016 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 017 018 alglibmisc.o: Makefile $(SRCDIR)alglibmisc.cpp 019 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 020 021 ap.o: Makefile $(SRCDIR)ap.cpp 022 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 023 024 dataanalysis.o: Makefile $(SRCDIR)dataanalysis.cpp 025 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 026 027 diffequations.o: Makefile $(SRCDIR)diffequations.cpp 028 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 029 030 fasttransforms.o: Makefile $(SRCDIR)fasttransforms.cpp 031 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 032 033 integration.o: Makefile $(SRCDIR)integration.cpp 034 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 035 036 interpolation.o: Makefile $(SRCDIR)interpolation.cpp 037 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 038 039 linalg.o: Makefile $(SRCDIR)linalg.cpp 040 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 041 042 optimization.o: Makefile $(SRCDIR)optimization.cpp 043 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 044 045 solvers.o: Makefile $(SRCDIR)solvers.cpp 046 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 047 048 specialfunctions.o: Makefile $(SRCDIR)specialfunctions.cpp 049 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 050 051 statistics.o: Makefile $(SRCDIR)statistics.cpp 052 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 053 054 055 #-------------- others ------------------------ 056 .PHONY: clean 057 clean: 058 rm *.o 059 rm $(TARGET) 実行コマンド「./comp_test」と結果は,以下のとおりです.
$ ./comp_test
SEED: 1448066095
COMPILER: GCC
HARDWARE: 32-bit
HARDWARE: little-endian
CPU: unknown
CORES: 1 (serial version)
LIBS:
CPUID:
OS: unknown
TESTING MODE: single core
hqrnd OK
tsort OK
nearestneighbor OK
ablas OK
basestat OK
bdss OK
blas OK
clustering OK
dforest OK
gammafunc OK
hblas OK
reflections OK
creflections OK
sblas OK
ortfac OK
bdsvd OK
svd OK
linreg OK
filters OK
evd OK
matgen OK
sparse OK
trfac OK
trlinsolve OK
safesolve OK
rcond OK
matinv OK
lda OK
mlpbase OK
xblas OK
densesolver OK
optserv OK
fbls OK
cqmodels OK
snnls OK
sactivesets OK
linmin OK
mincg OK
minbleic OK
mcpd OK
mlpe OK
minlbfgs OK
mlptrain OK
pca OK
odesolver OK
fft OK
conv OK
corr OK
fht OK
gq OK
gkq OK
autogk OK
idwint OK
ratint OK
polint OK
spline1d OK
normestimator OK
minqp OK
minlm OK
lsfit OK
parametric OK
linlsqr OK
rbf OK
spline2d OK
spline3d OK
spdgevd OK
inverseupdate OK
schur OK
minnlc OK
minns OK
lincg OK
nleq OK
polynomialsolver OK
chebyshev OK
hermite OK
laguerre OK
legendre OK
stest OK
studentttests OK
alglibbasics OK
Done in 483 seconds
インターフェーステスト(test_i.cpp)インターフェーステストのプログラムは,「tests/test_i.cpp」です.リスト4に,の Makefile を示します.このテストは,(1)呼び出し側と計算コアとのデータの受け渡し,(2)入力に関すること,(3)ALGLIBのコンパイル — のテストを行います. 001 #-------------- basic settings --------------- 002 TARGET = test_i 003 CFLAGS = -Wall 004 CC = g++ 005 INCLUDE = -I/usr/local/include/alglib 006 SRCDIR = /usr/local/src/alglib/ 007 008 #-------------- compile and link --------------- 009 $(TARGET): Makefile test_i.o alglibinternal.o alglibmisc.o ap.o dataanalysis.o diffequations.o fasttransforms.o integration.o interpolation.o linalg.o optimization.o solvers.o specialfunctions.o statistics.o 010 $(CC) $(CFLAGS) -o $(TARGET) test_i.o alglibinternal.o alglibmisc.o ap.o dataanalysis.o diffequations.o fasttransforms.o integration.o interpolation.o linalg.o optimization.o solvers.o specialfunctions.o statistics.o 011 012 test_i.o: Makefile test_i.cpp 013 $(CC) $(CFLAGS) -c -o $@ $*.cpp $(INCLUDE) 014 015 alglibinternal.o: Makefile $(SRCDIR)alglibinternal.cpp 016 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 017 018 alglibmisc.o: Makefile $(SRCDIR)alglibmisc.cpp 019 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 020 021 ap.o: Makefile $(SRCDIR)ap.cpp 022 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 023 024 dataanalysis.o: Makefile $(SRCDIR)dataanalysis.cpp 025 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 026 027 diffequations.o: Makefile $(SRCDIR)diffequations.cpp 028 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 029 030 fasttransforms.o: Makefile $(SRCDIR)fasttransforms.cpp 031 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 032 033 integration.o: Makefile $(SRCDIR)integration.cpp 034 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 035 036 interpolation.o: Makefile $(SRCDIR)interpolation.cpp 037 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 038 039 linalg.o: Makefile $(SRCDIR)linalg.cpp 040 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 041 042 optimization.o: Makefile $(SRCDIR)optimization.cpp 043 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 044 045 solvers.o: Makefile $(SRCDIR)solvers.cpp 046 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 047 048 specialfunctions.o: Makefile $(SRCDIR)specialfunctions.cpp 049 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 050 051 statistics.o: Makefile $(SRCDIR)statistics.cpp 052 $(CC) $(CFLAGS) -c -o $@ $(SRCDIR)$*.cpp $(INCLUDE) 053 054 055 #-------------- others ------------------------ 056 .PHONY: clean 057 clean: 058 rm *.o 059 rm $(TARGET) 実行コマンド「./test_i」と結果は,以下のとおりです.異常を示すメッセージが現れなかったので,これが正常動作と思われます.
$ ./test_i
C++ tests. Please wait...
0/145
50/145
100/145
145/145
ライブラリー化ライブラリーの作成ダウンロードしたファイル alglib-3.10.0.cpp.gpl.zip を解凍した出来上がったディレクトリー cpp/src/ に移動します.以下の Makefile を使えば,容易にライブラリーを作成できます. 001 #-------------- basic settings --------------- 002 TARGET = libalglib.a 003 CFLAGS = -Wall -O3 004 CC = g++ 005 006 007 #-------------- compile and make library --------------- 008 $(TARGET):alglibinternal.o alglibmisc.o ap.o dataanalysis.o diffequations.o fasttransforms.o integration.o interpolation.o linalg.o optimization.o solvers.o specialfunctions.o statistics.o Makefile 009 ar rcs $(TARGET) alglibinternal.o alglibmisc.o ap.o dataanalysis.o diffequations.o fasttransforms.o integration.o interpolation.o linalg.o optimization.o solvers.o specialfunctions.o statistics.o 010 011 alglibinternal.o:alglibinternal.cpp alglibinternal.h 012 $(CC) $(CFLAGS) -c -o $@ $*.cpp 013 014 alglibmisc.o:alglibmisc.cpp alglibmisc.h 015 $(CC) $(CFLAGS) -c -o $@ $*.cpp 016 017 ap.o:ap.cpp ap.h 018 $(CC) $(CFLAGS) -c -o $@ $*.cpp 019 020 dataanalysis.o:dataanalysis.cpp dataanalysis.h 021 $(CC) $(CFLAGS) -c -o $@ $*.cpp 022 023 diffequations.o:diffequations.cpp diffequations.h 024 $(CC) $(CFLAGS) -c -o $@ $*.cpp 025 026 fasttransforms.o:fasttransforms.cpp fasttransforms.h 027 $(CC) $(CFLAGS) -c -o $@ $*.cpp 028 029 integration.o:integration.cpp integration.h 030 $(CC) $(CFLAGS) -c -o $@ $*.cpp 031 032 interpolation.o:interpolation.cpp interpolation.h 033 $(CC) $(CFLAGS) -c -o $@ $*.cpp 034 035 linalg.o:linalg.cpp linalg.h 036 $(CC) $(CFLAGS) -c -o $@ $*.cpp 037 038 optimization.o:optimization.cpp optimization.h 039 $(CC) $(CFLAGS) -c -o $@ $*.cpp 040 041 solvers.o:solvers.cpp solvers.h 042 $(CC) $(CFLAGS) -c -o $@ $*.cpp 043 044 specialfunctions.o:specialfunctions.cpp specialfunctions.h 045 $(CC) $(CFLAGS) -c -o $@ $*.cpp 046 047 statistics.o:statistics.cpp statistics.h 048 $(CC) $(CFLAGS) -c -o $@ $*.cpp 049 050 #-------------- others ------------------------ 051 .PHONY: clean 052 clean: 053 rm *.o 054 rm $(TARGET) このファイルを,cpp/src/ にコピーします.そして,以下のコマンドで,ライブラリーを作成します. $ make
warning が表示されますが,問題ないでしょう.気になるようでしたら,オプションを調整します.最後に,出来上がったライブラリーの内容を確認します. $ ar -t libalglib.a alglibinternal.o alglibmisc.o ap.o dataanalysis.o diffequations.o fasttransforms.o integration.o interpolation.o linalg.o optimization.o solvers.o specialfunctions.o statistics.o ヘッダーとライブラリーのコピーALGLIB のヘッダーファイルをコピーします. $ sudo mkdir /usr/local/include/alglib $ sudo chmod 755 /usr/local/include/alglib $ sudo cp *.h /usr/local/include/alglib/ $ sudo chmod 644 /usr/local/include/alglib/*.h 次に,ライブラリーをコピーします. $ sudo cp libalglib.a /usr/local/lib/ $ sudo chmod 644 /usr/local/lib/libalglib.a 確認・使い方ライブラリーを使った実行ファイルの作成例を示します. 先に示した「fft_real_d1 example」を例に,ライブラリーを使ったコンパイル方法を示します.ちょっとだけ変更したソースのプログラムを以下に示します. 001 #include <stdlib.h> 002 #include <stdio.h> 003 #include <math.h> 004 #include <alglib/stdafx.h> 005 #include <alglib/fasttransforms.h> 006 007 using namespace alglib; 008 009 010 int main(int argc, char **argv) 011 { 012 // 013 // first we demonstrate forward FFT: 014 // [1,1,1,1] is converted to [4, 0, 0, 0] 015 // 016 real_1d_array x = "[1,1,1,1]"; 017 complex_1d_array f; 018 real_1d_array x2; 019 fftr1d(x, f); 020 printf("%s\n", f.tostring(3).c_str()); // EXPECTED: [4,0,0,0] 021 022 // 023 // now we convert [4, 0, 0, 0] back to [1,1,1,1] 024 // with backward FFT 025 // 026 fftr1dinv(f, x2); 027 printf("%s\n", x2.tostring(3).c_str()); // EXPECTED: [1,1,1,1] 028 return 0; 029 } 4–5 行に示す ALGLIB のヘッダーファイルのインクルードの仕方に注意が必要です.これをコンパイルするための Makefile は次のとおりです. 001 #-------------- basic settings --------------- 002 TARGET = FFT 003 CFLAGS = -Wall 004 CC = g++ 005 006 #-------------- compile and link --------------- 007 $(TARGET):Makefile fft_real_d1.o 008 $(CC) $(CFLAGS) -o $(TARGET) fft_real_d1.o -lalglib 009 010 fft_real_d1.o:Makefile fft_real_d1.cpp 011 $(CC) $(CFLAGS) -O3 -c -o $@ $*.cpp 012 013 014 #-------------- others ------------------------ 015 .PHONY: clean 016 clean: 017 rm *.o 018 rm $(TARGET) ビルドと実行は,以下のとおりです. $ make g++ -Wall -O3 -c -o fft_real_d1.o fft_real_d1.cpp g++ -Wall -o FFT fft_real_d1.o -lalglib $ ./FFT [4.000,0,0,0] [1.000,1.000,1.000,1.000] ページ作成情報参考資料
更新履歴
|