t-sakashita / rokko

Integrated Interface for libraries of eigenvalue decomposition
Boost Software License 1.0
10 stars 2 forks source link

Pythonバインディングの改訂 #248

Closed t-sakashita closed 8 years ago

t-sakashita commented 8 years ago

Rokkoの改訂に合わせて整備する。

yomichi commented 8 years ago

python バインディングを有効にすると rokko_ext.cpp でビルドエラーが出るんですが、それも含めた改訂という話ですか?

t-sakashita commented 8 years ago

はい、そうです。 改訂までは、BUILD_Python_BINDING=OFFをCMakeにお渡しください。

よろしくお願いします。> 藤堂先生

yomichi commented 8 years ago

32f76ae 厄介なのでデフォルトでOFF にしました。

バインディングが直った暁にはこちらも修正ください。

t-sakashita commented 8 years ago

mapping_bcのPythonバインディングの作成。C bindingの上に作る。

MPI密行列ソルバ向けの固定block size版が正常終了するようになった。 1252454c8e36d61bfeb707fc135a4308f559b9c5 そのためには、distributed_matrixにおいて、渡されるmapをコンストラクタの初期化によりプライベート変数に代入する必要があった。そうしないと、gridクラスのinitialize関数のMPI_Comm_procsでseg faultが起こっていた。(なぜそこで?)

t-sakashita commented 8 years ago

default_mappingを使用する例題プログラムを作成する。

C++/Cと同様に、以下のように呼び出すとする。

map = solver.default_mapping(dim, grid)
mat = rokko_distributed_matrix(map)

上記のように、mapを左辺とする場合、solver.default_mappingの戻り値はポインタ型ではなく値である必要がある。(ポインタ型にすると、Boost.Pythonのエラーが出る。)

distributed_matrixに、mapping_bcを値渡しとポインタ渡しのどちらでも行おうと試みたが、Boost.Pythonでは、引数の異なる_init_を作成できない。 http://bacspot.dip.jp/virtual_link/www/si.musashi-tech.ac.jp/new_www/Python_1HourStudy/index_class.html#chap09

return_value_policy<boost::python::return_opaque_pointer>()を使うとポインタを返せることが分かった。 Python bindingではポインタ渡しに統一する。(受け渡しのオーバーヘッドもなし。) 20b14c3d5edb55c5ac30d6d8e23b655121d0059b

t-sakashita commented 8 years ago

parametersのPyhon bindingを作る。 Boost.Pythonのstd::mapをラップする機能が活用できそうだが、今回は単にparametersのメンバ関数をラップする方法を採った。 get(...)には、boost::python::objectを返すラッパー関数を用意した。 5036c0c438dd4e0039d17aa5cfa37594f793ac27

keys()の戻り値の型は、boost::python::listとした。 map型をPythonの辞書型で返す関数dictを追加した。戻り値の型には、boost::python::dictを用いた。 bfee6476d0a3b65588c7795f800125d421dc7b5a

Pythonの辞書型をparametersのコンストラクタに渡しstd::mapに変換しようにしたかったが、boost::python::dictのmapped_valueの型を判別するのが難しそうなので止めた。

t-sakashita commented 8 years ago

疎行列向けソルバのPython bindingを改訂する。

heisenberg_crs_mpi.pyの以下でエラーとなる。

mat = rokko_distributed_crs_matrix(dim, dim, solver)

以下のエラーメッセージより、grid_1dMPI_Comm_sizeでエラーsegfaultが起こっている事が分かる。

