So-Bogus
A c++ sparse block matrix library aimed at Second Order cone problems
|
Projected Gauss-Seidel iterative solver. More...
#include <GaussSeidel.hpp>
Public Types | |
typedef GaussSeidelBase < GaussSeidel, BlockMatrixType > | Base |
typedef Base::GlobalProblemTraits | GlobalProblemTraits |
typedef GlobalProblemTraits::Scalar | Scalar |
typedef LocalProblemTraits < Base::BlockTraits::RowsPerBlock, Scalar > | BlockProblemTraits |
typedef BlockMatrixTraits < BlockMatrixType > | BlockTraits |
typedef Signal< unsigned, Scalar > | CallBackType |
Public Member Functions | |
GaussSeidel () | |
Default constructor – you will have to call setMatrix() before using the solve() function. | |
GaussSeidel (const BlockObjectBase< BlockMatrixType > &matrix) | |
Constructor with the system matrix. | |
GaussSeidel & | setMatrix (const BlockObjectBase< BlockMatrixType > &matrix) |
Sets the system matrix and initializes internal structures. | |
template<typename NSLaw , typename RhsT , typename ResT > | |
Scalar | solve (const NSLaw &law, const RhsT &b, ResT &x, bool tryZeroAsWell=true) const |
Finds an approximate solution for a constrained linear problem. More... | |
template<typename NSLaw , typename RhsT , typename ResT , typename LSDerived , typename HDerived > | |
Scalar | solveWithLinearConstraints (const NSLaw &law, const BlockObjectBase< LSDerived > &Cinv, const BlockObjectBase< HDerived > &H, const Scalar alpha, const RhsT &b, const RhsT &c, ResT &x, bool tryZeroAsWell=true, unsigned solveEvery=1) const |
template<typename NSLaw , typename RhsT , typename ResT , typename WDerived > | |
Scalar | solveWithLinearConstraints (const NSLaw &law, const BlockObjectBase< WDerived > &W, const RhsT &b, ResT &x, bool tryZeroAsWell=true, unsigned solveEvery=1) const |
Coloring & | coloring () |
Access to the current Coloring. Will be reset whenever the matrix is changed. More... | |
void | setMaxThreads (unsigned maxThreads=0) |
Sets the maximum number of threads that the solver can use. More... | |
void | setAutoRegularization (Scalar maxRegul) |
Sets the auto-regularization (a.k.a. proximal point) coefficient. More... | |
void | setEvalEvery (unsigned evalEvery) |
Sets the number of iterations that should be performed between successive evaluations of the global error function. More... | |
void | setSkipTol (Scalar skipTol) |
Sets the minimum iteration step size under which local problems are temporarily frozen. | |
void | setSkipIters (unsigned skipIters) |
Sets the number of iterations for temporarily freezing local problems. | |
void | useInfinityNorm (bool useInfNorm) |
Sets whether the solver will use the infinity norm instead of the l1 one to compute the global residual from the local ones. | |
bool | usesInfinityNorm () const |
Scalar | eval (const NSLaw &law, const ResT &y, const RhsT &x) const |
Eval the current global residual as a function of the local ones. More... | |
void | projectOnConstraints (const NSLaw &projector, VectorT &x) const |
Projects the variable x on the constraints defined by projector . | |
void | dualityCOV (const NSLaw &law, const RhsT &b, ResT &x) const |
Compute associated change of variable (see NSLaw) | |
Scalar | solve (const NSLaw &law, const RhsT &b, ResT &x) const |
void | setMaxIters (unsigned maxIters) |
For iterative solvers: sets the maximum number of iterations. | |
unsigned | maxIters () const |
void | setTol (Scalar tol) |
For iterative solvers: sets the solver tolerance. | |
Scalar | tol () const |
CallBackType & | callback () |
Callback hook; will be triggered every N iterations, depending on the solver. More... | |
const CallBackType & | callback () const |
const BlockObjectBase < BlockMatrixType > & | matrix () const |
Protected Types | |
typedef Base::Index | Index |
typedef Base::BlockProblemTraits::Matrix | DiagonalBlockType |
Protected Member Functions | |
void | updateLocalMatrices () |
template<typename NSLaw , typename RhsT , typename ResT > | |
void | innerLoop (bool parallelize, const NSLaw &law, const RhsT &b, std::vector< unsigned char > &skip, Scalar &ndxRef, ResT &x) const |
const BlockMatrixBase < BlockMatrixType > & | explicitMatrix () const |
const IterableBlockObject < BlockMatrixType > & | iterableMatrix () const |
void | processLocalMatrices () |
Scalar | evalAndKeepBest (const NSLaw &law, const ResT &x, const typename GlobalProblemTraits::DynVector &y, typename GlobalProblemTraits::DynVector &x_best, Scalar &err_best) const |
bool | tryZero (const NSLaw &law, const RhsT &b, ResT &x, typename GlobalProblemTraits::DynVector &x_best, Scalar &err_best) const |
void | updateScalings () |
Protected Attributes | |
Coloring | m_coloring |
ResizableSequenceContainer < DiagonalBlockType >::Type | m_localMatrices |
GlobalProblemTraits::DynVector | m_regularization |
unsigned | m_maxThreads |
See setMaxThreads(). Defaults to 0 . | |
unsigned | m_evalEvery |
See setEvalEvery(). Defaults to 25. | |
Scalar | m_skipTol |
See setSkipTol(). Defaults to 1.e-6. | |
unsigned | m_skipIters |
See setSkipIters() Defaults to 10. | |
Scalar | m_autoRegularization |
GlobalProblemTraits::DynVector | m_scaling |
bool | m_useInfinityNorm |
See useInfinityNorm(). Defaults to false. | |
const BlockObjectBase < BlockMatrixType > * | m_matrix |
Pointer to the matrix of the system. | |
unsigned | m_maxIters |
See setMaxIters() | |
Scalar | m_tol |
See setTol() | |
CallBackType | m_callback |
Projected Gauss-Seidel iterative solver.
Works by taking into account only one block-row of the system at a time, and iterating several times over the whole set of rows several times until convergence has been achieved.
Each inner iteration of the algorithm will try to solve the local problem
where k is the current global iteration, i the current row and
|
inherited |
Callback hook; will be triggered every N iterations, depending on the solver.
Useful to monitor the convergence of the solver. Can be connected to a function that takes an unsigned
and a Scalar
as parameters. The first argument will be the current iteration number, and the second the current residual.
Coloring& bogus::GaussSeidel< BlockMatrixType >::coloring | ( | ) |
Access to the current Coloring. Will be reset whenever the matrix is changed.
Determiniticy is achieved through the mean of contact coloring ; contacts that do not interact directly together can chare the same color, and all contacts within a given color can be solver in parallel
|
inherited |
Eval the current global residual as a function of the local ones.
y
should be such that y
= m_matrix * x
+ rhs
err
defined as follow :err
err
:=
|
inherited |
Sets the auto-regularization (a.k.a. proximal point) coefficient.
The regularization works by slightly altering the local problems, so at each iteration we try to solve
where is the regularization coefficient.
Note that as when the algorithm converges, we are still trying to find a solution of the same global problem.
For under-determined problems, regularization might helps preventing x reaching problematically high values. Setting to a too big value will however degrade the convergence of the global algorithm.
maxRegul | If greater than zero, then positive terms will be added to the diagonal of the local matrices so that their minimal eigenvalue become greater than maxRegul . |
|
inherited |
Sets the number of iterations that should be performed between successive evaluations of the global error function.
( Those evaluations require a full matrix/vector product, and are therfore quite costly )
|
inherited |
Sets the maximum number of threads that the solver can use.
If \p maxThreads is zero, then it will use the current OpenMP setting.
On the other hand, the algorithm will run much faster.
Scalar bogus::GaussSeidel< BlockMatrixType >::solve | ( | const NSLaw & | law, |
const RhsT & | b, | ||
ResT & | x, | ||
bool | tryZeroAsWell = true |
||
) | const |
Finds an approximate solution for a constrained linear problem.
Stops when the residual computed in eval() is below m_tol, of the number of iterations exceed m_maxIters
Implements Algorithm 1. from [2] to solve
law | The (non-smooth) law that should define:
|
b | the const part of the right hand side |
x | the unknown. Can be warm-started |
tryZeroAsWell | If true, the algorithm will reset r to zero if that would result in a lower residual |
Scalar bogus::GaussSeidel< BlockMatrixType >::solveWithLinearConstraints | ( | const NSLaw & | law, |
const BlockObjectBase< LSDerived > & | Cinv, | ||
const BlockObjectBase< HDerived > & | H, | ||
const Scalar | alpha, | ||
const RhsT & | b, | ||
const RhsT & | c, | ||
ResT & | x, | ||
bool | tryZeroAsWell = true , |
||
unsigned | solveEvery = 1 |
||
) | const |
Solves
where Cinv
is such that Cinv
* x =
Scalar bogus::GaussSeidel< BlockMatrixType >::solveWithLinearConstraints | ( | const NSLaw & | law, |
const BlockObjectBase< WDerived > & | W, | ||
const RhsT & | b, | ||
ResT & | x, | ||
bool | tryZeroAsWell = true , |
||
unsigned | solveEvery = 1 |
||
) | const |
Solves
with W arbitrary linear operator ( matrix or expression )
|
protectedinherited |
|
protected |