1 |
|
|
2 |
|
#ifndef SPDMATRIX_HPP |
3 |
|
#define SPDMATRIX_HPP |
4 |
|
|
5 |
|
#include<Data.hpp> |
6 |
|
#include<VirtualMatrix.hpp> |
7 |
|
|
8 |
|
using namespace std; |
9 |
|
using namespace hmlp; |
10 |
|
|
11 |
|
namespace hmlp |
12 |
|
{ |
13 |
|
|
14 |
|
|
15 |
|
/** |
16 |
|
* @brief This class does not need to inherit hmlp::Data<T>, |
17 |
|
* but it should |
18 |
|
* support two interfaces for data fetching. |
19 |
|
*/ |
20 |
|
template<typename T> |
21 |
|
class SPDMatrix : public VirtualMatrix<T> |
22 |
|
{ |
23 |
|
public: |
24 |
|
|
25 |
|
SPDMatrix() : VirtualMatrix<T>() {}; |
26 |
|
|
27 |
|
SPDMatrix( size_t m, size_t n ) |
28 |
|
: VirtualMatrix<T>( m, n ) { K.resize( m, n ); }; |
29 |
|
|
30 |
|
SPDMatrix( size_t m, size_t n, string filename ) |
31 |
|
: VirtualMatrix<T>( m, n ) |
32 |
|
{ |
33 |
|
K.resize( m, n ); |
34 |
|
K.read( m, n, filename ); |
35 |
|
}; |
36 |
|
|
37 |
|
void resize( size_t m, size_t n ) |
38 |
|
{ |
39 |
|
VirtualMatrix<T>::resize( m, n ); |
40 |
|
K.resize( m, n ); |
41 |
|
}; |
42 |
|
|
43 |
|
template<bool USE_LOWRANK=true> |
44 |
|
void randspd( T a, T b ) { K.randspd( a, b ); }; |
45 |
|
|
46 |
|
void read( size_t m, size_t n, string &filename ) |
47 |
|
{ |
48 |
|
K.read( m, n, filename ); |
49 |
|
}; |
50 |
|
|
51 |
|
T operator()( size_t i, size_t j ) { return K( i, j ); }; |
52 |
|
|
53 |
|
Data<T> operator() ( const vector<size_t> &I, |
54 |
|
const vector<size_t> &J ) |
55 |
|
{ |
56 |
|
return K( I, J ); |
57 |
|
}; |
58 |
|
|
59 |
|
T* data() noexcept { return K.data(); }; |
60 |
|
|
61 |
|
const T* data() const noexcept { return K.data(); }; |
62 |
|
|
63 |
|
private: |
64 |
|
|
65 |
|
Data<T> K; |
66 |
|
|
67 |
|
}; /** end class SPDMatrix */ |
68 |
|
|
69 |
|
|
70 |
|
|
71 |
|
|
72 |
|
template<typename T> |
73 |
|
class OOCSPDMatrix : public VirtualMatrix<T> |
74 |
|
{ |
75 |
|
public: |
76 |
|
|
77 |
|
OOCSPDMatrix( size_t m, size_t n, string filename ) |
78 |
|
: VirtualMatrix<T>( m, n ) |
79 |
|
{ |
80 |
|
K.Set( m, n, filename ); |
81 |
|
}; |
82 |
|
|
83 |
|
T operator()( size_t i, size_t j ) { return K( i, j ); }; |
84 |
|
|
85 |
|
Data<T> operator() ( const vector<size_t> &I, |
86 |
|
const vector<size_t> &J ) |
87 |
|
{ |
88 |
|
return K( I, J ); |
89 |
|
}; |
90 |
|
|
91 |
|
private: |
92 |
|
|
93 |
|
OOCData<T> K; |
94 |
|
|
95 |
|
}; /** end class OOCSPDMatrix */ |
96 |
|
|
97 |
|
}; /** end namespace hmlp */ |
98 |
|
|
99 |
|
|
100 |
|
#endif /** define SPDMATRIX_HPP */ |