7#ifndef REAL_TIME_TRANSPORT_BLOCK_MATRICES_BLOCK_MATRIX_H
8#define REAL_TIME_TRANSPORT_BLOCK_MATRICES_BLOCK_MATRIX_H
13#include "../extern/boost_unordered.hpp"
15#include <SciCore/Definitions.h>
18#include "../RealTimeTransport_export.h"
21namespace RealTimeTransport
28 using Scalar = SciCore::Complex;
29 using MatrixType = Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>;
30 using UnorderedElementMap = boost::unordered_flat_map<std::pair<
int,
int>, MatrixType>;
32 BlockMatrix()
noexcept;
33 BlockMatrix(
const std::vector<
int>& blockDimensions);
35 template <SciCore::DenseMatrixType DenseMatrixT>
36 BlockMatrix(
const DenseMatrixT& matrix,
const std::vector<
int>& blockDimensions)
38 fromDense(matrix, blockDimensions);
41 BlockMatrix(UnorderedElementMap&& elements,
const std::vector<
int>& blockDimensions);
43 BlockMatrix(BlockMatrix&& other)
noexcept;
44 BlockMatrix(
const BlockMatrix& other)
noexcept;
46 BlockMatrix& operator=(BlockMatrix&& other);
47 BlockMatrix& operator=(
const BlockMatrix& other);
49 BlockMatrix& operator*=(Scalar x);
50 const std::vector<
int>& blockDimensions()
const noexcept;
55 int numBlocks()
const noexcept;
60 int size()
const noexcept;
62 int totalRows()
const noexcept;
64 int totalCols()
const noexcept;
66 void fromUnorderedMap(UnorderedElementMap&& elements,
const std::vector<
int>& blockDimensions);
68 template <
typename DenseMatrixT>
69 void fromDense(
const DenseMatrixT& matrix,
const std::vector<
int>& blockDimensions)
71 _blockDims = blockDimensions;
72 int numBlocks =
this->numBlocks();
77 _nonZeroRows.resize(numBlocks);
78 _nonZeroCols.resize(numBlocks);
81 for (
int i = 0; i < numBlocks; ++i)
83 for (
int j = 0; j < numBlocks; ++j)
85 MatrixType block = extractDenseBlock(matrix, i, j, blockDimensions);
87 if (block.isZero() ==
false)
89 _elements[{i, j}] = std::move(block);
90 _nonZeroRows[j].insert(i);
91 _nonZeroCols[i].insert(j);
97 MatrixType toDense()
const;
100 const MatrixType& operator()(
int i,
int j)
const;
102 void addToBlock(
int i,
int j, MatrixType&& A);
105 bool contains(
int i,
int j)
const noexcept;
107 const std::set<
int>& nonZeroRows(
int j)
const;
108 const std::set<
int>& nonZeroCols(
int i)
const;
110 UnorderedElementMap::iterator begin()
noexcept;
111 UnorderedElementMap::iterator end()
noexcept;
112 UnorderedElementMap::const_iterator begin()
const noexcept;
113 UnorderedElementMap::const_iterator end()
const noexcept;
115 UnorderedElementMap::const_iterator find(
int i,
int j)
const;
118 std::vector<
int> _blockDims;
119 UnorderedElementMap _elements;
122 std::vector<std::set<
int>> _nonZeroRows;
125 std::vector<std::set<
int>> _nonZeroCols;
137 SciCore::Complex alpha,
138 const BlockMatrix& A,
139 const Eigen::Matrix<SciCore::Complex, Eigen::Dynamic, 1>& x,
140 Eigen::Matrix<SciCore::Complex, Eigen::Dynamic, 1>& result,
141 const std::vector<
int>& blockStartIndices);
144 SciCore::Complex alpha,
145 const Eigen::Matrix<SciCore::Complex, 1, Eigen::Dynamic>& x,
146 const BlockMatrix& A,
147 Eigen::Matrix<SciCore::Complex, 1, Eigen::Dynamic>& result,
148 const std::vector<
int>& blockStartIndices);
152 SciCore::Complex alpha,
153 const Eigen::Matrix<SciCore::Complex, 1, Eigen::Dynamic>& x,
154 const BlockMatrix& A,
155 const std::vector<
int>& blockStartIndices);
#define REALTIMETRANSPORT_EXPORT
Definition RealTimeTransport_export.h:15