Project
Loading...
Searching...
No Matches
MatrixSparse.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_MATRIXSPARSE_H
17#define ALICEO2_FWDALIGN_MATRIXSPARSE_H
18
21
22namespace o2
23{
24namespace fwdalign
25{
26
28class MatrixSparse : public MatrixSq
29{
30 public:
31 MatrixSparse() = default;
32
34 MatrixSparse(Int_t size);
35
37 MatrixSparse(const MatrixSparse& mat);
38
39 ~MatrixSparse() override { Clear(); }
40
41 VectorSparse* GetRow(Int_t ir) const { return (ir < fNcols) ? fVecs[ir] : nullptr; }
43
44 Int_t GetSize() const override { return fNrows; }
45 virtual Int_t GetNRows() const { return fNrows; }
46 virtual Int_t GetNCols() const { return fNcols; }
47
48 void Clear(Option_t* option = "") override;
49 void Reset() override
50 {
51 for (int i = fNcols; i--;) {
52 GetRow(i)->Reset();
53 }
54 }
55 void Print(Option_t* option = "") const override;
57 Double_t& operator()(Int_t row, Int_t col) override;
58 Double_t operator()(Int_t row, Int_t col) const override;
59 void SetToZero(Int_t row, Int_t col);
60
62 Float_t GetDensity() const override;
63
64 Double_t DiagElem(Int_t r) const override;
65 Double_t& DiagElem(Int_t r) override;
66
68 void SortIndices(Bool_t valuesToo = kFALSE);
69
71 void MultiplyByVec(const TVectorD& vecIn, TVectorD& vecOut) const override;
72
73 void MultiplyByVec(const Double_t* vecIn, Double_t* vecOut) const override;
74
75 void AddToRow(Int_t r, Double_t* valc, Int_t* indc, Int_t n) override;
76
77 protected:
78 VectorSparse** fVecs = nullptr;
79
81};
82
83//___________________________________________________
85inline void MatrixSparse::MultiplyByVec(const TVectorD& vecIn, TVectorD& vecOut) const
86{
87 MultiplyByVec((Double_t*)vecIn.GetMatrixArray(), (Double_t*)vecOut.GetMatrixArray());
88}
89
90//___________________________________________________
92inline void MatrixSparse::SetToZero(Int_t row, Int_t col)
93{
94 if (IsSymmetric() && col > row) {
95 Swap(row, col);
96 }
97 VectorSparse* rowv = GetRow(row);
98 if (rowv) {
99 rowv->SetToZero(col);
100 }
101}
102
103//___________________________________________________
104inline Double_t MatrixSparse::operator()(Int_t row, Int_t col) const
105{
106 if (IsSymmetric() && col > row) {
107 Swap(row, col);
108 }
109 VectorSparse* rowv = GetRow(row);
110 if (!rowv) {
111 return 0;
112 }
113 return rowv->FindIndex(col);
114}
115
116//___________________________________________________
117inline Double_t& MatrixSparse::operator()(Int_t row, Int_t col)
118{
119 // printf("M: findindexAdd\n");
120 if (IsSymmetric() && col > row) {
121 Swap(row, col);
122 }
123 VectorSparse* rowv = GetRowAdd(row);
124 if (col >= fNcols) {
125 fNcols = col + 1;
126 }
127 return rowv->FindIndexAdd(col);
128}
129
130//___________________________________________________
132inline Double_t MatrixSparse::DiagElem(Int_t row) const
133{
134 VectorSparse* rowv = GetRow(row);
135 if (!rowv) {
136 return 0;
137 }
138 if (IsSymmetric()) {
139 return (rowv->GetNElems() > 0 && rowv->GetLastIndex() == row) ? rowv->GetLastElem() : 0.;
140 } else {
141 return rowv->FindIndex(row);
142 }
143}
144
145//___________________________________________________
147inline Double_t& MatrixSparse::DiagElem(Int_t row)
148{
149 VectorSparse* rowv = GetRowAdd(row);
150 if (row >= fNcols) {
151 fNcols = row + 1;
152 }
153 if (IsSymmetric()) {
154 return (rowv->GetNElems() > 0 && rowv->GetLastIndex() == row) ? rowv->GetLastElem() : rowv->FindIndexAdd(row);
155 } else {
156 return rowv->FindIndexAdd(row);
157 }
158}
159
160} // namespace fwdalign
161} // namespace o2
162
163#endif
int32_t i
Abstract class (from AliROOT) for square matrix used for millepede2 operation.
uint32_t col
Definition RawData.h:4
Sparse vector class (from AliROOT), used as row of the MatrixSparse class.
void Clear(Option_t *option="") override
MatrixSparse & operator=(const MatrixSparse &src)
void SetToZero(Int_t row, Int_t col)
set existing element to 0
Int_t GetSize() const override
void AddToRow(Int_t r, Double_t *valc, Int_t *indc, Int_t n) override
void MultiplyByVec(const TVectorD &vecIn, TVectorD &vecOut) const override
fill vecOut by matrix * vecIn (vector should be of the same size as the matrix)
void SortIndices(Bool_t valuesToo=kFALSE)
sort columns in increasing order. Used to fix the matrix after ILUk decompostion
void Print(Option_t *option="") const override
Float_t GetDensity() const override
get fraction of non-zero elements
VectorSparse * GetRow(Int_t ir) const
virtual Int_t GetNRows() const
Double_t DiagElem(Int_t r) const override
get diag elem
Double_t & operator()(Int_t row, Int_t col) override
ClassDefOverride(MatrixSparse, 0)
virtual Int_t GetNCols() const
VectorSparse * GetRowAdd(Int_t ir)
void Swap(int &r, int &c) const
Definition MatrixSq.h:137
Bool_t IsSymmetric() const override
Definition MatrixSq.h:64
Double_t FindIndex(Int_t ind) const
return an element with given index
Double_t & FindIndexAdd(Int_t ind)
increment an element with given index
Double_t GetLastElem() const
virtual void SetToZero(Int_t ind)
set element to 0 if it was already defined
GLdouble n
Definition glcorearb.h:1982
GLenum src
Definition glcorearb.h:1767
GLsizeiptr size
Definition glcorearb.h:659
GLboolean r
Definition glcorearb.h:1233
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
o2::InteractionRecord ir(0, 0)
std::vector< int > row