diff options
Diffstat (limited to 'langevin.cpp')
-rw-r--r-- | langevin.cpp | 39 |
1 files changed, 1 insertions, 38 deletions
diff --git a/langevin.cpp b/langevin.cpp index 1a0e104..e4b6c8d 100644 --- a/langevin.cpp +++ b/langevin.cpp @@ -4,22 +4,11 @@ #include <getopt.h> #include <random> -#include <eigen3/Eigen/Core> -#include <eigen3/unsupported/Eigen/CXX11/Tensor> - #include "pcg-cpp/include/pcg_random.hpp" #include "randutils/randutils.hpp" #include "complex_normal.hpp" -#include "tensor.hpp" - -#define PSPIN_P 3 -const unsigned p = PSPIN_P; // polynomial degree of Hamiltonian - -using Scalar = std::complex<double>; -using Vector = Eigen::VectorXcd; -using Matrix = Eigen::MatrixXcd; -using Tensor = Eigen::Tensor<Scalar, PSPIN_P>; +#include "p-spin.hpp" using Rng = randutils::random_generator<pcg32>; @@ -36,32 +25,6 @@ Vector initializeVector(unsigned N, double a, Rng& r) { return z; } -std::tuple<Scalar, Vector, Matrix> hamGradHess(const Tensor& J, const Vector& z) { - Matrix Jz = contractDown(J, z); // Contracts J into p - 2 copies of z. - Vector Jzz = Jz * z; - - double f = factorial(p); - - Matrix hessian = ((p - 1) * p / f) * Jz; - Vector gradient = (p / f) * Jzz; - Scalar hamiltonian = (1 / f) * Jzz.dot(z); - - return {hamiltonian, gradient, hessian}; -} - -std::tuple<double, Vector> WdW(const Tensor& J, const Vector& z) { - Vector gradient; - Matrix hessian; - std::tie(std::ignore, gradient, hessian) = hamGradHess(J, z); - - Vector projectedGradient = gradient - (gradient.dot(z) / (double)z.size()) * z; - - double W = projectedGradient.cwiseAbs2().sum(); - Vector dW = hessian.conjugate() * projectedGradient; - - return {W, dW}; -} - Vector langevin(const Tensor& J, const Vector& z0, double T, double γ0, std::function<bool(double, unsigned)> quit, Rng& r) { Vector z = z0; |