fml  0.1-0
Fused Matrix Library
sym.hh
1 // This file is part of fml which is released under the Boost Software
2 // License, Version 1.0. See accompanying file LICENSE or copy at
3 // https://www.boost.org/LICENSE_1_0.txt
4 
5 #ifndef FML_CPU_FUTURE_SYM_H
6 #define FML_CPU_FUTURE_SYM_H
7 #pragma once
8 
9 
10 #include <cmath>
11 #include <stdexcept>
12 
13 #include "../cpumat.hh"
14 
15 
16 namespace sym
17 {
18  template <typename REAL>
19  bool is_sym(const cpumat<REAL> &x)
20  {
21  if (!x.is_square())
22  return false;
23 
24  const int blocksize = 8;
25  const len_t n = x.nrows();
26 
27  for (len_t j=0; j<n; j+=blocksize)
28  {
29  for (len_t i=j; i<n; i+=blocksize)
30  {
31  for (len_t col=j; col<j+blocksize && col<n; ++col)
32  {
33  for (len_t row=i; row<i+blocksize && row<n; ++row)
34  {
35  const bool check = samenum(x[col + n*row], x[row + n*col]);
36  if (!check)
37  return false;
38  }
39  }
40  }
41  }
42 
43  return true;
44  }
45 
46 
47  template <typename REAL>
48  void make_sym(cpumat<REAL> &x)
49  {
50  if (!x.is_square())
51  throw std::runtime_error("non-square matrix");
52 
53  const int blocksize = 8;
54  const len_t n = x.nrows();
55 
56  REAL *x_d = x.data_ptr();
57  for (len_t j=0; j<n; j+=blocksize)
58  {
59  for (len_t i=j+1; i<n; i+=blocksize)
60  {
61  for (len_t col=j; col<j+blocksize && col<n; ++col)
62  {
63  for (len_t row=i; row<i+blocksize && row<n; ++row)
64  x_d[col + n*row] = x_d[row + n*col];
65  }
66  }
67  }
68  }
69 }
70 
71 
72 #endif