ROOT logo
#ifndef ALISYMMATRIX_H
#define ALISYMMATRIX_H
/**********************************************************************************************/
/* Fast symmetric matrix with dynamically expandable size.                                    */
/* Only part can be used for matrix operations. It is defined as:                             */ 
/* fNCols: rows built by constructor (GetSizeBooked)                                          */ 
/* fNRows: number of rows added dynamically (automatically added on assignment to row)        */ 
/*         GetNRowAdded                                                                       */ 
/* fNRowIndex: total size (fNCols+fNRows), GetSize                                            */ 
/* fRowLwb   : actual size to used for given operation, by default = total size, GetSizeUsed  */ 
/*                                                                                            */ 
/* Author: ruben.shahoyan@cern.ch                                                             */
/*                                                                                            */ 
/**********************************************************************************************/

#include <TVectorD.h>
#include "AliMatrixSq.h"



class AliSymMatrix : public AliMatrixSq {
  //
 public:
  AliSymMatrix();
  AliSymMatrix(Int_t size);
  AliSymMatrix(const AliSymMatrix &mat);
  virtual ~AliSymMatrix();
  //
  void          Clear(Option_t* option="");
  void          Reset();
  //
  Int_t         GetSize()                                        const {return fNrowIndex;}
  Int_t         GetSizeUsed()                                    const {return fRowLwb;}
  Int_t         GetSizeBooked()                                  const {return fNcols;}
  Int_t         GetSizeAdded()                                   const {return fNrows;}
  Float_t       GetDensity()                                     const;
  AliSymMatrix& operator=(const AliSymMatrix& src);
  AliSymMatrix& operator+=(const AliSymMatrix& src);
  Double_t      operator()(Int_t rown, Int_t coln)               const;
  Double_t&     operator()(Int_t rown, Int_t coln);
  //
  Double_t      DiagElem(Int_t r)                                const {return (*(const AliSymMatrix*)this)(r,r);}
  Double_t&     DiagElem(Int_t r)                                      {return (*this)(r,r);}
  //
  Double_t*     GetRow(Int_t r);
  //
  void          Print(const Option_t* option="")                 const;
  void          AddRows(int nrows=1);
  void          SetSizeUsed(Int_t sz)                                  {fRowLwb = sz;}
  //
  void          Scale(Double_t coeff);
  void          MultiplyByVec(const Double_t* vecIn, Double_t* vecOut) const;
  void          MultiplyByVec(const TVectorD &vecIn, TVectorD &vecOut) const;
  void          AddToRow(Int_t r, Double_t *valc, Int_t *indc,Int_t n);
  //
  // ---------------------------------- Dummy methods of MatrixBase
  virtual       const Double_t   *GetMatrixArray  () const {return fElems;};
  virtual             Double_t   *GetMatrixArray  ()       {return (Double_t*)fElems;}
  virtual       const Int_t      *GetRowIndexArray() const {Error("GetRowIndexArray","Dummy"); return 0;};
  virtual             Int_t      *GetRowIndexArray()       {Error("GetRowIndexArray","Dummy"); return 0;};
  virtual       const Int_t      *GetColIndexArray() const {Error("GetColIndexArray","Dummy"); return 0;};
  virtual             Int_t      *GetColIndexArray()       {Error("GetColIndexArray","Dummy"); return 0;};
  virtual             TMatrixDBase &SetRowIndexArray(Int_t *) {Error("SetRowIndexArray","Dummy"); return *this;}
  virtual             TMatrixDBase &SetColIndexArray(Int_t *) {Error("SetColIndexArray","Dummy"); return *this;}
  virtual             TMatrixDBase &GetSub(Int_t,Int_t,Int_t,Int_t,TMatrixDBase &,Option_t *) const {Error("GetSub","Dummy"); return *((TMatrixDBase*)this);}
  virtual             TMatrixDBase &SetSub(Int_t,Int_t,const TMatrixDBase &) {Error("GetSub","Dummy"); return *this;}
  virtual             TMatrixDBase &ResizeTo (Int_t,Int_t,Int_t) {Error("ResizeTo","Dummy"); return *this;}
  virtual             TMatrixDBase &ResizeTo (Int_t,Int_t,Int_t,Int_t,Int_t) {Error("ResizeTo","Dummy"); return *this;}
  //
  // ----------------------------- Choleski methods ----------------------------------------
  AliSymMatrix*       DecomposeChol();                  //Obtain Cholesky decomposition L matrix 
  void                InvertChol(AliSymMatrix* mchol);  //Invert using provided Choleski decomposition
  Bool_t              InvertChol();                     //Invert 
  Bool_t              SolveChol(Double_t *brhs, Bool_t invert=kFALSE);
  Bool_t              SolveChol(Double_t *brhs, Double_t *bsol,Bool_t invert=kFALSE);
  Bool_t              SolveChol(TVectorD &brhs, Bool_t invert=kFALSE);
  Bool_t              SolveChol(const TVectorD &brhs, TVectorD& bsol,Bool_t invert=kFALSE);
  //
  int                 SolveSpmInv(double *vecB, Bool_t stabilize=kTRUE);

