From 199b129c08242be6a2726aae3c9918ca2f2484f7 Mon Sep 17 00:00:00 2001 From: Jaron Kent-Dobias Date: Fri, 15 Jan 2021 16:29:59 +0100 Subject: More changes. --- tensor.hpp | 49 ++++++++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 21 deletions(-) (limited to 'tensor.hpp') diff --git a/tensor.hpp b/tensor.hpp index 21f2a89..6a5b2c2 100644 --- a/tensor.hpp +++ b/tensor.hpp @@ -5,43 +5,52 @@ #include +template +using Vector = Eigen::Matrix; + +template +using Matrix = Eigen::Matrix; + +template +using Tensor = Eigen::Tensor; + template -Eigen::Tensor initializeJHelper(unsigned N, std::index_sequence) { +Tensor initializeJHelper(unsigned N, std::index_sequence) { std::array Ns; std::fill_n(Ns.begin(), p, N); - return Eigen::Tensor(std::get(Ns)...); + return Tensor(std::get(Ns)...); } template -Eigen::Tensor initializeJ(unsigned N) { +Tensor initializeJ(unsigned N) { return initializeJHelper(N, std::make_index_sequence

()); } template -void setJHelper(Eigen::Tensor& J, const std::array& ind, Scalar val, std::index_sequence) { +void setJHelper(Tensor& J, const std::array& ind, Scalar val, std::index_sequence) { J(std::get(ind)...) = val; } template -void setJ(Eigen::Tensor& J, std::array ind, Scalar val) { +void setJ(Tensor& J, std::array ind, Scalar val) { do { setJHelper(J, ind, val, std::make_index_sequence

()); } while (std::next_permutation(ind.begin(), ind.end())); } template -Scalar getJHelper(const Eigen::Tensor& J, const std::array& ind, std::index_sequence) { +Scalar getJHelper(const Tensor& J, const std::array& ind, std::index_sequence) { return J(std::get(ind)...); } template -Scalar getJ(const Eigen::Tensor& J, const std::array& ind) { +Scalar getJ(const Tensor& J, const std::array& ind) { return getJHelper(J, ind, std::make_index_sequence

()); } template -void iterateOverHelper(Eigen::Tensor& J, - std::function&, std::array)>& f, +void iterateOverHelper(Tensor& J, + std::function&, std::array)>& f, unsigned l, std::array is) { if (l == 0) { f(J, is); @@ -61,17 +70,17 @@ void iterateOverHelper(Eigen::Tensor& J, } template -void iterateOver(Eigen::Tensor& J, std::function&, std::array)>& f) { +void iterateOver(Tensor& J, std::function&, std::array)>& f) { std::array is; iterateOverHelper(J, f, p, is); } template -Eigen::Tensor generateCouplings(unsigned N, Distribution d, Generator& r) { - Eigen::Tensor J = initializeJ(N); +Tensor generateCouplings(unsigned N, Distribution d, Generator& r) { + Tensor J = initializeJ(N); - std::function&, std::array)> setRandom = - [&d, &r] (Eigen::Tensor& JJ, std::array ind) { + std::function&, std::array)> setRandom = + [&d, &r] (Tensor& JJ, std::array ind) { setJ(JJ, ind, d(r)); }; @@ -81,17 +90,15 @@ Eigen::Tensor generateCouplings(unsigned N, Distribution d, Generator } template -Eigen::Matrix -contractDown(const Eigen::Tensor& J, const Eigen::Matrix& z) { - return Eigen::Map>(J.data(), z.size(), z.size()); +Matrix contractDown(const Tensor& J, const Vector& z) { + return Eigen::Map>(J.data(), z.size(), z.size()); } const std::array, 1> ip00 = {Eigen::IndexPair(0, 0)}; template -Eigen::Matrix -contractDown(const Eigen::Tensor& J, const Eigen::Matrix& z) { - Eigen::Tensor zT = Eigen::TensorMap>(z.data(), {z.size()}); - Eigen::Tensor Jz = J.contract(zT, ip00); +Matrix contractDown(const Tensor& J, const Vector& z) { + Tensor zT = Eigen::TensorMap>(z.data(), {z.size()}); + Tensor Jz = J.contract(zT, ip00); return contractDown(Jz, z); } -- cgit v1.2.3-54-g00ecf