arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/test/testlib/reim4_elem.cpp
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/test/testlib/reim4_elem.cppRaw
  1#include "reim4_elem.h"
  2
  3reim4_elem::reim4_elem(const double* re, const double* im) {
  4  for (uint64_t i = 0; i < 4; ++i) {
  5    value[i] = re[i];
  6    value[4 + i] = im[i];
  7  }
  8}
  9reim4_elem::reim4_elem(const double* layout) {
 10  for (uint64_t i = 0; i < 8; ++i) {
 11    value[i] = layout[i];
 12  }
 13}
 14reim4_elem::reim4_elem() {
 15  for (uint64_t i = 0; i < 8; ++i) {
 16    value[i] = 0.;
 17  }
 18}
 19void reim4_elem::save_re_im(double* re, double* im) const {
 20  for (uint64_t i = 0; i < 4; ++i) {
 21    re[i] = value[i];
 22    im[i] = value[4 + i];
 23  }
 24}
 25void reim4_elem::save_as(double* reim4) const {
 26  for (uint64_t i = 0; i < 8; ++i) {
 27    reim4[i] = value[i];
 28  }
 29}
 30reim4_elem reim4_elem::zero() { return reim4_elem(); }
 31
 32bool operator==(const reim4_elem& x, const reim4_elem& y) {
 33  for (uint64_t i = 0; i < 8; ++i) {
 34    if (x.value[i] != y.value[i]) return false;
 35  }
 36  return true;
 37}
 38
 39reim4_elem gaussian_reim4() {
 40  test_rng& gen = randgen();
 41  std::normal_distribution<double> dist(0, 1);
 42  reim4_elem res;
 43  for (uint64_t i = 0; i < 8; ++i) {
 44    res.value[i] = dist(gen);
 45  }
 46  return res;
 47}
 48
 49reim4_array_view::reim4_array_view(uint64_t size, double* data) : size(size), data(data) {}
 50reim4_elem reim4_array_view::get(uint64_t i) const {
 51  REQUIRE_DRAMATICALLY(i < size, "reim4 array overflow");
 52  return reim4_elem(data + 8 * i);
 53}
 54void reim4_array_view::set(uint64_t i, const reim4_elem& value) {
 55  REQUIRE_DRAMATICALLY(i < size, "reim4 array overflow");
 56  value.save_as(data + 8 * i);
 57}
 58
 59reim_view::reim_view(uint64_t m, double* data) : m(m), data(data) {}
 60reim4_elem reim_view::get_blk(uint64_t i) {
 61  REQUIRE_DRAMATICALLY(i < m / 4, "block overflow");
 62  return reim4_elem(data + 4 * i, data + m + 4 * i);
 63}
 64void reim_view::set_blk(uint64_t i, const reim4_elem& value) {
 65  REQUIRE_DRAMATICALLY(i < m / 4, "block overflow");
 66  value.save_re_im(data + 4 * i, data + m + 4 * i);
 67}
 68
 69reim_vector_view::reim_vector_view(uint64_t m, uint64_t nrows, double* data) : m(m), nrows(nrows), data(data) {}
 70reim_view reim_vector_view::row(uint64_t row) {
 71  REQUIRE_DRAMATICALLY(row < nrows, "row overflow");
 72  return reim_view(m, data + 2 * m * row);
 73}
 74
 75/** @brief addition */
 76reim4_elem operator+(const reim4_elem& x, const reim4_elem& y) {
 77  reim4_elem reps;
 78  for (uint64_t i = 0; i < 8; ++i) {
 79    reps.value[i] = x.value[i] + y.value[i];
 80  }
 81  return reps;
 82}
 83reim4_elem& operator+=(reim4_elem& x, const reim4_elem& y) {
 84  for (uint64_t i = 0; i < 8; ++i) {
 85    x.value[i] += y.value[i];
 86  }
 87  return x;
 88}
 89/** @brief subtraction */
 90reim4_elem operator-(const reim4_elem& x, const reim4_elem& y) {
 91  reim4_elem reps;
 92  for (uint64_t i = 0; i < 8; ++i) {
 93    reps.value[i] = x.value[i] + y.value[i];
 94  }
 95  return reps;
 96}
 97reim4_elem& operator-=(reim4_elem& x, const reim4_elem& y) {
 98  for (uint64_t i = 0; i < 8; ++i) {
 99    x.value[i] -= y.value[i];
100  }
101  return x;
102}
103/** @brief product */
104reim4_elem operator*(const reim4_elem& x, const reim4_elem& y) {
105  reim4_elem reps;
106  for (uint64_t i = 0; i < 4; ++i) {
107    double xre = x.value[i];
108    double yre = y.value[i];
109    double xim = x.value[i + 4];
110    double yim = y.value[i + 4];
111    reps.value[i] = xre * yre - xim * yim;
112    reps.value[i + 4] = xre * yim + xim * yre;
113  }
114  return reps;
115}
116/** @brief distance in infty norm */
117double infty_dist(const reim4_elem& x, const reim4_elem& y) {
118  double dist = 0;
119  for (uint64_t i = 0; i < 8; ++i) {
120    double d = fabs(x.value[i] - y.value[i]);
121    if (d > dist) dist = d;
122  }
123  return dist;
124}
125
126std::ostream& operator<<(std::ostream& out, const reim4_elem& x) {
127  out << "[\n";
128  for (uint64_t i = 0; i < 4; ++i) {
129    out << "  re=" << x.value[i] << ", im=" << x.value[i + 4] << "\n";
130  }
131  return out << "]";
132}
133
134reim4_matrix_view::reim4_matrix_view(uint64_t nrows, uint64_t ncols, double* data)
135    : nrows(nrows), ncols(ncols), data(data) {}
136reim4_elem reim4_matrix_view::get(uint64_t row, uint64_t col) const {
137  REQUIRE_DRAMATICALLY(row < nrows, "rows out of bounds" << row << " / " << nrows);
138  REQUIRE_DRAMATICALLY(col < ncols, "cols out of bounds" << col << " / " << ncols);
139  return reim4_elem(data + 8 * (row * ncols + col));
140}
141void reim4_matrix_view::set(uint64_t row, uint64_t col, const reim4_elem& value) {
142  REQUIRE_DRAMATICALLY(row < nrows, "rows out of bounds" << row << " / " << nrows);
143  REQUIRE_DRAMATICALLY(col < ncols, "cols out of bounds" << col << " / " << ncols);
144  value.save_as(data + 8 * (row * ncols + col));
145}