From fb6b828d755dffd73b9168158b1d5c4d7d0a9923 Mon Sep 17 00:00:00 2001 From: Jaron Kent-Dobias Date: Mon, 1 Mar 2021 16:52:07 +0100 Subject: Work to find beyond-threshold points. --- p-spin.hpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'p-spin.hpp') diff --git a/p-spin.hpp b/p-spin.hpp index f1dc07f..b2bdf07 100644 --- a/p-spin.hpp +++ b/p-spin.hpp @@ -26,6 +26,45 @@ std::tuple, Matrix> hamGradHess(const Tensor +Scalar getHamiltonian(const Tensor& J, const Vector& z) { + Scalar H; + std::tie(H, std::ignore, std::ignore) = hamGradHess(J, z); + return H; +} + +template +Vector getGradient(const Tensor& J, const Vector& z) { + Vector dH; + std::tie(std::ignore, dH, std::ignore) = hamGradHess(J, z); + return dH; +} + +template +Matrix getHessian(const Tensor& J, const Vector& z) { + Matrix ddH; + std::tie(std::ignore, std::ignore, ddH) = hamGradHess(J, z); + return ddH; +} + +template +Real getThresholdEnergyDensity(unsigned p, Scalar κ, Scalar ε, Real a) { + Real apm2 = pow(a, p - 2); + Scalar δ = κ / apm2; + Real θ = arg(κ) + 2 * arg(ε); + + return (p - 1) * apm2 / (2 * p) * pow(1 - norm(δ), 2) / (1 + norm(δ) - 2 * abs(δ) * cos(θ)); +} + +template +Real getProportionOfThreshold(Scalar κ, const Tensor& J, const Vector& z) { + Real N = z.size(); + Scalar ε = getHamiltonian(J, z) / N; + Real a = z.squaredNorm() / N; + + return norm(ε) / getThresholdEnergyDensity(p, κ, ε, a); +} + template Vector zDot(const Vector& z, const Vector& dH) { return -dH.conjugate() + (dH.dot(z) / z.squaredNorm()) * z.conjugate(); -- cgit v1.2.3-54-g00ecf