/usr/include/ITK-4.5/VNLSparseLUSolverTraits.h is in libinsighttoolkit4-dev 4.5.0-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | /*=========================================================================
*
* Copyright Insight Software Consortium
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*=========================================================================*/
#ifndef __VNLSparseLUSolverTraits_h
#define __VNLSparseLUSolverTraits_h
#include "vnl/vnl_vector.h"
#include "vnl/vnl_sparse_matrix.h"
#include "vnl/algo/vnl_sparse_lu.h"
/** \class VNLSparseLUSolverTraits
* \brief Generic interface for sparse LU solver.
*
* This generic interface (common to several sparse solvers), allow to
* interchange solver solutions when dealing with sparse linear systems. See
* itk::ParameterizationQuadEdgeMeshFilter for reference.
*
* It internally uses the VNL library to represent and deal with vectors
* (vnl_vector) and sparse matrices (vnl_sparse_matrix). The solver by itself
* is made of a sparse LU decomposition followed by solving upper triangular
* system. see vnl_sparse_lu for more details on the method used.
*
* \ingroup ITKCommon
*
* \sa VNLIterativeSparseSolverTraits:w
*/
template< typename T = double >
class VNLSparseLUSolverTraits
{
public:
typedef T ValueType;
typedef vnl_sparse_matrix< ValueType > MatrixType;
typedef vnl_vector< ValueType > VectorType;
typedef vnl_sparse_lu SolverType;
/** \return false (it is not a direct solver, it is an iterative solver) */
static bool IsDirectSolver()
{
return true;
}
/** \brief initialize a square sparse matrix of size iN x iN */
static MatrixType InitializeSparseMatrix(const unsigned int & iN)
{
return MatrixType(iN, iN);
}
/** \brief initialize a sparse matrix of size iRow x iCol */
static MatrixType InitializeSparseMatrix(const unsigned int & iRow, const unsigned int& iCol)
{
return MatrixType(iRow, iCol);
}
/** \brief initialize a vector of size iN */
static VectorType InitializeVector(const unsigned int & iN)
{
return VectorType(iN);
}
/** \brief iA[iR][iC] = iV */
static void FillMatrix(MatrixType & iA, const unsigned int & iR, const unsigned int & iC, const ValueType & iV)
{
iA(iR, iC) = iV;
}
/** \brief iA[iR][iC] += iV */
static void AddToMatrix(MatrixType & iA, const unsigned int & iR, const unsigned int & iC, const ValueType & iV)
{
iA(iR, iC) += iV;
}
/** \brief Solve the linear system \f$ iA \cdot oX = iB \f$ */
static bool Solve(const MatrixType & iA, const VectorType & iB, VectorType & oX)
{
SolverType solver( iA );
oX = solver.solve( iB );
return true;
}
/** \brief Solve the linear systems: \f$ iA \cdot oX = iBx \f$, \f$ iA \cdot oY = iBy \f$, \f$ iA \cdot oZ = iBz \f$ */
static bool Solve(const MatrixType & iA,
const VectorType & iBx, const VectorType & iBy, const VectorType & iBz,
VectorType & oX, VectorType & oY, VectorType & oZ )
{
SolverType solver( iA );
oX = solver.solve( iBx );
oY = solver.solve( iBy );
oZ = solver.solve( iBz );
return true;
}
/** \brief Solve the linear systems: \f$ iA \cdot oX = iBx \f$, \f$ iA \cdot oY = iBy \f$ */
static bool Solve(const MatrixType & iA,
const VectorType & iBx, const VectorType & iBy,
VectorType & oX, VectorType & oY)
{
SolverType solver( iA );
oX = solver.solve( iBx );
oY = solver.solve( iBy );
return true;
}
};
#endif
|