ITK  6.0.0
Insight Toolkit
VNLIterativeSparseSolverTraits.h
Go to the documentation of this file.
1/*=========================================================================
2 *
3 * Copyright NumFOCUS
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * https://www.apache.org/licenses/LICENSE-2.0.txt
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *=========================================================================*/
18#ifndef VNLIterativeSparseSolverTraits_h
19#define VNLIterativeSparseSolverTraits_h
20
21#include "vnl/vnl_vector.h"
22#include "vnl/vnl_sparse_matrix.h"
23#include "vnl/vnl_sparse_matrix_linear_system.h"
24#include "vnl/algo/vnl_lsqr.h"
25
42template <typename T = double>
44{
45public:
46 using ValueType = T;
47 using MatrixType = vnl_sparse_matrix<ValueType>;
48 using VectorType = vnl_vector<ValueType>;
49 using SolverType = vnl_lsqr;
50
52 static bool
54 {
55 return false;
56 }
57
59 static MatrixType
60 InitializeSparseMatrix(const unsigned int & iN)
61 {
62 return MatrixType(iN, iN);
63 }
64
66 static MatrixType
67 InitializeSparseMatrix(const unsigned int & iRow, const unsigned int & iCol)
68 {
69 return MatrixType(iRow, iCol);
70 }
71
73 static VectorType
74 InitializeVector(const unsigned int & iN)
75 {
76 return VectorType(iN);
77 }
78
80 static void
81 FillMatrix(MatrixType & iA, const unsigned int & iR, const unsigned int & iC, const ValueType & iV)
82 {
83 iA(iR, iC) = iV;
84 }
85
87 static void
88 AddToMatrix(MatrixType & iA, const unsigned int & iR, const unsigned int & iC, const ValueType & iV)
89 {
90 iA(iR, iC) += iV;
91 }
92
94 static bool
95 Solve(const MatrixType & iA, const VectorType & iB, VectorType & oX)
96 {
97 using SparseLinearSystemType = vnl_sparse_matrix_linear_system<ValueType>;
98 SparseLinearSystemType system(iA, iB);
99
100 SolverType solver(system);
101 return solver.minimize(oX);
102 }
103
106 static bool
107 Solve(const MatrixType & iA,
108 const VectorType & iBx,
109 const VectorType & iBy,
110 const VectorType & iBz,
111 VectorType & oX,
112 VectorType & oY,
113 VectorType & oZ)
114 {
115 bool result1 = Solve(iA, iBx, 100000, oX);
116 bool result2 = Solve(iA, iBy, 100000, oY);
117 bool result3 = Solve(iA, iBz, 100000, oZ);
118
119 return (result1 && result2 && result3);
120 }
121
123 static bool
124 Solve(const MatrixType & iA, const VectorType & iBx, const VectorType & iBy, VectorType & oX, VectorType & oY)
125 {
126 bool result1 = Solve(iA, iBx, oX);
127 bool result2 = Solve(iA, iBy, oY);
128
129 return (result1 && result2);
130 }
131
133 static bool
134 Solve(const MatrixType & iA, const VectorType & iB, const long & iNbIter, VectorType & oX)
135 {
136 using SparseLinearSystemType = vnl_sparse_matrix_linear_system<ValueType>;
137 SparseLinearSystemType system(iA, iB);
138
139 SolverType solver(system);
140 solver.set_max_iterations(iNbIter);
141 return solver.minimize(oX);
142 }
143};
144
145#endif
Generic interface for iterative sparse linear solver.
static MatrixType InitializeSparseMatrix(const unsigned int &iN)
initialize a square sparse matrix of size iN x iN
static MatrixType InitializeSparseMatrix(const unsigned int &iRow, const unsigned int &iCol)
initialize a sparse matrix of size iRow x iCol
vnl_sparse_matrix< ValueType > MatrixType
static void FillMatrix(MatrixType &iA, const unsigned int &iR, const unsigned int &iC, const ValueType &iV)
iA[iR][iC] = iV
static bool Solve(const MatrixType &iA, const VectorType &iBx, const VectorType &iBy, VectorType &oX, VectorType &oY)
Solve the linear systems: , .
static void AddToMatrix(MatrixType &iA, const unsigned int &iR, const unsigned int &iC, const ValueType &iV)
iA[iR][iC] += iV
static bool Solve(const MatrixType &iA, const VectorType &iBx, const VectorType &iBy, const VectorType &iBz, VectorType &oX, VectorType &oY, VectorType &oZ)
Solve the linear systems: , , .
static bool Solve(const MatrixType &iA, const VectorType &iB, const long &iNbIter, VectorType &oX)
Solve the linear systems: in N iterations.
static bool Solve(const MatrixType &iA, const VectorType &iB, VectorType &oX)
Solve the linear system .
static VectorType InitializeVector(const unsigned int &iN)
initialize a vector of size iN