EIC Software
Reference for
EIC
simulation and reconstruction software on GitHub
|
(Symmetric) Bordered Band Matrix. More...
#include <fun4all_GenFit/blob/master/GBL/include/BorderedBandMatrix.h>
Public Member Functions | |
BorderedBandMatrix () | |
Create bordered band matrix. | |
virtual | ~BorderedBandMatrix () |
void | resize (unsigned int nSize, unsigned int nBorder=1, unsigned int nBand=5) |
Resize bordered band matrix. | |
void | solveAndInvertBorderedBand (const VVector &aRightHandSide, VVector &aSolution) |
Solve linear equation system, partially calculate inverse. | |
void | addBlockMatrix (double aWeight, const std::vector< unsigned int > *anIndex, const std::vector< double > *aVector) |
Add symmetric block matrix. | |
TMatrixDSym | getBlockMatrix (const std::vector< unsigned int > anIndex) const |
Retrieve symmetric block matrix. | |
void | printMatrix () const |
Print bordered band matrix. | |
Private Member Functions | |
void | decomposeBand () |
(root free) Cholesky decomposition of band part: C=LDL^T | |
VVector | solveBand (const VVector &aRightHandSide) const |
Solve for band part. | |
VMatrix | solveBand (const VMatrix &aRightHandSide) const |
solve band part for mixed part (border rows). | |
VMatrix | invertBand () |
Invert band part. | |
VMatrix | bandOfAVAT (const VMatrix &anArray, const VSymMatrix &aSymArray) const |
Calculate band part of: 'anArray * aSymArray * anArray.T'. | |
Private Attributes | |
unsigned int | numSize |
Matrix size. | |
unsigned int | numBorder |
Border size. | |
unsigned int | numBand |
Band width. | |
unsigned int | numCol |
Band matrix size. | |
VSymMatrix | theBorder |
Border part. | |
VMatrix | theMixed |
Mixed part. | |
VMatrix | theBand |
Band part. | |
(Symmetric) Bordered Band Matrix.
Separate storage of border, mixed and band parts (as vector<double>).
* Example for matrix size=8 with border size and band width of two * * +- -+ * | B11 B12 M13 M14 M15 M16 M17 M18 | * | B12 B22 M23 M24 M25 M26 M27 M28 | * | M13 M23 C33 C34 C35 0. 0. 0. | * | M14 M24 C34 C44 C45 C46 0. 0. | * | M15 M25 C35 C45 C55 C56 C57 0. | * | M16 M26 0. C46 C56 C66 C67 C68 | * | M17 M27 0. 0. C57 C67 C77 C78 | * | M18 M28 0. 0. 0. C68 C78 C88 | * +- -+ * * Is stored as:: * * +- -+ +- -+ * | B11 B12 | | M13 M14 M15 M16 M17 M18 | * | B12 B22 | | M23 M24 M25 M26 M27 M28 | * +- -+ +- -+ * * +- -+ * | C33 C44 C55 C66 C77 C88 | * | C34 C45 C56 C67 C78 0. | * | C35 C46 C57 C68 0. 0. | * +- -+ *
Definition at line 79 of file BorderedBandMatrix.h.
View newest version in sPHENIX GitHub at line 79 of file BorderedBandMatrix.h
gbl::BorderedBandMatrix::BorderedBandMatrix | ( | ) |
Create bordered band matrix.
Definition at line 36 of file BorderedBandMatrix.cc.
View newest version in sPHENIX GitHub at line 36 of file BorderedBandMatrix.cc
|
virtual |
Definition at line 39 of file BorderedBandMatrix.cc.
View newest version in sPHENIX GitHub at line 39 of file BorderedBandMatrix.cc
void gbl::BorderedBandMatrix::addBlockMatrix | ( | double | aWeight, |
const std::vector< unsigned int > * | anIndex, | ||
const std::vector< double > * | aVector | ||
) |
Add symmetric block matrix.
Add (extended) block matrix defined by 'aVector * aWeight * aVector.T' to bordered band matrix: BBmatrix(anIndex(i),anIndex(j)) += aVector(i) * aWeight * aVector(j).
aWeight | [in] Weight |
anIndex | [in] List of rows/colums to be used |
aVector | [in] Vector |
Definition at line 68 of file BorderedBandMatrix.cc.
View newest version in sPHENIX GitHub at line 68 of file BorderedBandMatrix.cc
References max, numBand, numBorder, theBand, theBorder, and theMixed.
Referenced by gbl::GblTrajectory::buildLinearEquationSystem().
|
private |
Calculate band part of: 'anArray * aSymArray * anArray.T'.
Definition at line 316 of file BorderedBandMatrix.cc.
View newest version in sPHENIX GitHub at line 316 of file BorderedBandMatrix.cc
References k, max, numBand, numBorder, and numCol.
Referenced by solveAndInvertBorderedBand().
|
private |
(root free) Cholesky decomposition of band part: C=LDL^T
Decompose band matrix into diagonal matrix D and lower triangular band matrix L (diagonal=1). Overwrite band matrix with D and off-diagonal part of L.
2 | : matrix is singular. |
3 | : matrix is not positive definite. |
Definition at line 199 of file BorderedBandMatrix.cc.
View newest version in sPHENIX GitHub at line 199 of file BorderedBandMatrix.cc
References k, min, numBand, numCol, and theBand.
Referenced by solveAndInvertBorderedBand().
TMatrixDSym gbl::BorderedBandMatrix::getBlockMatrix | ( | const std::vector< unsigned int > | anIndex | ) | const |
Retrieve symmetric block matrix.
Get (compressed) block from bordered band matrix: aMatrix(i,j) = BBmatrix(anIndex(i),anIndex(j)).
anIndex | [in] List of rows/colums to be used |
Definition at line 97 of file BorderedBandMatrix.cc.
View newest version in sPHENIX GitHub at line 97 of file BorderedBandMatrix.cc
References numBorder, theBand, theBorder, and theMixed.
Referenced by gbl::GblTrajectory::getResAndErr(), and gbl::GblTrajectory::getResults().
|
private |
Invert band part.
Definition at line 292 of file BorderedBandMatrix.cc.
View newest version in sPHENIX GitHub at line 292 of file BorderedBandMatrix.cc
References kdfinder::abs(), k, max, min, numBand, numCol, and theBand.
Referenced by solveAndInvertBorderedBand().
void gbl::BorderedBandMatrix::printMatrix | ( | ) | const |
Print bordered band matrix.
Definition at line 180 of file BorderedBandMatrix.cc.
View newest version in sPHENIX GitHub at line 180 of file BorderedBandMatrix.cc
References gbl::VMatrix::print(), gbl::VSymMatrix::print(), theBand, theBorder, and theMixed.
Referenced by gbl::GblTrajectory::printTrajectory().
void gbl::BorderedBandMatrix::resize | ( | unsigned int | nSize, |
unsigned int | nBorder = 1 , |
||
unsigned int | nBand = 5 |
||
) |
Resize bordered band matrix.
nSize | [in] Size of matrix |
nBorder | [in] Size of border (=1 for q/p + additional local parameters) |
nBand | [in] Band width (usually = 5, for simplified jacobians = 4) |
Definition at line 48 of file BorderedBandMatrix.cc.
View newest version in sPHENIX GitHub at line 48 of file BorderedBandMatrix.cc
References numBand, numBorder, numCol, numSize, gbl::VMatrix::resize(), gbl::VSymMatrix::resize(), theBand, theBorder, and theMixed.
Referenced by gbl::GblTrajectory::buildLinearEquationSystem().
void gbl::BorderedBandMatrix::solveAndInvertBorderedBand | ( | const VVector & | aRightHandSide, |
VVector & | aSolution | ||
) |
Solve linear equation system, partially calculate inverse.
Solve linear equation A*x=b system with bordered band matrix A, calculate bordered band part of inverse of A. Use decomposition in border and band part for block matrix algebra:
| A Ct | | x1 | | b1 | , A is the border part | | * | | = | | , Ct is the mixed part | C D | | x2 | | b2 | , D is the band part
Explicit inversion of D is avoided by using solution X of D*X=C (X=D^-1*C, obtained from Cholesky decomposition and forward/backward substitution)
| x1 | | E*b1 - E*Xt*b2 | , E^-1 = A-Ct*D^-1*C = A-Ct*X | | = | | | x2 | | x - X*x1 | , x is solution of D*x=b2 (x=D^-1*b2)
Inverse matrix is:
| E -E*Xt | | | , only band part of (D^-1 + X*E*Xt) | -X*E D^-1 + X*E*Xt | is calculated
[in] | aRightHandSide | Right hand side (vector) 'b' of A*x=b |
[out] | aSolution | Solution (vector) x of A*x=b |
Definition at line 147 of file BorderedBandMatrix.cc.
View newest version in sPHENIX GitHub at line 147 of file BorderedBandMatrix.cc
References bandOfAVAT(), decomposeBand(), gbl::VVector::getVec(), gbl::VSymMatrix::invert(), invertBand(), numBorder, numCol, gbl::VVector::putVec(), solveBand(), theBand, theBorder, theMixed, and gbl::VMatrix::transpose().
Referenced by gbl::GblTrajectory::fit().
Solve for band part.
Solve C*x=b for band part using decomposition C=LDL^T and forward (L*z=b) and backward substitution (L^T*x=D^-1*z).
[in] | aRightHandSide | Right hand side (vector) 'b' of C*x=b |
Definition at line 234 of file BorderedBandMatrix.cc.
View newest version in sPHENIX GitHub at line 234 of file BorderedBandMatrix.cc
References gbl::VMatrix::getNumCols(), gbl::VMatrix::getNumRows(), min, and theBand.
Referenced by solveAndInvertBorderedBand().
solve band part for mixed part (border rows).
Solve C*X=B for mixed part using decomposition C=LDL^T and forward and backward substitution.
[in] | aRightHandSide | Right hand side (matrix) 'B' of C*X=B |
Definition at line 263 of file BorderedBandMatrix.cc.
View newest version in sPHENIX GitHub at line 263 of file BorderedBandMatrix.cc
References gbl::VMatrix::getNumCols(), gbl::VMatrix::getNumRows(), min, numBorder, and theBand.
|
private |
Band width.
Definition at line 96 of file BorderedBandMatrix.h.
View newest version in sPHENIX GitHub at line 96 of file BorderedBandMatrix.h
Referenced by addBlockMatrix(), bandOfAVAT(), decomposeBand(), invertBand(), and resize().
|
private |
Border size.
Definition at line 95 of file BorderedBandMatrix.h.
View newest version in sPHENIX GitHub at line 95 of file BorderedBandMatrix.h
Referenced by addBlockMatrix(), bandOfAVAT(), getBlockMatrix(), resize(), solveAndInvertBorderedBand(), and solveBand().
|
private |
Band matrix size.
Definition at line 97 of file BorderedBandMatrix.h.
View newest version in sPHENIX GitHub at line 97 of file BorderedBandMatrix.h
Referenced by bandOfAVAT(), decomposeBand(), invertBand(), resize(), and solveAndInvertBorderedBand().
|
private |
Matrix size.
Definition at line 94 of file BorderedBandMatrix.h.
View newest version in sPHENIX GitHub at line 94 of file BorderedBandMatrix.h
Referenced by resize().
|
private |
Band part.
Definition at line 100 of file BorderedBandMatrix.h.
View newest version in sPHENIX GitHub at line 100 of file BorderedBandMatrix.h
Referenced by addBlockMatrix(), decomposeBand(), getBlockMatrix(), invertBand(), printMatrix(), resize(), solveAndInvertBorderedBand(), and solveBand().
|
private |
Border part.
Definition at line 98 of file BorderedBandMatrix.h.
View newest version in sPHENIX GitHub at line 98 of file BorderedBandMatrix.h
Referenced by addBlockMatrix(), getBlockMatrix(), printMatrix(), resize(), and solveAndInvertBorderedBand().
|
private |
Mixed part.
Definition at line 99 of file BorderedBandMatrix.h.
View newest version in sPHENIX GitHub at line 99 of file BorderedBandMatrix.h
Referenced by addBlockMatrix(), getBlockMatrix(), printMatrix(), resize(), and solveAndInvertBorderedBand().