diff options
author | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2021-03-01 16:52:07 +0100 |
---|---|---|
committer | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2021-03-01 16:52:07 +0100 |
commit | fb6b828d755dffd73b9168158b1d5c4d7d0a9923 (patch) | |
tree | 7378f4ece99055b4fdfe8b0741a2d110d72b56b5 /p-spin.hpp | |
parent | 6482fcaf4e5d8ede27d9492ed08e6bc81b28b418 (diff) | |
download | code-fb6b828d755dffd73b9168158b1d5c4d7d0a9923.tar.gz code-fb6b828d755dffd73b9168158b1d5c4d7d0a9923.tar.bz2 code-fb6b828d755dffd73b9168158b1d5c4d7d0a9923.zip |
Work to find beyond-threshold points.
Diffstat (limited to 'p-spin.hpp')
-rw-r--r-- | p-spin.hpp | 39 |
1 files changed, 39 insertions, 0 deletions
@@ -26,6 +26,45 @@ std::tuple<Scalar, Vector<Scalar>, Matrix<Scalar>> hamGradHess(const Tensor<Scal return {hamiltonian, gradient, hessian}; } +template <class Scalar, int p> +Scalar getHamiltonian(const Tensor<Scalar, p>& J, const Vector<Scalar>& z) { + Scalar H; + std::tie(H, std::ignore, std::ignore) = hamGradHess(J, z); + return H; +} + +template <class Scalar, int p> +Vector<Scalar> getGradient(const Tensor<Scalar, p>& J, const Vector<Scalar>& z) { + Vector<Scalar> dH; + std::tie(std::ignore, dH, std::ignore) = hamGradHess(J, z); + return dH; +} + +template <class Scalar, int p> +Matrix<Scalar> getHessian(const Tensor<Scalar, p>& J, const Vector<Scalar>& z) { + Matrix<Scalar> ddH; + std::tie(std::ignore, std::ignore, ddH) = hamGradHess(J, z); + return ddH; +} + +template <class Scalar> +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 <class Scalar, int p> +Real getProportionOfThreshold(Scalar κ, const Tensor<Scalar, p>& J, const Vector<Scalar>& z) { + Real N = z.size(); + Scalar ε = getHamiltonian(J, z) / N; + Real a = z.squaredNorm() / N; + + return norm(ε) / getThresholdEnergyDensity(p, κ, ε, a); +} + template <class Scalar> Vector<Scalar> zDot(const Vector<Scalar>& z, const Vector<Scalar>& dH) { return -dH.conjugate() + (dH.dot(z) / z.squaredNorm()) * z.conjugate(); |