From a1c5f64f3c8c9812cb0b4658630f79dab1856c0c Mon Sep 17 00:00:00 2001 From: Jaron Kent-Dobias Date: Tue, 25 Feb 2020 19:40:35 -0500 Subject: Fance inheritance --- euclidean.hpp | 113 ++++++++++++++++------------------------------------------ 1 file changed, 31 insertions(+), 82 deletions(-) (limited to 'euclidean.hpp') diff --git a/euclidean.hpp b/euclidean.hpp index fb2dbcd..f0e54d4 100644 --- a/euclidean.hpp +++ b/euclidean.hpp @@ -1,6 +1,7 @@ #pragma once +#include "mod.hpp" #include "matrix.hpp" #include "spin.hpp" #include "vector.hpp" @@ -14,12 +15,16 @@ public: Vector relativePosition; }; -template class Euclidean { +template class Affine { +protected: + virtual Vector actV(const Vector& x) const { return t + r * x; } + Affine actA(const Affine& x) const { return Affine(act(x.t), r * x.r); } + public: Vector t; Matrix r; - Euclidean(T L) { + Affine() { for (unsigned i = 0; i < D; i++) { t(i) = 0; r(i, i) = 1; @@ -29,21 +34,13 @@ public: } } - Euclidean(Vector t0, Matrix r0) { - t = t0; - r = r0; - } - - Vector act(const Vector& x) const { return t + r * x; } + Affine(const Vector& t0, const Matrix& r0) : t(t0), r(r0) {} - template Vector act(const Vector& x) const { - return t.template cast() + r.template cast() * x; - } + Affine inverse() const { return Affine(-r.transpose() * t, r.transpose()); } + Vector act(const Vector& x) const { return actV(x); } Radius act(Radius r) const { return r; } - IsingSpin act(IsingSpin s) const { return s; } - Dimer act(const Dimer& d) const { return {.radius = d.radius, .relativePosition = r * d.relativePosition}; } @@ -51,90 +48,42 @@ public: template Spin act(const Spin& s) const { return {.x = act(s.x), .s = act(s.s)}; } +}; - Euclidean act(const Euclidean& x) const { return Euclidean(r * x.t + t, r * x.r); } +template class Euclidean : public Affine { +public: + Euclidean(T L = 0) : Affine() {} + Euclidean(const Affine& a) : Affine(a) {} + Euclidean(Vector t0, Matrix r0) : Affine(t0, r0) {} + + Euclidean act(const Euclidean& t) const { return Affine::actA(t); }; - Euclidean inverse() const { return Euclidean(-r.transpose() * t, r.transpose()); } + using Affine::act; }; -template class TorusGroup { +template class TorusGroup : public Affine{ private: T L; -public: - Vector t; - Matrix r; - - /** brief TorusGroup - default constructor, constructs the identity - */ - TorusGroup(T L) : L(L) { - for (unsigned i = 0; i < D; i++) { - t(i) = 0; - r(i, i) = 1; - for (unsigned j = 1; j < D; j++) { - r(i, (i + j) % D) = 0; - } - } - } - - TorusGroup(T L, Vector t0, Matrix r0) : L(L) { - t = t0; - r = r0; - } - - template Spin act(const Spin& s) const { - Spin s_new; - - s_new.x = t + r * s.x; - s_new.s = s.s; - - for (unsigned i = 0; i < D; i++) { - s_new.x(i) = fmod(L + s_new.x(i), L); - } - - return s_new; - } - - Vector act(const Vector& s) const { - Vector s_new = t + r * s; - - for (unsigned i = 0; i < D; i++) { - s_new(i) = fmod(L + s_new(i), L); - } - - return s_new; - } - - template Vector act(const Vector& s) const { - Vector s_new = t.template cast() + r.template cast() * s; +protected: + Vector actV(const Vector& s) const override { + Vector s_new = Affine::actV(s); for (unsigned i = 0; i < D; i++) { - s_new(i) = fmod(L + s_new(i), L); + s_new(i) = mod(s_new(i), L); } return s_new; } - TorusGroup act(const TorusGroup& x) const { - Vector tnew = r * x.t + t; - Matrix rnew = r * x.r; - - for (unsigned i = 0; i < D; i++) { - tnew(i) = fmod(L + tnew(i), L); - } - - TorusGroup pnew(this->L, tnew, rnew); - - return pnew; - } - - TorusGroup inverse() const { - Vector tnew = -r.transpose() * t; - Matrix rnew = r.transpose(); +public: + TorusGroup(T L) : Affine(), L(L) {} + TorusGroup(T L, Vector t0, Matrix r0) : Affine(), L(L) {} + TorusGroup(T L, const Affine& t) : Affine(t), L(L) {} - TorusGroup pnew(this->L, tnew, rnew); + TorusGroup act(const TorusGroup& t) const { return TorusGroup(L, Affine::actA(t)); } + TorusGroup inverse() const { return TorusGroup(L, Affine::inverse()); } - return pnew; - } + using Affine::act; }; -- cgit v1.2.3-54-g00ecf