diff options
Diffstat (limited to 'dynamics.hpp')
-rw-r--r-- | dynamics.hpp | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/dynamics.hpp b/dynamics.hpp index 85eef71..b373659 100644 --- a/dynamics.hpp +++ b/dynamics.hpp @@ -92,26 +92,26 @@ Vector<Scalar> randomVector(unsigned N, Distribution d, Generator& r) { } template <class Scalar, int p, class Distribution, class Generator> -std::tuple<double, Vector<Scalar>> langevin(const Tensor<Scalar, p>& J, const Vector<Scalar>& z0, double T, double γ, unsigned N, Distribution d, Generator& r) { +std::tuple<double, Vector<Scalar>> metropolis(const Tensor<Scalar, p>& J, const Vector<Scalar>& z0, + std::function<double(const Tensor<Scalar, p>&, const Vector<Scalar>&)>& energy, + double T, double γ, unsigned N, Distribution d, Generator& r) { Vector<Scalar> z = z0; - double W; - std::tie(W, std::ignore) = WdW(J, z); + double E = energy(J, z); std::uniform_real_distribution<double> D(0, 1); for (unsigned i = 0; i < N; i++) { - Vector<Scalar> zNewTmp = z + randomVector<Scalar>(z.size(), d, r); + Vector<Scalar> zNewTmp = z + γ * randomVector<Scalar>(z.size(), d, r); Vector<Scalar> zNew = normalize(zNewTmp); - double WNew; - std::tie(WNew, std::ignore) = WdW(J, zNew); + double ENew = energy(J, zNew); - if (exp((W - WNew) / T) > D(r)) { + if (E - ENew > T * log(D(r))) { z = zNew; - W = WNew; + E = ENew; } } - return {W, z}; + return {E, z}; } |