So-Bogus
A c++ sparse block matrix library aimed at Second Order cone problems
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Pages
bogus::GaussSeidelBase< GaussSeidelImpl, BlockMatrixType > Class Template Reference

Abstract Gauss-Seidel interface . More...

#include <GaussSeidelBase.hpp>

Inheritance diagram for bogus::GaussSeidelBase< GaussSeidelImpl, BlockMatrixType >:
bogus::ConstrainedSolverBase< GaussSeidelImpl, BlockMatrixType > bogus::BlockSolverBase< BlockMatrixType >

Public Types

typedef ConstrainedSolverBase
< GaussSeidelImpl,
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

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
 
GaussSeidelImpl & setMatrix (const BlockObjectBase< BlockMatrixType > &matrix)
 Sets the system matrix and initializes internal structures. More...
 
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
 
CallBackTypecallback ()
 Callback hook; will be triggered every N iterations, depending on the solver. More...
 
const CallBackTypecallback () const
 
const BlockObjectBase
< BlockMatrixType > & 
matrix () const
 

Protected Types

typedef Base::Index Index
 
typedef
Base::BlockProblemTraits::Matrix 
DiagonalBlockType
 

Protected Member Functions

const BlockMatrixBase
< BlockMatrixType > & 
explicitMatrix () const
 
const IterableBlockObject
< BlockMatrixType > & 
iterableMatrix () const
 
void processLocalMatrices ()
 
template<typename NSLaw , typename ResT >
Scalar evalAndKeepBest (const NSLaw &law, const ResT &x, const typename GlobalProblemTraits::DynVector &y, typename GlobalProblemTraits::DynVector &x_best, Scalar &err_best) const
 
template<typename NSLaw , typename RhsT , typename ResT >
bool tryZero (const NSLaw &law, const RhsT &b, ResT &x, typename GlobalProblemTraits::DynVector &x_best, Scalar &err_best) const
 
void updateScalings ()
 

Protected Attributes

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
 

Detailed Description

template<typename GaussSeidelImpl, typename BlockMatrixType>
class bogus::GaussSeidelBase< GaussSeidelImpl, BlockMatrixType >

Abstract Gauss-Seidel interface .

See Also
GaussSeidel

Member Function Documentation

template<typename BlockMatrixType >
CallBackType& bogus::BlockSolverBase< BlockMatrixType >::callback ( )
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.

See Also
Signal< unsigned, Scalar >
Scalar bogus::ConstrainedSolverBase< GaussSeidelImpl , BlockMatrixType >::eval ( const NSLaw &  law,
const ResT &  y,
const RhsT &  x 
) const
inherited

Eval the current global residual as a function of the local ones.

y should be such that y = m_matrix * x + rhs

Returns
the current residual err defined as follow :
template<typename GaussSeidelImpl, typename BlockMatrixType>
void bogus::GaussSeidelBase< GaussSeidelImpl, BlockMatrixType >::setAutoRegularization ( Scalar  maxRegul)

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

\[ \left\{ \begin{array}{rcl} y^{k+1} &=& ( M + \alpha I ) x^{k+1} - \alpha x^k + b^{k} \\ &s.t.& law (x^{k+1},y^{k+1}) \end{array} \right. \]

where $\alpha$ is the regularization coefficient.

Note that as $ | x^{k+1} - x^{k} | \rightarrow 0 $ 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 $\alpha$ to a too big value will however degrade the convergence of the global algorithm.

Parameters
maxRegulIf 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.
template<typename GaussSeidelImpl, typename BlockMatrixType>
void bogus::GaussSeidelBase< GaussSeidelImpl, BlockMatrixType >::setEvalEvery ( unsigned  evalEvery)

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 )

GaussSeidelImpl & bogus::ConstrainedSolverBase< GaussSeidelImpl , BlockMatrixType >::setMatrix ( const BlockObjectBase< BlockMatrixType > &  matrix)
inherited

Sets the system matrix and initializes internal structures.

Note
Derived classes should re-implement this function and call updateScalings()
template<typename GaussSeidelImpl, typename BlockMatrixType>
void bogus::GaussSeidelBase< GaussSeidelImpl, BlockMatrixType >::setMaxThreads ( unsigned  maxThreads = 0)

Sets the maximum number of threads that the solver can use.

If \p maxThreads is zero, then it will use the current OpenMP setting.
Warning
If multi-threading is enabled without coloring, the result will not be deterministic, as it will depends on the order in which threads solve contacts.

On the other hand, the algorithm will run much faster.

Member Data Documentation

template<typename GaussSeidelImpl, typename BlockMatrixType>
Scalar bogus::GaussSeidelBase< GaussSeidelImpl, BlockMatrixType >::m_autoRegularization
protected
See Also
setAutoRegularization(). Defaults to 0.

The documentation for this class was generated from the following file: