ROOT logo
#ifndef ALIMATRIXSPARSE_H
#define ALIMATRIXSPARSE_H

#include "AliMatrixSq.h"
#include "AliVectorSparse.h"


/**********************************************************************************************/
/* Sparse matrix class, used as a global matrix for AliMillePede2                             */
/*                                                                                            */ 
/* Author: ruben.shahoyan@cern.ch                                                             */
/*                                                                                            */ 
/**********************************************************************************************/


//
class AliMatrixSparse : public AliMatrixSq 
{
 public:
  AliMatrixSparse() : fVecs(0) {}
  AliMatrixSparse(Int_t size);
  AliMatrixSparse(const AliMatrixSparse &mat);
  virtual ~AliMatrixSparse() {Clear();}
  //
  AliVectorSparse* GetRow(Int_t ir)        const {return (ir<fNcols) ? fVecs[ir] : 0;}
  AliVectorSparse* GetRowAdd(Int_t ir);
  //
  virtual Int_t   GetSize()                            const {return fNrows;}
  virtual Int_t   GetNRows()                           const {return fNrows;}
  virtual Int_t   GetNCols()                           const {return fNcols;}
  //
  void Clear(Option_t* option="");
  void Reset()                            {for (int i=fNcols;i--;) GetRow(i)->Reset();}
  void Print(Option_t* option="")                      const;
  AliMatrixSparse& operator=(const AliMatrixSparse& src);
  Double_t&        operator()(Int_t row,Int_t col);
  Double_t         operator()(Int_t row,Int_t col)     const;
  void             SetToZero(Int_t row,Int_t col);
  Float_t          GetDensity()                        const;
  //
  Double_t         DiagElem(Int_t r)                   const;
  Double_t&        DiagElem(Int_t r);
  void             SortIndices(Bool_t valuesToo=kFALSE);
  //
  void MultiplyByVec(const TVectorD &vecIn, TVectorD &vecOut) const; 
  void MultiplyByVec(const Double_t* vecIn, Double_t* vecOut) const;
  //
  void AddToRow(Int_t r, Double_t *valc,Int_t *indc,Int_t n);
  //
 protected:
  //
  AliVectorSparse** fVecs;
  //
  ClassDef(AliMatrixSparse,0)
};

//___________________________________________________
inline void AliMatrixSparse::MultiplyByVec(const TVectorD &vecIn, TVectorD &vecOut) const 
{
  // multiplication
  MultiplyByVec((Double_t*)vecIn.GetMatrixArray(),(Double_t*)vecOut.GetMatrixArray());
}

//___________________________________________________
inline void AliMatrixSparse::SetToZero(Int_t row,Int_t col)
{
  //  set existing element to 0
  if (IsSymmetric() && col>row) Swap(row,col); 
  AliVectorSparse* rowv = GetRow(row);
  if (rowv) rowv->SetToZero(col);
}

//___________________________________________________
inline Double_t AliMatrixSparse::operator()(Int_t row,Int_t col) const
{
  //  printf("M: find\n");
  if (IsSymmetric() && col>row) Swap(row,col); 
  AliVectorSparse* rowv = GetRow(row);
  if (!rowv) return 0;
  return rowv->FindIndex(col);
}

//___________________________________________________
inline Double_t& AliMatrixSparse::operator()(Int_t row,Int_t col)
{
  //  printf("M: findindexAdd\n");
  if (IsSymmetric() && col>row) Swap(row,col); 
  AliVectorSparse* rowv = GetRowAdd(row);
  if (col>=fNcols) fNcols = col+1;
  return rowv->FindIndexAdd(col);
}

//___________________________________________________
inline Double_t AliMatrixSparse::DiagElem(Int_t row) const
{
  // get diag elem
  AliVectorSparse* rowv = GetRow(row);
  if (!rowv) return 0;
  if (IsSymmetric()) return (rowv->GetNElems()>0 && rowv->GetLastIndex()==row) ? rowv->GetLastElem() : 0.;
  else return rowv->FindIndex(row);
  //
}

//___________________________________________________
inline Double_t &AliMatrixSparse::DiagElem(Int_t row)
{
  // get diag elem
  AliVectorSparse* rowv = GetRowAdd(row);
  if (row>=fNcols) fNcols = row+1;
  if (IsSymmetric()) {
    return (rowv->GetNElems()>0 && rowv->GetLastIndex()==row) ? 
		       rowv->GetLastElem() : rowv->FindIndexAdd(row);
  }
  else return rowv->FindIndexAdd(row);
  //
}


#endif

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