ノート
訪問者数 2993 最終更新 2009-02-19 (木) 15:25:54
EPMR †
EPMRを読んでみる(1) †
Epmr.cpp †
Epmrの本体。
main.cpp †
- 39行目で、Epmr epmr( cout ); これにてEpmrのインスタンスepmr作成。初期化。
- 152行目まで、epmrの起動時のコマンドラインオプションの解析。
- 153〜162行目で、epmr.SetOption; これにてオプション解析結果をepmrインスタンスに設定。
- 163行目で、epmr.Optimize( 0 ); これが処理の本体
インスタンスepmrは39行目のEpmr cpmr( cout )で生成されている
クラスEpmrはEpmr.h内44行目で定義されている
class Epmr : public IterativeOptimizer< int > { ... }
ということは、class EpmrはIterativeOptimizerクラスを継承した派生(サブ)クラス
では、IterativeOptimizerクラスの定義はというと、IterativeOptimizer.hの30行目に
template< class T >
class IterativeOptimizer { ... }
として定義。
テンプレートのある宣言は、中身がclass Tで変わる(パラメタ化されている)というだけのことで、それほど悩むことはなさそう。ここの例ではあとでEpmr.hの44行目で使うときにclass Epmr : public IterativeOptimier< int > { ... }のように< int >を入れている。
32-50行で、クラスIterativeOptimizerは、メソッドOptimize, ~IterativeOptimizer(デストラクタ)、Initialize(ここでの宣言時は空)、Step(ここでの宣言時は空)、Converged(ここでの宣言時は空)、を持つことを宣言。空のものはEpmr.cppで定義されるはず
54-60行で、メソッドOptimizeの内容(ここでの宣言時の内容)を
template< class T >
void IterativeOptimizer< T >::Optimize( T* solution ) {
Initialize( solution );
while ( ! Converged() ) {
Step();
}
}
と宣言。
Epmr.cpp †
- 54行目 Epmr::Epmr コンストラクタ
- 64行目 Epmr::~Epmr デストラクタ?
- 74行目 Epmr::InitializeOptions オプションパラメタのデフォルト値設定
- 186行目 Epmr::Initialize たぶん初期化
- 479行目 Epmr::Step たぶんシミュレーションのワンステップ
- 674行目 Epmr::Converged 収束したかどうかの判定(true/falseを返す)
- 682行目 Epmr::SetOption オプションのセット(nameで指定されるオプションにvalueを設定)
- 697行目 Epmr::ReconcileOptions
- 746行目 Epmr::PrintProgramHeader 先頭に?"OpenEPMR, Version ..."を書き出す
- 754行目 Epmr::PrintOptionSummary オプションの要約を書き出す
- 779行目 内部関数? CalcCnsEulerAngles ?
- 826行目 内部関数? CalcCcp4EulerAngles ?
- 858行目 Epmr::ReportSolutions 解を書き出す?
- 904行目 Epmr::WriteSolution 解を書き出す? WriteAtomesを使う
- 934行目 Epmr::CalcTransforms Transformを計算する
- 969行目 Epmr::CalcSegmentTransforms Segment Transformを計算する
- 992行目 Epmr::WriteAtoms Atomを書き出す
- 1055行目 Epmr::compareToBest Bestと比較する?
- 1143行目 Epmr::StoreAtoms Atomをストアする
- 1173行目 Epmr::LoadCell
- 1214行目 Epmr::LoadModel 文字ファイルから読み込み
- 1237行目 Epmr::LoadModel istreamから読み込み
- 1251行目 Epmr::LoadReflections Reflectionを読み込み
- 1314行目 Epmr::CreateGlobalOptimizer
- 1357行目 Epmr::CreateLocalOptimizer
- 1366行目 Epmr::CreateMutator(rand)
- 1433行目 Epmr::CalcStaticStructureContribution
- 1459行目 Epmr::ReportSummary
- 1484行目 Epmr::SetSpaceGroupOptions This function fixes axes as appropriate for the spacegroup
- 1505行目 Epmr::SplitSegments 真偽を返す
- 1560行目 Epmr::CalcPackingClashes
- 1671行目 Epmr::NormalizeSolutions
Epmr::Step (Epmr.cpp, 479行目〜) †
- 481-504 (verbosityが1以上なら)各種背景情報の書き出し
- 505 Solutionのインスタンスbestを作成
- 506-518 第1回目(attempt==1)ならいくつかの初期化
CalStaticStructureContributionを計算
optimizerを消しておいて0に初期化
オプションoptimizer.globalが指定されていれば、optimizer=CreateGlobalOptimizerで生成
>>(optimizer.globalがevolutionであれば)CreateGlobalOptimizerの戻り値はEvolutionaryOptimizerへのポインタになる
localOptimizerを消しておいて0に初期化
localOptimizer=CreateLocalOptimizerで生成
- 519-537 optimizerが0でなければ(global Optimizerが存在すれば)optimizer->Optimize(&best)にて、bestをOptimize
>>この時EvolutionaryOptimizerが使われるとすれば、EvolutionaryOptimizer(&best)ということになる
>>EvolutionaryOptimizerクラスが定義されているのはEvolutionaryOptimizer.hで、
>>IterativeOptimizerのコンストラクタ・デストラクタ、メソッドInitialize, Step, converged,
>>RankMembers, ScoreMembers, Regenerate, Memberをオーバーロードしている
そうでなければ(global Optimizationが無ければ)(コメントによると)位置を入力分子の位置にリセットし、妥当な溶媒パラメタを与える
best.SetTargetID(firstTargetIndex)をし、best.SetKSol(0.8)をし、best.SetBSol(200.0)をする。
更にセグメントごとに(nseg回)、RigidBodyのインスタンスsegを造り、
seg.modelID=firstModelIndex+i、seg.position=centers[firstModelIndex+i]と設定し、
best.AddSegment(seg)でセグメントsegをbestに追加する。
- 538-552 local optimizationを行う。
まずSolutionのインスタンスlocalResultを造り、bestをコピーして初期化
localResultをlocalOptimizerでoptimize localOptimizer->Optimize(&localResult);
オプションoptimize.local-segmentsがtrueなら、
localResultをSplitSegment(localResult, models) することを試み、OKなら、
verbosityが1以上ならlocalResultをCalcSegmentTransformし、
localResultを(splitしたそれぞれのsegmentを)localOptimizerでoptimize localOoptimizer->Optimize(&localResult);
- 554 localResultをnormalize NormalizeSolution(&localResult);
- 556-557 currentScore、currentRfactorを計算
currentScore=localScorer->Score(localResult);
currentRfactor=rfactorScorer->Score(localResult);
- 559-562 (verbosityが1以上なら)ReportSolution(localResult, currentScore, currentRfactor)
- 564-573 もしmaximizingなら、currentScore>bestScoreならbestScore=currentScore,
bestRfactor=currentRfactor, bestSolution=localResult
もしmaximizingでなければ(minimizing?)、currentScore<bestScoreならbestScore=currentScore,などなど(上と同じ)
- 575 平均の計算? averageScore(currentScore)
- 577-8 要求されていてかつ収束済みConvergedなら、ReportSummary
- 580-586 output.levelがallならとにかくlocalResult,currentScoreなどをWriteSolution
output.levelがbestなら、回数attemptが上限nAttemptsになるか収束済みConvergedであれば、bestSolution,bestScoreなどをWriteSolution
- 588 attempt++ カウントアップ
- 589-670 回数attemptがattempt>nAttemptsになるか、オプションautostopがtrueでかつnDuplicateSolutions>1であれば、次のことをする
- 592-594 push_backはC++のvectorのようなクラスで最後に要素を追加するメソッド、backはlistのようなクラスで最後の要素を返すメソッド。
solutionsはEpmr.hの136行目で
Solution bestSolution;
vector< vector< vector< Solution > > > solutions;
vector< vector< vector< double > > > scores;
と定義。また、SolutionはSolution.hの40-63行目で定義され、内容は
private:
int targetID;
double solK;
double solB;
std::vector< RigidBody > subSolutions;
更にRigidBodyは同じSolution.hの28-37行目に
Quat4d orientation;
Vector3d position;
int modelID;
int segmentID;
と定義。話を戻すと、solutionsはSolutionのvectorのvectorのvector(3段階に伸びられるということ?)なので、それに(どれに?)外側のvectorで最後(back)、真ん中のvectorで最後(back)で、内側のvectorの最後にbestSolutionを追加する(pushd_back)という意味だ。
scoresに対しても同じ事をする。最後にbestScoreを-1にする(初期化?)
- 596-601 verbosity>0でreport.hitcountが指定されていれば、nDuplicateSolutionsを表示。
attemptを1に初期化、nDuplicateSolutionsを1に初期化、copyNumにnCopiesを加える。
- 615-669 もしcopyNum > totalCopiesならば616-669のことをする
totalCopiesは410行目でtotalCopies = GetIntegerOptionValue( "copies" );
これの役目はdocument(http://www.msg.ucsf.edu/local/programs/epmr/epmr.html)によると、
-M integer The number of copies of the molecule in the asymmetric unit to find simultaneously
The default value is 1. Values greater than 1 cause multiple orientations
and positions to be optimized for the search model.
This option has not yet been optimized in this new version of the program
and is not yet recommended for general use.
-m integer The number of copies of the molecule in the asymmetric unit to find sequentially
The default value is 1. A value of 2 would cause the program to search for
one copy of the molecule, save the solution as partial structure and
continue searching for a second solution.
であり、プログラム上は main.cppの74-81行目で
case 'm':
epmr.SetOption( "copies", optarg );
epmr.SetOption( "optimize.copies", "false" );
break;
case 'M':
epmr.SetOption( "copies", optarg );
epmr.SetOption( "optimize.copies", "true" );
break;
nCopiesは411行目で
if ( options[ "optimize.copies" ] == "true" ) {
nCopies = totalCopies;
} else {
nCopies = 1;
}
つまり、-M(並列処理を仮定??)ならoptimize.copiesがtrueになるのでnCopiesは1でいい(1回きりでいい)が、
-mならoptimize.copiesがfalseになるので直列にtotalCopies回だけ実行させる必要があるということ。(たぶん)
- 616-617 firstModelIndexにnModelsを増やす、firstSegmentIndexにnSegmentsを増やす。
- 618-623 もしassembly searchが指定されていて、かつoptimize.modelが指定されていて、firstSegmentIndex<models.sizeであれば、firstModelIndexを0にする。
// if it is an assembly search, not yet complete, and
// the models are in competition, reset the model index
- 624 copyNumを1にリセット
- 625-633 もしfirstSegmentIndex>=nSegmentsならば、、、、
Epmr::CreateGlobalOptimizer() (Epmr.cpp, 1314-1353行目) †
- 1315-1347 もしコマンドラインからoptimizer.global==evolutionaryであれば、いろいろな設定をして
- 1348 return new EvolutionaryOptimizer< Solution >( populationSize,
numGenerations, creator, globalScorer, ranker, selector,
CreateMutator( randomNumberGenerator ), reporter );
つまりCreateGlobalOptimizerの戻り値としてインスタンスEvolutionaryOptimizerを返す
- ちなみに、これを使うのはEpmr.cpp 512-13行目(Step中)の optimizer = CreateGlobalOptimizer;
つまり、513行目以降は、optimizerがEvolutionaryOptimizerを指している。
Epmr::Initialize (Epmr.cpp, 186行目〜) †
- 188-191 optimizer, localOptimizer, globalScorer, localScorerをdeleteで消す
- 193-197 乱数発生のためのインスタンスを生成しrandomNumberGeneratorに代入する
- 199-203 cellsを消す
- 204-210 modelsを消す
- 211 centersを消す
- 212-218 transformsを消す
- 219-225 structuresを消す
- 226-230 hKindices.resize, kIndices.resize, lIndices.resize, magfo.resizeを0にする
- 231-235 solutionsを消す。tmpTargetSolVecをインスタンス化し、solutions.push_backに入れる。tmpModelsolVecをインスタンス化し、solutions.back.pushbackに入れる。
- 237-241 scoresを消す。tmpTargetScoreVecをインスタンス化し、scores.push_backに入れる。tmpModelscoreVecをインスタンス化し、scores.back.pushbackに入れる。
- 243-250 verbosityをoptions[report.verbosity]に従って0,1,2のどれかに設定し、もし>0ならPrintProgramHeaderでヘッダを印刷する
- 252-257 cell infoをロードする。Loading cell parametersと印刷し、LoadCell(cell.source)を呼び出す。
- 259-313 オプションにpointgroupsearchが指定されていればその処理(面倒なのでスキップ)をする。その結果を印刷する。
- 314-325 search modelをロードする。Loading search modelと印刷し、LoadModel(modl.source, &models)を呼び出す。 その結果を印刷する
- 326-335 modelsの値に不具合があるかどうか確認する
- 336-353 modelを原点へ移動する。centers.push_back(cells[0]->Fractionalize(coordAverage))を実行する
- 355-368 reflectionをロードする。data.sourceからloadReflectionsする。
- 370-400 static structureをロードする。structure.sourceから&structureへLoadModelする。いくつかの確認をする。Fractionalizeする。initialStructureSizeを決める
- 402 ReconcileOptionsを呼び出す
- 403-405 PrintOptionSummaryを印刷する(Reconcileしたから?)
- 407 nAttemptsをオプションから取り出す
- 409-416 copyNum, totalcopies, nCopiesを取り出す・決める。
- 418-419 scoreThresholdをオプションから取り出す。 bestScoreの初期値を-1.0にする。
- 421-428 firstModelIndex, nModelsを決め、CalcTransformsを呼び出す。
- 430-438 firstSegmentIndex, nSegmentsを決める
- 440-446 firstTargetIndex, nTargetsを決める
- 449 SetSpaceGroupOptionsを呼び出す
- 451-471 target.typeがcffなら、必要な設定計算をするらしい。面倒なので省略
- 473-474 attemp = 1; nduplicatesolutions = 1
コマンドラインパラメタから見る ⇒ EPMRを見る2 †