4 #include "flexLinearOperator.h" 14 typedef thrust::device_vector<T> Tdata;
16 typedef std::vector<T> Tdata;
20 std::vector<int> rowToIndexList;
21 std::vector<int> indexList;
34 flexMatrix(
int aNumRows,
int aNumCols,
bool aMinus) : rowToIndexList(aNumRows + 1, static_cast<int>(0)), indexList(0, 0), valueList(0, 0),
flexLinearOperator<T>(aNumRows, aNumCols, matrixOp, aMinus){};
40 A->rowToIndexList = rowToIndexList;
41 A->indexList = indexList;
42 A->valueList = valueList;
47 void times(
bool transposed,
const Tdata &input, Tdata &output)
52 void timesPlus(
bool transposed,
const Tdata &input, Tdata &output)
56 doTimesCPU(transposed, input, output,MINUS);
60 doTimesCPU(transposed, input, output,PLUS);
64 void timesMinus(
bool transposed,
const Tdata &input, Tdata &output)
68 doTimesCPU(transposed, input, output,PLUS);
72 doTimesCPU(transposed, input, output,MINUS);
83 void blockInsert(std::vector<int> &indexI,
const std::vector<int> &indexJ,
const Tdata &indexVal)
88 int numberListElements = (int)indexI.size();
91 std::vector<int> emptyBucket(0, 0);
92 std::vector < std::vector<int> > buckets(this->
getNumRows(), emptyBucket);
95 for (
int indexInput = 0; indexInput < numberListElements; indexInput++)
97 int bucketIndex = indexI[indexInput];
98 buckets[bucketIndex].push_back(indexInput);
102 for (
int indexRow = 0; indexRow < this->
getNumRows(); indexRow++)
107 for (
int indexBucket = 0; indexBucket < (int)buckets[indexRow].size(); indexBucket++)
109 int tmpIndex = buckets[indexRow][indexBucket];
111 indexList.push_back(indexJ[tmpIndex]);
112 valueList.push_back(indexVal[tmpIndex]);
117 rowToIndexList[indexRow + 1] = rowToIndexList[indexRow] + numElements;
158 return *std::max_element(rowSum.begin(), rowSum.end());
171 for (
int index = rowToIndexList[k]; index < rowToIndexList[k + 1]; ++index)
173 result[indexList[index]] += std::abs(valueList[index]);
183 #pragma omp parallel for 186 T tmpSum =
static_cast<T
>(0);
187 for (
int index = rowToIndexList[k]; index < rowToIndexList[k + 1]; ++index)
189 tmpSum += std::abs(valueList[index]);
206 for (
int index = rowToIndexList[i]; index < rowToIndexList[i+1]; ++index)
208 printf(
"(%d,%d,%f)|", i, indexList[index], valueList[index]);
227 thrust::device_vector<T> result(this->
getNumRows(), (T)1);
234 void doTimesCPU(
bool transposed,
const Tdata &input, Tdata &output,
const mySign s)
241 int indexNext = rowToIndexList[i + 1];
242 for (
int index = rowToIndexList[i]; index < indexNext; ++index)
248 output[indexList[index]] += input[i] * valueList[index];
253 output[indexList[index]] -= input[i] * valueList[index];
262 #pragma omp parallel for 267 int indexNext = rowToIndexList[i + 1];
268 for (
int index = rowToIndexList[i]; index < indexNext; ++index)
270 rowsum += input[indexList[index]] * valueList[index];
T getMaxRowSumAbs(bool transposed)
returns the maximum sum of absolute values per row used for preconditioning
Definition: flexMatrix.h:154
int getNumRows() const
returns number of rows of the linear operator
Definition: flexLinearOperator.h:57
std::vector< T > getAbsRowSum(bool transposed)
returns a vector of sum of absolute values per row used for preconditioning
Definition: flexMatrix.h:162
bool isMinus
determines if operator is negated
Definition: flexLinearOperator.h:25
represents a (non-CUDA) matrix
Definition: flexMatrix.h:10
void timesMinus(bool transposed, const Tdata &input, Tdata &output)
applies linear operator on vector and substracts its result from y
Definition: flexMatrix.h:64
void blockInsert(std::vector< int > &indexI, const std::vector< int > &indexJ, const Tdata &indexVal)
inserts data into matrix
Definition: flexMatrix.h:83
int getNumCols() const
returns number of columns of the linear operator
Definition: flexLinearOperator.h:48
void timesPlus(bool transposed, const Tdata &input, Tdata &output)
applies linear operator on vector and adds its result to y
Definition: flexMatrix.h:52
flexMatrix()
initializes an empty matrix
Definition: flexMatrix.h:26
flexMatrix< T > * copy()
copies the linear operator
Definition: flexMatrix.h:36
thrust::device_vector< T > getAbsRowSumCUDA(bool transposed)
same function as getAbsRowSum() but implemented in CUDA
Definition: flexMatrix.h:225
flexMatrix(int aNumRows, int aNumCols, bool aMinus)
initializes a matrix
Definition: flexMatrix.h:34
void times(bool transposed, const Tdata &input, Tdata &output)
applies linear operator on vector
Definition: flexMatrix.h:47
abstract base class for linear operators
Definition: flexLinearOperator.h:12
void printMatrix()
prints the whole matrix
Definition: flexMatrix.h:215
void printRow(int i)
prints requested row
Definition: flexMatrix.h:204