root / ase / utils / bee.py @ 18
Historique | Voir | Annoter | Télécharger (1,36 ko)
1 | 1 | tkerber | import numpy as np |
---|---|---|---|
2 | 1 | tkerber | |
3 | 1 | tkerber | # NB! This module was ported from a 4 year old CamposASE2 module.
|
4 | 1 | tkerber | |
5 | 1 | tkerber | """Bayesian Error Estimation
|
6 | 1 | tkerber |
|
7 | 1 | tkerber | For details, see: "Bayesian Error Estimation in Density Functional
|
8 | 1 | tkerber | Theory", J. J. Mortensen, K. Kaasbjerg, S. L. Frederiksen,
|
9 | 1 | tkerber | J. K. Norskov, J. P. Sethna, K. W. Jacobsen, Phys. Rev. Lett. 95,
|
10 | 1 | tkerber | 216401 (2005)."""
|
11 | 1 | tkerber | |
12 | 1 | tkerber | # T
|
13 | 1 | tkerber | # cost(c) = cost0 + 0.5 * (c - c0) H (c - c0)
|
14 | 1 | tkerber | #
|
15 | 1 | tkerber | |
16 | 1 | tkerber | # Cost function minimum value:
|
17 | 1 | tkerber | cost0 = 3.4660625596
|
18 | 1 | tkerber | |
19 | 1 | tkerber | # Best fit parameters:
|
20 | 1 | tkerber | c0 = np.array([1.000787451, 0.1926284063, 1.896191546]) |
21 | 1 | tkerber | |
22 | 1 | tkerber | # Hessian:
|
23 | 1 | tkerber | # H = np.array([[ 1.770035168e+03, -3.732470432e+02, -2.105836167e+02],
|
24 | 1 | tkerber | # [-3.732470432e+02, 1.188857209e+02, 6.054102443e+01],
|
25 | 1 | tkerber | # [-2.105836167e+02, 6.054102443e+01, 3.211200293e+01]])
|
26 | 1 | tkerber | #
|
27 | 1 | tkerber | # 0.5 * np * T = cost0 (np=3: number of parameters)
|
28 | 1 | tkerber | T = cost0 * 2 / 3 |
29 | 1 | tkerber | |
30 | 1 | tkerber | def make_ensemble(N=1000, seed=None): |
31 | 1 | tkerber | np.random.seed(seed) # None means /dev/urandom seed
|
32 | 1 | tkerber | M = np.array([(0.066, -0.812, 1.996), |
33 | 1 | tkerber | (0.055, 0.206, 0.082), |
34 | 1 | tkerber | (-0.034, 0.007, 0.004)]) |
35 | 1 | tkerber | alpha = np.random.normal(0.0, 1.0, (N, 3)) |
36 | 1 | tkerber | return c0 + np.dot(alpha, M)
|
37 | 1 | tkerber | |
38 | 1 | tkerber | c = make_ensemble() |
39 | 1 | tkerber | |
40 | 1 | tkerber | def get_ensemble_energies(atoms, c=c): |
41 | 1 | tkerber | if hasattr(atoms, 'get_calculator'): |
42 | 1 | tkerber | coefs = atoms.get_calculator().get_ensemble_coefficients() |
43 | 1 | tkerber | else:
|
44 | 1 | tkerber | coefs = atoms |
45 | 1 | tkerber | return coefs[0] + np.dot(c, coefs[1:]) |