 protected:
  virtual             Int_t GetIndex(Int_t row,Int_t col)      const;
  Double_t            GetEl(Int_t row, Int_t col)              const {return operator()(row,col);}
  void                SetEl(Int_t row, Int_t col,Double_t val)       {operator()(row,col) = val;}
  //
 protected:
  Double_t*  fElems;     //   Elements booked by constructor
  Double_t** fElemsAdd;  //   Elements (rows) added dynamicaly
  //
  static AliSymMatrix* fgBuffer;  // buffer for fast solution
  static Int_t         fgCopyCnt;  // matrix copy counter
  ClassDef(AliSymMatrix,0) //Symmetric Matrix Class
};


//___________________________________________________________
inline Int_t AliSymMatrix::GetIndex(Int_t row,Int_t col) const
{
  // lower triangle is actually filled
  return ((row*(row+1))>>1) + col;
}

//___________________________________________________________
inline Double_t AliSymMatrix::operator()(Int_t row, Int_t col) const
{
  //
  if (row<col) Swap(row,col);
  if (row>=fNrowIndex) return 0;
  return (const Double_t&) (row<fNcols ? fElems[GetIndex(row,col)] : (fElemsAdd[row-fNcols])[col]);
}

//___________________________________________________________
inline Double_t& AliSymMatrix::operator()(Int_t row, Int_t col)
{
  if (row<col) Swap(row,col);
  if (row>=fNrowIndex) AddRows(row-fNrowIndex+1);
  return (row<fNcols ? fElems[GetIndex(row,col)] : (fElemsAdd[row-fNcols])[col]);
}

//___________________________________________________________
inline void AliSymMatrix::MultiplyByVec(const TVectorD &vecIn, TVectorD &vecOut) const
{
  MultiplyByVec(vecIn.GetMatrixArray(), vecOut.GetMatrixArray());
}

//___________________________________________________________
inline void AliSymMatrix::Scale(Double_t coeff)
{
  for (int i=fNrowIndex;i--;) for (int j=i;j--;) { double& el = operator()(i,j); if (el) el *= coeff;}
}

//___________________________________________________________
inline void AliSymMatrix::AddToRow(Int_t r, Double_t *valc, Int_t *indc,Int_t n)
{
  for (int i=n;i--;) (*this)(indc[i],r) += valc[i];
}

