ITK/Release 4/Refactor Numerical Libraries/Inventory/Linear Solvers
The Problem
It certain ITK applications it is common to need to solve the linear system
A.x = b
Where
- A is a large sparse matrix
- x is a vector
- b is a vector
The common approach to solve this problem is to use linear solvers.
Use Cases
FEM
The most significant case where large sparse matrix appear is in the computation of Finite Element Methods (FEM). In ITK, this is done for the purpose of computing Deformable Registration between images.
Exploration
In the past, ITK developers have explored alternative solutions for solving large sparse matrices.
The findings were codified at the time in the following Wiki page:
LSQR
The initial approach in ITK to solve large sparse linear systems involved the use of the LSQR method.
In VXL
LSQR is implemented in VXL:
ITK/Modules/ThirdParty/VNL/src/vxl/core/vnl/algo/vnl_lsqr.h ITK/Modules/ThirdParty/VNL/src/vxl/core/vnl/algo/vnl_lsqr.cxx
and tested here
ITK/Modules/ThirdParty/VNL/src/vxl/core/vnl/examples/vnl_lsqr_test.cxx
Unfortunately the VXL implementation is done using source code taken from netlib, and that code happens to be copyrighted by ACM. The license that ACM provides for algorithms preclude their use in the ITK ecosystem.
// // vnl_lsqr implements an algorithm for large, sparse linear systems and // sparse, linear least squares. It is a wrapper for the LSQR algorithm // of Paige and Saunders (ACM TOMS 583). The sparse system is encapsulated // by a vnl_linear_system. // // The LSQR code from netlib was copyrighted by ACM, therefore it had to // be removed, and has been replaced with code taken from // http://www.stanford.edu/group/SOL/software.html // Thas was distributed under a BSD license. The Fortran90 files were // manually translated to C++ to create the solverBase class. //
The solverBase class can be found in:
ThirdParty/VNL/src/vxl/v3p/netlib/linalg/lsqrBase.h ThirdParty/VNL/src/vxl/v3p/netlib/linalg/lsqrBase.cxx
This new code is cleanly written under a BSD license.
At some point we must send this code back to Professor Saunders along with the thanks for helping us navigate the problem by pointing us to the newer BSD versions of the FORTRAN code.
Use From ITK
The lsqr code is used in ITK in the classes
Numerics/FEM/include/itkFEMLinearSystemWrapperVNL.h Numerics/FEM/src/itkFEMLinearSystemWrapperVNL.cxx
Uncertainty exist on whether the ITK code is properly using the LSQR Solver.
In particular, ITK code does not make a particular effort on
- Verifying the pre-conditions of the system,
- Setting the many parameters of the LSQR solver to anything different than the default values
It may be that a quick Wiki-based tutorial on the practical ways of properly using LSQR is the solution to this problem.
It may also be that multiple predefined settings could be provided, in order to address specific numerical problems.
Use Cases
Unit test
Unit test for the FEM Registration Filter
/home/ibanez/src/ITK/Modules/Registration/FEM/test/itkFEMRegistrationFilterTest.cxx
Examples
As an Image registration problem performing Deformable registration
ITK/Examples/Registration/
The two examples
- DeformableRegistration1.cxx
- DeformableRegistration11.cxx