root / ase / utils / bee.py @ 7
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:]) |