1 #ifndef flexIdentityOperator_H 2 #define flexIdentityOperator_H 7 #include "flexLinearOperator.h" 15 typedef thrust::device_vector<T> Tdata;
17 typedef std::vector<T> Tdata;
38 void times(
bool transposed,
const Tdata &input, Tdata &output)
47 #pragma omp parallel for 48 for (
int i = 0; i < numCols; ++i)
50 if(numCols > numRows && i >= numRows)
53 output[i] = -input[i];
58 #pragma omp parallel for 59 for (
int i = 0; i < numRows; ++i)
61 if(numRows > numCols && i >= numCols)
64 output[i] = -input[i];
72 #pragma omp parallel for 73 for (
int i = 0; i < numCols; ++i)
75 if(numCols > numRows && i >= numRows)
83 #pragma omp parallel for 84 for (
int i = 0; i < numRows; ++i)
86 if(numRows > numCols && i >= numCols)
95 void timesPlus(
bool transposed,
const Tdata &input, Tdata &output)
99 doTimesMinus(transposed, input, output);
103 doTimesPlus(transposed, input, output);
107 void timesMinus(
bool transposed,
const Tdata &input, Tdata &output)
111 doTimesPlus(transposed, input, output);
115 doTimesMinus(transposed, input, output);
121 return static_cast<T
>(1);
126 std::vector<T> result;
129 result = std::vector<T>(this->
getNumCols(), (T)1);
131 result = std::vector<T>(this->
getNumRows(), (T)1);
139 thrust::device_vector<T> result;
142 result = thrust::device_vector<T>(this->
getNumCols(), (T)1);
144 result = thrust::device_vector<T>(this->
getNumRows(), (T)1);
151 void doTimesPlus(
bool transposed,
const Tdata &input, Tdata &output)
159 if(numCols <= numRows)
160 thrust::transform(output.begin(), output.end(), input.begin(), output.begin(), thrust::plus<T>());
163 thrust::transform(output.begin(), output.begin() + numRows, input.begin(), output.begin(), thrust::plus<T>());
167 #pragma omp parallel for 168 for (
int i = 0; i < numCols; ++i)
170 if(numCols <= numRows || i < numRows)
171 output[i] += input[i];
178 if(numRows <= numCols)
179 thrust::transform(output.begin(), output.end(), input.begin(), output.begin(), thrust::plus<T>());
182 thrust::transform(output.begin(), output.begin() + numCols, input.begin(), output.begin(), thrust::plus<T>());
185 #pragma omp parallel for 186 for (
int i = 0; i < numRows; ++i)
188 if(numRows <= numCols || i < numCols)
189 output[i] += input[i];
195 void doTimesMinus(
bool transposed,
const Tdata &input, Tdata &output)
203 if(numCols <= numRows)
204 thrust::transform(output.begin(), output.end(), input.begin(), output.begin(), thrust::minus<T>());
207 thrust::transform(output.begin(), output.begin() + numRows, input.begin(), output.begin(), thrust::minus<T>());
211 #pragma omp parallel for 212 for (
int i = 0; i < numCols; ++i)
214 if(numCols <= numRows || i < numRows)
215 output[i] -= input[i];
222 if(numRows <= numCols)
223 thrust::transform(output.begin(), output.end(), input.begin(), output.begin(), thrust::minus<T>());
226 thrust::transform(output.begin(), output.begin() + numCols, input.begin(), output.begin(), thrust::minus<T>());
229 #pragma omp parallel for 230 for (
int i = 0; i < numRows; ++i)
232 if(numRows <= numCols || i < numCols)
233 output[i] -= input[i];
int getNumRows() const
returns number of rows of the linear operator
Definition: flexLinearOperator.h:57
thrust::device_vector< T > getAbsRowSumCUDA(bool transposed)
same function as getAbsRowSum() but implemented in CUDA
Definition: flexIdentityOperator.h:137
void times(bool transposed, const Tdata &input, Tdata &output)
applies linear operator on vector
Definition: flexIdentityOperator.h:38
bool isMinus
determines if operator is negated
Definition: flexLinearOperator.h:25
void timesPlus(bool transposed, const Tdata &input, Tdata &output)
applies linear operator on vector and adds its result to y
Definition: flexIdentityOperator.h:95
represents an identiy operator
Definition: flexIdentityOperator.h:11
int getNumCols() const
returns number of columns of the linear operator
Definition: flexLinearOperator.h:48
void timesMinus(bool transposed, const Tdata &input, Tdata &output)
applies linear operator on vector and substracts its result from y
Definition: flexIdentityOperator.h:107
flexIdentityOperator(int aNumRows, int aNumCols, bool aMinus)
initializes the identiy operator
Definition: flexIdentityOperator.h:28
std::vector< T > getAbsRowSum(bool transposed)
returns a vector of sum of absolute values per row used for preconditioning
Definition: flexIdentityOperator.h:124
T getMaxRowSumAbs(bool transposed)
returns the maximum sum of absolute values per row used for preconditioning
Definition: flexIdentityOperator.h:119
abstract base class for linear operators
Definition: flexLinearOperator.h:12
flexIdentityOperator< T > * copy()
copies the linear operator
Definition: flexIdentityOperator.h:30