Project
Loading...
Searching...
No Matches
SymBDMatrix.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
15
16#ifndef ALICEO2_FWDALIGN_SYMBDMATRIX_H
17#define ALICEO2_FWDALIGN_SYMBDMATRIX_H
18
19#include <TObject.h>
20#include <TVectorD.h>
22
23namespace o2
24{
25namespace fwdalign
26{
27
32class SymBDMatrix : public MatrixSq
33{
34
35 public:
36 enum { kDecomposedBit = 0x1 };
37
40
42 SymBDMatrix(Int_t size, Int_t w = 0);
43
45 SymBDMatrix(const SymBDMatrix& mat);
46
48 ~SymBDMatrix() override;
49
50 Int_t GetBandHWidth() const { return fNrows; }
51 Int_t GetNElemsStored() const { return fNelems; }
52
54 void Clear(Option_t* option = "") override;
55
57 void Reset() override;
58
60 Float_t GetDensity() const override;
61
64
65 Double_t operator()(Int_t rown, Int_t coln) const override;
66 Double_t& operator()(Int_t rown, Int_t coln) override;
67 Double_t operator()(Int_t rown) const;
68 Double_t& operator()(Int_t rown);
69
70 Double_t DiagElem(Int_t r) const override { return (*(const SymBDMatrix*)this)(r, r); }
71 Double_t& DiagElem(Int_t r) override { return (*this)(r, r); }
72
74 void DecomposeLDLT();
75
77 void Solve(Double_t* rhs);
78
80 void Solve(const Double_t* rhs, Double_t* sol);
81
82 void Solve(TVectorD& rhs) { Solve(rhs.GetMatrixArray()); }
83 void Solve(const TVectorD& rhs, TVectorD& sol) { Solve(rhs.GetMatrixArray(), sol.GetMatrixArray()); }
84
86 void Print(Option_t* option = "") const override;
87
88 void SetDecomposed(Bool_t v = kTRUE) { SetBit(kDecomposedBit, v); }
89 Bool_t IsDecomposed() const { return TestBit(kDecomposedBit); }
90
94 void MultiplyByVec(const Double_t* vecIn, Double_t* vecOut) const override;
95
96 void MultiplyByVec(const TVectorD& vecIn, TVectorD& vecOut) const override;
97
99 void AddToRow(Int_t r, Double_t* valc, Int_t* indc, Int_t n) override;
100
101 virtual Int_t GetIndex(Int_t row, Int_t col) const;
102 virtual Int_t GetIndex(Int_t diagID) const;
103 Double_t GetEl(Int_t row, Int_t col) const { return operator()(row, col); }
104 void SetEl(Int_t row, Int_t col, Double_t val) { operator()(row, col) = val; }
105
106 protected:
107 Double_t* fElems;
108
110};
111
112//___________________________________________________________
113inline Int_t SymBDMatrix::GetIndex(Int_t row, Int_t col) const
114{
115 // lower triangle band is actually filled
116 if (row < col) {
117 Swap(row, col);
118 }
119 col -= row;
120 if (col < -GetBandHWidth()) {
121 return -1;
122 }
123 return GetIndex(row) + col;
124}
125
126//___________________________________________________________
128inline Int_t SymBDMatrix::GetIndex(Int_t diagID) const
129{
130 return (diagID + 1) * fRowLwb - 1;
131}
132
133//___________________________________________________________
134inline Double_t SymBDMatrix::operator()(Int_t row, Int_t col) const
135{
136 // query element
137 int idx = GetIndex(row, col);
138 return (const Double_t&)idx < 0 ? 0.0 : fElems[idx];
139}
140
141//___________________________________________________________
142inline Double_t& SymBDMatrix::operator()(Int_t row, Int_t col)
143{
144 // get element for assingment; assignment outside of the stored range has no effect
145 int idx = GetIndex(row, col);
146 if (idx >= 0) {
147 return fElems[idx];
148 }
149 fTol = 0;
150 return fTol;
151}
152
153//___________________________________________________________
154inline Double_t SymBDMatrix::operator()(Int_t row) const
155{
156 // query diagonal
157 return (const Double_t&)fElems[GetIndex(row)];
158}
159
160//___________________________________________________________
161inline Double_t& SymBDMatrix::operator()(Int_t row)
162{
163 // get diagonal for assingment; assignment outside of the stored range has no effect
164 return fElems[GetIndex(row)];
165}
166
167//___________________________________________________________
168inline void SymBDMatrix::MultiplyByVec(const TVectorD& vecIn, TVectorD& vecOut) const
169{
170 MultiplyByVec(vecIn.GetMatrixArray(), vecOut.GetMatrixArray());
171}
172
173} // namespace fwdalign
174} // namespace o2
175
176#endif
Abstract class (from AliROOT) for square matrix used for millepede2 operation.
uint32_t col
Definition RawData.h:4
void Swap(int &r, int &c) const
Definition MatrixSq.h:137
Symmetric Matrix Class.
Definition SymBDMatrix.h:33
Double_t DiagElem(Int_t r) const override
Definition SymBDMatrix.h:70
Float_t GetDensity() const override
get fraction of non-zero elements
void Print(Option_t *option="") const override
print data
Int_t GetBandHWidth() const
Definition SymBDMatrix.h:50
void Solve(Double_t *rhs)
solve matrix equation
void MultiplyByVec(const Double_t *vecIn, Double_t *vecOut) const override
fill vecOut by matrix*vecIn
ClassDefOverride(SymBDMatrix, 0)
Double_t * fElems
Elements booked by constructor.
void SetEl(Int_t row, Int_t col, Double_t val)
virtual Int_t GetIndex(Int_t row, Int_t col) const
Double_t & DiagElem(Int_t r) override
Definition SymBDMatrix.h:71
void SetDecomposed(Bool_t v=kTRUE)
Definition SymBDMatrix.h:88
void Solve(const TVectorD &rhs, TVectorD &sol)
Definition SymBDMatrix.h:83
Int_t GetNElemsStored() const
Definition SymBDMatrix.h:51
Double_t operator()(Int_t rown, Int_t coln) const override
void Reset() override
set all elems to 0
void Clear(Option_t *option="") override
clear dynamic part
void DecomposeLDLT()
decomposition to L Diag L^T
void AddToRow(Int_t r, Double_t *valc, Int_t *indc, Int_t n) override
add list of elements to row r
~SymBDMatrix() override
d-tor
SymBDMatrix & operator=(const SymBDMatrix &src)
assignment operator
void Solve(TVectorD &rhs)
Definition SymBDMatrix.h:82
Double_t GetEl(Int_t row, Int_t col) const
Bool_t IsDecomposed() const
Definition SymBDMatrix.h:89
GLdouble n
Definition glcorearb.h:1982
GLenum src
Definition glcorearb.h:1767
GLsizeiptr size
Definition glcorearb.h:659
const GLdouble * v
Definition glcorearb.h:832
GLuint GLfloat * val
Definition glcorearb.h:1582
GLboolean r
Definition glcorearb.h:1233
GLubyte GLubyte GLubyte GLubyte w
Definition glcorearb.h:852
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::vector< int > row