#ifndef ALIPARAMSOLVER_H
#define ALIPARAMSOLVER_H
#include <TObject.h>
class AliSymMatrix;
class AliParamSolver: public TObject
{
public:
enum {kBitGloSol=BIT(14),kBitLocSol=BIT(15),kBitCInv=BIT(16)};
enum {kXX=0,kXY=1,kXZ=2,kYX=kXY,kYY=3,kYZ=4,kZX=kXZ,kZY=kYZ,kZZ=5};
enum {kX,kY,kZ};
AliParamSolver();
AliParamSolver(Int_t maxglo,Int_t locsize=16);
AliParamSolver(const AliParamSolver& src);
AliParamSolver& operator=(const AliParamSolver& src);
~AliParamSolver();
void AddEquation(const Double_t* dGl,const Double_t *dLc,const Double_t *res,const Double_t *covI,Double_t sclErrI=-1.);
void AddConstraint(Int_t parID, Double_t val, Double_t err2inv);
Bool_t Solve(Bool_t obtainCov=kFALSE);
Bool_t SolveGlobals(Bool_t obtainCov=kFALSE);
Bool_t SolveLocals();
void SetMaxGlobal(Int_t n);
void SetNGlobal(Int_t n);
void Clear(Option_t* = "");
void Print(Option_t* = "") const;
Int_t GetNGlobal() const {return fNGlobal;}
Int_t GetMaxGlobal() const {return fMaxGlobal;}
AliSymMatrix* GetCovMatrix();
Double_t* GetLocals() const {return (Double_t*)fSolLoc;}
Double_t* GetGlobals() const {return (Double_t*)fSolGlo;}
protected:
void Init(Int_t npini=16);
void ExpandStorage(Int_t newSize);
protected:
AliSymMatrix* fMatrix;
Double_t* fSolGlo;
Double_t* fSolLoc;
Int_t fMaxGlobal;
Int_t fNGlobal;
Int_t fNPoints;
Int_t fMaxPoints;
Double_t* fRHSGlo;
Double_t* fRHSLoc;
Double_t* fMatGamma;
Double_t* fMatG;
Double_t* fCovDGl;
ClassDef(AliParamSolver,0)
};
#endif