Code-04 Alea HOWTO
ALEA ライブラリ
Alea ライブラリを使うと、次のことができます。
- モンテカルロ測定を行う
- ビニング解析(ジャックナイフ解析)によって誤差と自己相関時間を計算する
- 測定値の関数の平均値と誤差を計算する
モンテカルロ測定
C++ のコードに ALEA ライブラリを取り込むには、次のようにします。
#include <alps/alea.h>
まず、観測量を作成する必要があります。
alps::RealObservable obs_a("observable a");
ここで、コンストラクタの引数は観測量の名前を表します。測定値は “«” 演算子を使って観測量に簡単に追加できます。例えば
obs_a << 1.2;
は、数値 1.2 を観測量 obs_a に追加します。
どのモンテカルロシミュレーションにも熱化が必要です。一定数の熱化ステップの後、次のようにして観測量をリセットする必要があります。
obs_a.reset(true);
観測量の出力は、次のように簡単に行えます。
std::cout << obs_a;
完全なプログラム例を以下に示します。
#include <iostream>
#include <alps/alea.h>
#include <boost/random.hpp>
int main()
{
//DEFINE RANDOM NUMBER GENERATOR
typedef boost::minstd_rand0 random_base_type;
typedef boost::uniform_01<random_base_type> random_type;
random_base_type random_int;
random_type random(random_int);
//DEFINE OBSERVABLE
alps::RealObservable obs_a("observable a");
//ADD 1000 MEASUREMENTS TO THE OBSERVABLE
for(int i = 0; i < 1000; ++i){
obs_a << random();
}
//RESET OBSERVABLES (THERMALIZATION FINISHED)
obs_a.reset(true);
//ADD 10000 MEASUREMENTS TO THE OBSERVABLE
for(int i = 0; i < 10000; ++i){
obs_a << random();
}
//OUTPUT OBSERVABLE
std::cout << obs_a;
}
観測量の関数
観測量の関数を評価することもできます。まず、測定値を含む観測量から、観測量の評価器(evaluator)を作成する必要があります。例えば、obs_a と obs_b に測定値を追加してあり、obs_c = obs_a/obs_b を計算したいとします。これは次のように行えます。
alps::RealObsevaluator obseval_a(obs_a);
alps::RealObsevaluator obseval_b(obs_b);
alps::RealObsevaluator obseval_c;
obseval_c = obseval_b / obseval_a;
std::cout << obseval_c;
簡単なプログラム例は、ALPS のソースディレクトリの “test/alea” にもあります。