#endif
 AliSymMatrix.h:1
 AliSymMatrix.h:2
 AliSymMatrix.h:3
 AliSymMatrix.h:4
 AliSymMatrix.h:5
 AliSymMatrix.h:6
 AliSymMatrix.h:7
 AliSymMatrix.h:8
 AliSymMatrix.h:9
 AliSymMatrix.h:10
 AliSymMatrix.h:11
 AliSymMatrix.h:12
 AliSymMatrix.h:13
 AliSymMatrix.h:14
 AliSymMatrix.h:15
 AliSymMatrix.h:16
 AliSymMatrix.h:17
 AliSymMatrix.h:18
 AliSymMatrix.h:19
 AliSymMatrix.h:20
 AliSymMatrix.h:21
 AliSymMatrix.h:22
 AliSymMatrix.h:23
 AliSymMatrix.h:24
 AliSymMatrix.h:25
 AliSymMatrix.h:26
 AliSymMatrix.h:27
 AliSymMatrix.h:28
 AliSymMatrix.h:29
 AliSymMatrix.h:30
 AliSymMatrix.h:31
 AliSymMatrix.h:32
 AliSymMatrix.h:33
 AliSymMatrix.h:34
 AliSymMatrix.h:35
 AliSymMatrix.h:36
 AliSymMatrix.h:37
 AliSymMatrix.h:38
 AliSymMatrix.h:39
 AliSymMatrix.h:40
 AliSymMatrix.h:41
 AliSymMatrix.h:42
 AliSymMatrix.h:43
 AliSymMatrix.h:44
 AliSymMatrix.h:45
 AliSymMatrix.h:46
 AliSymMatrix.h:47
 AliSymMatrix.h:48
 AliSymMatrix.h:49
 AliSymMatrix.h:50
 AliSymMatrix.h:51
 AliSymMatrix.h:52
 AliSymMatrix.h:53
 AliSymMatrix.h:54
 AliSymMatrix.h:55
 AliSymMatrix.h:56
 AliSymMatrix.h:57
 AliSymMatrix.h:58
 AliSymMatrix.h:59
 AliSymMatrix.h:60
 AliSymMatrix.h:61
 AliSymMatrix.h:62
 AliSymMatrix.h:63
 AliSymMatrix.h:64
 AliSymMatrix.h:65
 AliSymMatrix.h:66
 AliSymMatrix.h:67
 AliSymMatrix.h:68
 AliSymMatrix.h:69
 AliSymMatrix.h:70
 AliSymMatrix.h:71
 AliSymMatrix.h:72
 AliSymMatrix.h:73
 AliSymMatrix.h:74
 AliSymMatrix.h:75
 AliSymMatrix.h:76
 AliSymMatrix.h:77
 AliSymMatrix.h:78
 AliSymMatrix.h:79
 AliSymMatrix.h:80
 AliSymMatrix.h:81
 AliSymMatrix.h:82
 AliSymMatrix.h:83
 AliSymMatrix.h:84
 AliSymMatrix.h:85
 AliSymMatrix.h:86
 AliSymMatrix.h:87
 AliSymMatrix.h:88
 AliSymMatrix.h:89
 AliSymMatrix.h:90
 AliSymMatrix.h:91
 AliSymMatrix.h:92
 AliSymMatrix.h:93
 AliSymMatrix.h:94
 AliSymMatrix.h:95
 AliSymMatrix.h:96
 AliSymMatrix.h:97
 AliSymMatrix.h:98
 AliSymMatrix.h:99
 AliSymMatrix.h:100
 AliSymMatrix.h:101
 AliSymMatrix.h:102
 AliSymMatrix.h:103
 AliSymMatrix.h:104
 AliSymMatrix.h:105
 AliSymMatrix.h:106
 AliSymMatrix.h:107
 AliSymMatrix.h:108
 AliSymMatrix.h:109
 AliSymMatrix.h:110
 AliSymMatrix.h:111
 AliSymMatrix.h:112
 AliSymMatrix.h:113
 AliSymMatrix.h:114
 AliSymMatrix.h:115
 AliSymMatrix.h:116
 AliSymMatrix.h:117
 AliSymMatrix.h:118
 AliSymMatrix.h:119
 AliSymMatrix.h:120
 AliSymMatrix.h:121
 AliSymMatrix.h:122
 AliSymMatrix.h:123
 AliSymMatrix.h:124
 AliSymMatrix.h:125
 AliSymMatrix.h:126
 AliSymMatrix.h:127
 AliSymMatrix.h:128
 AliSymMatrix.h:129
 AliSymMatrix.h:130
 AliSymMatrix.h:131
 AliSymMatrix.h:132
 AliSymMatrix.h:133
 AliSymMatrix.h:134
 AliSymMatrix.h:135
 AliSymMatrix.h:136
 AliSymMatrix.h:137
 AliSymMatrix.h:138