![]() |
ノート/EPMRを見る〜流れ見直しhttp://pepper.is.sci.toho-u.ac.jp/pepper/index.php?%A5%CE%A1%BC%A5%C8%2FEPMR%A4%F2%B8%AB%A4%EB%A1%C1%CE%AE%A4%EC%B8%AB%C4%BE%A4%B7 |
![]() |
ノート
訪問数 2185 最終更新 2008-02-04 (月) 10:41:19
流れの簡単な解説図(http://www.doe-mbi.ucla.edu/~sawaya/tutorials/Molrep/epmr.htmlより)は
となっている。
これは1回のattemptの図(1回モデルを生成して最適化するプロセスの図)であるが、
同じページの上段の図(http://www.doe-mbi.ucla.edu/~sawaya/tutorials/Molrep/epmr.htmlより)
では、何回もランダムなモデル生成を繰り返して(つまりattemptを増やしつつ
ループする。図上では横軸方向に増えてゆくことに当たる)の結果を比較しようとしている。
このattemptを増やして繰り返すようなループ実行は、サンプル実行
epmr LDH.mtz LDH.pdb
では実現できていない(attemptが1回だけループを回って脱出)。
この点について実行の軌跡を追いかけると、次のことが分かる
main.cpp(82) case 'n': epmr.SetOption( "attempts", optarg ); Epmr.cpp(407) nAttempts = GetIntegerOptionValue( "attempts" ); Epmr.cpp(97) defaultOptions[ "attempts" ] = "10"; // maximum runs to attemp
Epmr:() while ( ! Converged() ) { Step(); }なので、ループの脱出条件はConverged (具体的にはEpmr::Converged (Epmr.cpp(674-)))で決まる。
bool Epmr::Converged() { return ( ( maximizing && bestScore > scoreThreshold ) || ( ! maximizing && bestScore < scoreThreshold ) || firstTargetIndex >= (int) cells.size() );初めの2行は、最適化がmaximizing(大きいほどよしとする)かminimizing(小さいほどよしとする)かで不等号の向きが違うが、要するにbestScoreがscoreThresholdを超えたかどうかの判定をしている。最後の行は探索の結果が範囲を超えてしまった場合である
main.cpp(106) case 't': epmr.SetOption( "target.threshold", optarg ); Epmr.cpp(48) scoreThreshold = GetDoubleOptionValue( "target.threshold" ); Epmr.cpp(123) defaultOptions[ "target.threshold" ] = "0.65";
epmr -t 0.9 LDH.mtz LDH.pdbその実行結果は
attempt = 2, nAttempts = 10 done. Rotation (Eulerian) Translation (fractional) alpha beta gamma x y z Model SpGrp CC R Solution 2 42.21 0.05 317.83 0.435 0.292 0.861 1 C2221 0.806 0.268 CNS Euler angles: 312.17 0.05 47.79 Angle to best previous solution (considering symmetry): 0.00 degrees Vector to best (fractional, considering alternate origins): 0.00 -0.00 0.00 Close atomic contacts (c-alpha atoms < 3.4 A): 3 Ksol = 0.7, Bsol = 178.3 Epmr::Converged. maximizing=1, bestScore = 0.8, scoreThreshold = 0.9, FirstTargetIndex = 0, cells.size = 1 attempt = 3, nAttempts = 10 done. Rotation (Eulerian) Translation (fractional) alpha beta gamma x y z Model SpGrp CC R Solution 3 222.25 0.05 317.79 0.565 0.208 0.361 1 C2221 0.806 0.268 CNS Euler angles: 312.21 0.05 227.75 Angle to best previous solution (considering symmetry): 0.00 degrees Vector to best (fractional, considering alternate origins): 0.00 0.00 0.00 Close atomic contacts (c-alpha atoms < 3.4 A): 3 Ksol = 0.7, Bsol = 178.2 Epmr::Converged. maximizing=1, bestScore = 0.8, scoreThreshold = 0.9, firstTargetIndex = 0, cells.size = 1 attempt = 4, nAttempts = 10 done. Rotation (Eulerian) Translation (fractional) alpha beta gamma x y z Model SpGrp CC R Solution 4 0.49 29.07 359.54 0.566 0.206 0.861 1 C2221 0.656 0.376 CNS Euler angles: 270.46 29.07 89.51 Angle to best previous solution (considering symmetry): 29.03 degrees Vector to best (fractional, considering alternate origins): -0.13 0.09 -0.00 Close atomic contacts (c-alpha atoms < 3.4 A): 5 Ksol = 0.7, Bsol = 77.9 Epmr::Converged. maximizing=1, bestScore = 0.8, scoreThreshold = 0.9, firstTargetIndex = 0, cells.size = 1 attempt = 5, nAttempts = 10 (中略) Rotation (Eulerian) Translation (fractional) alpha beta gamma x y z Model SpGrp CC R Solution 10 222.23 0.05 317.81 0.065 0.208 0.361 1 C2221 0.806 0.268 CNS Euler angles: 312.19 0.05 227.77 Angle to best previous solution (considering symmetry): 0.00 degrees Vector to best (fractional, considering alternate origins): 0.00 0.00 -0.00 Close atomic contacts (c-alpha atoms < 3.4 A): 3 Ksol = 0.7, Bsol = 178.2 Writing coordinates to epmr.best.pdbのように10回(外側)ループすることが確認できる。
ループを並列化しようとする際、前のループ本体実行の結果を次のループ本体実行が利用・参照する場合、うまく行かない。なぜなら、前の結果が出ないと、次の計算が出来ないからである。
EPMRの内側のループ(EvolutionaryOptimizerのwhileループ)は、前のループ本体での実行結果をランダムに並べ替えて(これが進化のステップに当たる)次のループ本体で再度計算するので、そのままでは並列化に向かない。
その点、外側のループの意味は、同じ計算を別のランダムに生成した初期値と別のランダム系列による組み換えによって進化計算させ、より最適な解が出るかを試すことにあるので、前回の計算の結果に依存するのは最後の結果比較だけである。ここは、並列化がしやすい。
加えて、出発点データの生成もランダム計算であるから、独立に計算できる。