42 virtual ~DoKLocalMatrixT() =
default;
44 DoKLocalMatrixT& operator=(DoKLocalMatrixT&& src)
noexcept
46 m_indexer = std::move(src.m_indexer);
47 m_r_indexer = std::move(src.m_r_indexer);
49 if (&m_values != &src.m_values) {
50 m_values = src.m_values;
56 DoKLocalMatrixT& operator=(
const DoKLocalMatrixT& src)
58 m_indexer.reset(src.m_indexer->clone());
59 m_values = src.m_values;
60 m_r_indexer.reset(
nullptr);
65 void setMaxNnz(Integer size) { _reallocate(size); }
71 void set(Int32 i, Int32 j,
const NNZValue& val)
73 auto offset = findOffset(i, j);
74 m_values[offset] = val;
77 NNZValue add(Int32 i, Int32 j,
const NNZValue& val)
79 auto offset = findOffset(i, j);
80 m_values[offset] += val;
81 return m_values[offset];
87 UniqueArray<ILocalMatrixIndexer::Renumbering> perm(m_offset);
88 m_r_indexer.reset(m_indexer->sort(perm));
89 UniqueArray<NNZValue> old_vals = m_values;
90 for (
auto curr : perm) {
91 m_values[curr.second] = old_vals[curr.first];
95 IReverseIndexer* getReverseIndexer()
const {
return m_r_indexer.get(); }
97 ILocalMatrixIndexer* getIndexer()
const {
return m_indexer.get(); }
99 ConstArrayView<NNZValue> getValues()
const {
return m_values; }
103 if (m_r_indexer ==
nullptr)
106 std::cout <<
"Number of elements: " << m_values.size() <<
"\n";
107 for (
int i = 0; i < m_r_indexer->size(); ++i) {
108 auto index = (*m_r_indexer)[i];
109 auto offset = m_indexer->find(index.value().first, index.value().second);
111 <<
"( " << index.value().first <<
" , " << index.value().second <<
" ) "
113 << m_values[offset.value()]
119 void _reallocate(Integer size = 0)
121 if (size || (size < m_offset + 1))
123 m_values.resize(size);
126 ILocalMatrixIndexer::Offset findOffset(Int32 i, Int32 j)
128 auto offset = m_indexer->create(i, j, m_offset);
129 if (offset == (Integer)m_values.size()) {
136 std::unique_ptr<ILocalMatrixIndexer> m_indexer;
137 ILocalMatrixIndexer::Offset m_offset;
138 UniqueArray<NNZValue> m_values;
139 std::unique_ptr<IReverseIndexer> m_r_indexer;