[@sakashita sparse]$ bash tmp_heisenberg_crs_mpi.py.sh
solver name = anasazi
Eigenvalue decomposition of antiferromagnetic Heisenberg chain
L = 8
dimension = 256
[sakashita:04069] *** Process received signal ***
[sakashita:04069] Signal: Segmentation fault: 11 (11)
[sakashita:04069] Signal code: Address not mapped (1)
[sakashita:04069] Failing at address: 0x10
[sakashita:04069] [ 0] 0   libsystem_platform.dylib            0x00007fff8b9505aa _sigtramp + 26
[sakashita:04069] [ 1] 0   ???                                 0x00007fff50609129 0x0 + 140734541893929
[sakashita:04069] [ 2] 0   librokko.dylib                      0x0000000110a3a49c _ZN5rokko7grid_1d10initializeEv + 44
[sakashita:04069] [ 3] 0   librokko.dylib                      0x0000000110a3a463 _ZN5rokko7grid_1dC2EP19ompi_communicator_t + 35
[sakashita:04069] [ 4] 0   librokko.dylib                      0x0000000110a3a42d _ZN5rokko7grid_1dC1EP19ompi_communicator_t + 29
[sakashita:04069] [ 5] 0   librokko.dylib                      0x0000000110a3a366 _ZN5rokko7anasazi10mapping_1dC2Ei + 54
[sakashita:04069] [ 6] 0   librokko.dylib                      0x0000000110a37f8b _ZN5rokko7anasazi10mapping_1dC1Ei + 27
[sakashita:04069] [ 7] 0   librokko.dylib                      0x0000000110a3a735 _ZN5rokko7anasazi22distributed_crs_matrix10initializeEii + 69
[sakashita:04069] [ 8] 0   librokko.dylib                      0x0000000110a3a632 _ZN5rokko7anasazi22distributed_crs_matrixC2Eii + 82
[sakashita:04069] [ 9] 0   librokko.dylib                      0x0000000110a3a5d1 _ZN5rokko7anasazi22distributed_crs_matrixC1Eii + 33
[sakashita:04069] [10] 0   librokko.dylib                      0x0000000110a3a57a _ZN5rokko7anasazi6solver29create_distributed_crs_matrixEii + 58
[sakashita:04069] [11] 0   librokko.dylib                      0x0000000110a35018 _ZN5rokko6detail17ps_solver_wrapperINS_7anasazi6solverEE29create_distributed_crs_matrixEii + 40
[sakashita:04069] [12] 0   librokko.dylib                      0x00000001109a8bc5 _ZN5rokko18parallel_sparse_ev29create_distributed_crs_matrixEii + 53
[sakashita:04069] [13] 0   librokko.dylib                      0x00000001109a87e0 _ZN5rokko22distributed_crs_matrixC2INS_18parallel_sparse_evEEEiiRT_ + 272
[sakashita:04069] [14] 0   librokko.dylib                      0x00000001109a85b9 _ZN5rokko22distributed_crs_matrixC1INS_18parallel_sparse_evEEEiiRT_ + 41
[sakashita:04069] [15] 0   librokko.dylib                      0x00000001109a8415 rokko_distributed_crs_matrix_construct + 69
[sakashita:04069] [16] 0   rokko_ext.so                        0x000000011077f258 _ZN33wrap_rokko_distributed_crs_matrixC2EiiP29wrap_rokko_parallel_sparse_ev + 136
[sakashita:04069] [17] 0   rokko_ext.so                        0x000000011077ed69 _ZN33wrap_rokko_distributed_crs_matrixC1EiiP29wrap_rokko_parallel_sparse_ev + 41
[sakashita:04069] [18] 0   rokko_ext.so                        0x000000011077ec4e _ZN5boost6python7objects12value_holderI33wrap_rokko_distributed_crs_matrixEC2IiiP29wrap_rokko_parallel_sparse_evEEP7_objectT_T0_T1_ + 238

clang36のvariantでmpi4pyをインストールすると、MPI_Comm関連のエラーは消えた。

sudo port install mpi4py +openmpi+clang36

mpi4pyは、openmpiとデフォルトのgccでインストールされたものを使用していたようだ。 Rokko本体の方は、openmpi+clang36でインストールされていたから、互換性がないことがエラーの原因らしい。 (gccとclang36でビルドされたopenmpiは互換性がない?)

t-sakashita commented 8 years ago

以下は、勘違い: 以下のMPI並列版の密行列のように、Python側のMPIコミュニケータを変換して渡すようにしないと駄目か?

wrap_rokko_grid(boost::python::object comm, int grid_major) {
    boost::python::object comm_func = comm.attr("py2f");
    boost::python::object comm_f_obj = comm_func();
    int comm_f = boost::python::extract<int>(comm_f_obj);
    raw = new rokko_grid();
    rokko_grid_construct_f(raw, comm_f, grid_major);
  }

PythonとC++のMPI_COMM_WORLDは違うもの?

t-sakashita commented 8 years ago

疎行列向けソルバのPython bindingの改訂(初期版)が終了。 fa163cf707bdb5a77846f6da0450d1020cf3a22b

t-sakashita commented 8 years ago

密行列向けソルバのPython bindingのPython bindingでparametersを受け渡しできるようにする。 9352fe7209c2b5ddb31702d0c69ccd80cc62c270

t-sakashita commented 8 years ago

Python自体は関数オーバーロードができないが、Boost.Pythonを使うとできた。(どのような仕組み?) diagonalize関数のオーバーロード b84c54f3b0c8ad805eefac7842dafad8c62addd1

デフォルト引数がある場合のメンバ関数のオーバーロードには、BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADSを使用する。 http://www.boost.org/doc/libs/1_61_0/libs/python/doc/html/tutorial/tutorial/functions.html

t-sakashita commented 8 years ago

diagonalize関数の引数にparametersが含まれていない場合、固有値のみを計算する場合の自動オーバーロード 4126481c2cb561bbc11e9c508704beb089270bff

t-sakashita commented 8 years ago

Release0.4向けのIssueとしては、以上で完了