From 870555f569bc63fecdc7c0b16e72e4e002f21c13 Mon Sep 17 00:00:00 2001 From: Jaron Kent-Dobias Date: Thu, 26 Jul 2018 13:06:54 -0400 Subject: all the R_t have been objectified --- lib/orthogonal.h | 200 +++++++++++++++++++++++-------------------------------- 1 file changed, 85 insertions(+), 115 deletions(-) (limited to 'lib/orthogonal.h') diff --git a/lib/orthogonal.h b/lib/orthogonal.h index c0958f2..34cd44e 100644 --- a/lib/orthogonal.h +++ b/lib/orthogonal.h @@ -11,164 +11,134 @@ #include "vector.h" template -struct orthogonal_t { bool is_reflection; T *x; }; +class orthogonal_t : public std::array, q> { + public : + bool is_reflection; -template -void init(orthogonal_t *ptr) { - ptr->is_reflection = false; - ptr->x = (T *)calloc(q * q, sizeof(T)); - - for (q_t i = 0; i < q; i++) { - ptr->x[q * i + i] = (T)1; - } -} - -template -orthogonal_t copy (orthogonal_t m) { - orthogonal_t m_copy; - m_copy.is_reflection = m.is_reflection; - - q_t size; - - if (m.is_reflection) { - size = q; - } else { - size = q * q; - } - - m_copy.x = (T *)calloc(size, sizeof(T)); - - for (q_t i = 0; i < size; i++) { - m_copy.x[i] = m.x[i]; + orthogonal_t() : is_reflection(false) { + for (q_t i = 0; i < q; i++) { + (*this)[i].fill(0); + (*this)[i][i] = (T)1; + } } - return m_copy; -} - -template -void free_spin (orthogonal_t m) { - free(m.x); -} - -template -vector_t act (orthogonal_t m, vector_t v) { - vector_t v_rot; + vector_t act(const vector_t & v) const { + vector_t v_rot; - if (m.is_reflection) { - double prod = 0; - for (q_t i = 0; i < q; i++) { - prod += v[i] * m.x[i]; - } - for (q_t i = 0; i < q; i++) { - v_rot[i] = v[i] - 2 * prod * m.x[i]; - } - } else { - for (q_t i = 0; i < q; i++) { - for (q_t j = 0; j < q; j++) { - v_rot[i] += m.x[q * i + j] * v[j]; + if (is_reflection) { + double prod = 0; + for (q_t i = 0; i < q; i++) { + prod += v[i] * (*this)[0][i]; + } + for (q_t i = 0; i < q; i++) { + v_rot[i] = v[i] - 2 * prod * (*this)[0][i]; + } + } else { + for (q_t i = 0; i < q; i++) { + for (q_t j = 0; j < q; j++) { + v_rot[i] += (*this)[i][j] * v[j]; + } } } - } - return v_rot; -} + return v_rot; + } -template -orthogonal_t act (orthogonal_t m1, orthogonal_t m2) { - orthogonal_t m2_rot; + orthogonal_t act(const orthogonal_t & m) const { + orthogonal_t m_rot; - m2_rot.is_reflection = false; - m2_rot.x = (T *)calloc(q * q, sizeof(T)); + m_rot.is_reflection = false; - if (m1.is_reflection) { - for (q_t i = 0; i < q; i++) { - double akOki = 0; + if (is_reflection) { + for (q_t i = 0; i < q; i++) { + double akOki = 0; - for (q_t k = 0; k < q; k++) { - akOki += m1.x[k] * m2.x[q * k + i]; - } + for (q_t k = 0; k < q; k++) { + akOki += (*this)[0][k] * m[k][i]; + } - for (q_t j = 0; j < q; j++) { - m2_rot.x[q * j + i] = m2.x[q * j + i] - 2 * akOki * m1.x[j]; + for (q_t j = 0; j < q; j++) { + m_rot[j][i] = m[j][i] - 2 * akOki * (*this)[0][j]; + } } - } - } else { - for (q_t i = 0; i < q; i++) { - for (q_t j = 0; j < q; j++) { - for (q_t k = 0; k < q; k++) { - m2_rot.x[i * q + j] += m1.x[i * q + j] * m2.x[j * q + k]; + } else { + for (q_t i = 0; i < q; i++) { + m_rot[i].fill(0); + for (q_t j = 0; j < q; j++) { + for (q_t k = 0; k < q; k++) { + m_rot[i][j] += (*this)[i][j] * m[j][k]; + } } } } - } - return m2_rot; -} + return m_rot; + } -template -vector_t act_inverse (orthogonal_t m, vector_t v) { - if (m.is_reflection) { - return act(m, v); // reflections are their own inverse - } else { - vector_t v_rot; + vector_t act_inverse(const vector_t & v) const { + if (is_reflection) { + return this->act(v); // reflections are their own inverse + } else { + vector_t v_rot; - for (q_t i = 0; i < q; i++) { - for (q_t j = 0; j < q; j++) { - v_rot[i] += m.x[q * j + i] * v[j]; + for (q_t i = 0; i < q; i++) { + for (q_t j = 0; j < q; j++) { + v_rot[i] += (*this)[j][i] * v[j]; + } } - } - return v_rot; + return v_rot; + } } -} - -template -orthogonal_t act_inverse (orthogonal_t m1, orthogonal_t m2) { - if (m1.is_reflection) { - return act(m1, m2); // reflections are their own inverse - } else { - orthogonal_t m2_rot; - m2_rot.x = (T *)calloc(q * q, sizeof(T)); - for (q_t i = 0; i < q; i++) { - for (q_t j = 0; j < q; j++) { - for (q_t k = 0; k < q; k++) { - m2_rot.x[i * q + j] += m1.x[j * q + i] * m2.x[j * q + k]; + vector_t act_inverse(const orthogonal_t & m) const { + if (is_reflection) { + return this->act(m); // reflections are their own inverse + } else { + orthogonal_t m_rot; + m_rot.is_reflection = false; + + for (q_t i = 0; i < q; i++) { + m_rot[i].fill(0); + for (q_t j = 0; j < q; j++) { + for (q_t k = 0; k < q; k++) { + m_rot[i][j] += (*this)[j][i] * m[j][k]; + } } } - } - return m2_rot; + return m_rot; + } } -} + +}; + template -orthogonal_t generate_rotation_uniform (gsl_rng *r, vector_t v) { +orthogonal_t generate_rotation_uniform (gsl_rng *r, const vector_t & v) { orthogonal_t ptr; ptr.is_reflection = true; - ptr.x = (double *)calloc(q, sizeof(double)); double v2 = 0; for (q_t i = 0; i < q; i++) { - ptr.x[i] = gsl_ran_ugaussian(r); - v2 += ptr.x[i] * ptr.x[i]; + ptr[0][i] = gsl_ran_ugaussian(r); + v2 += ptr[0][i] * ptr[0][i]; } double mag_v = sqrt(v2); for (q_t i = 0; i < q; i++) { - ptr.x[i] /= mag_v; + ptr[0][i] /= mag_v; } return ptr; } template -orthogonal_t generate_rotation_perturbation (gsl_rng *r, vector_t v0, double epsilon, unsigned int n) { +orthogonal_t generate_rotation_perturbation (gsl_rng *r, const vector_t & v0, double epsilon, unsigned int n) { orthogonal_t m; m.is_reflection = true; - m.x = (double *)malloc(q * sizeof(double)); vector_t v; @@ -191,22 +161,22 @@ orthogonal_t generate_rotation_perturbation (gsl_rng *r, vector_t