10 #ifndef ROOT_Minuit2_LASymMatrix
11 #define ROOT_Minuit2_LASymMatrix
35 int Mndaxpy(
unsigned int,
double,
const double*,
int,
double*,
int);
36 int Mndscal(
unsigned int,
double,
double*,
int);
40 int Invert ( LASymMatrix & );
55 LASymMatrix() : fSize(0), fNRow(0), fData(0) {}
61 LASymMatrix(
unsigned int n) : fSize(n*(n+1)/2), fNRow(n), fData((double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*n*(n+1)/2)) {
63 memset(fData, 0, fSize*
sizeof(
double));
72 if(fData) StackAllocatorHolder::Get().Deallocate(fData);
75 LASymMatrix(
const LASymMatrix& v) :
76 fSize(v.size()), fNRow(v.Nrow()), fData((double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*v.size())) {
78 memcpy(fData, v.Data(), fSize*
sizeof(double));
81 LASymMatrix& operator=(
const LASymMatrix& v) {
85 assert(fSize == v.size());
86 memcpy(fData, v.Data(), fSize*
sizeof(double));
91 LASymMatrix(
const ABObj<sym, LASymMatrix, T>& v) :
92 fSize(v.Obj().size()), fNRow(v.Obj().Nrow()), fData((double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*v.Obj().size())) {
95 memcpy(fData, v.Obj().Data(), fSize*
sizeof(double));
96 Mndscal(fSize,
double(v.f()), fData, 1);
100 template<
class A,
class B,
class T>
101 LASymMatrix(
const ABObj<sym, ABSum<ABObj<sym, A, T>, ABObj<sym, B, T> >,T>& sum) : fSize(0), fNRow(0), fData(0) {
104 (*this) = sum.Obj().A();
105 (*this) += sum.Obj().B();
109 template<
class A,
class T>
110 LASymMatrix(
const ABObj<sym, ABSum<ABObj<sym, LASymMatrix, T>, ABObj<sym, A, T> >,T>& sum) : fSize(0), fNRow(0), fData(0) {
115 (*this)=sum.Obj().B();
117 (*this)+=sum.Obj().A();
121 template<
class A,
class T>
122 LASymMatrix(
const ABObj<sym, ABObj<sym, A, T>, T>& something) : fSize(0), fNRow(0), fData(0) {
124 (*this) = something.Obj();
125 (*this) *= something.f();
130 LASymMatrix(
const ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, T>, T>, T>& inv) : fSize(inv.Obj().Obj().Obj().size()), fNRow(inv.Obj().Obj().Obj().Nrow()), fData((double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*inv.Obj().Obj().Obj().size())) {
131 memcpy(fData, inv.Obj().Obj().Obj().Data(), fSize*
sizeof(double));
132 Mndscal(fSize,
double(inv.Obj().Obj().f()), fData, 1);
134 Mndscal(fSize,
double(inv.f()), fData, 1);
137 template<
class A,
class T>
138 LASymMatrix(
const ABObj<sym, ABSum<ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, T>, T>, T>, ABObj<sym, A, T> >, T>& sum) : fSize(0), fNRow(0), fData(0) {
142 (*this)=sum.Obj().B();
143 (*this)+=sum.Obj().A();
147 LASymMatrix(
const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, double>,
double>,
double>&);
149 template<
class A,
class T>
150 LASymMatrix(
const ABObj<sym, ABSum<ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T>, ABObj<sym, A, T> >, T>& sum) : fSize(0), fNRow(0), fData(0) {
154 (*this)=sum.Obj().B();
155 (*this)+=sum.Obj().A();
159 LASymMatrix& operator+=(
const LASymMatrix& m) {
161 assert(fSize==m.size());
162 Mndaxpy(fSize, 1., m.Data(), 1, fData, 1);
166 LASymMatrix& operator-=(
const LASymMatrix& m) {
168 assert(fSize==m.size());
169 Mndaxpy(fSize, -1., m.Data(), 1, fData, 1);
174 LASymMatrix& operator+=(
const ABObj<sym, LASymMatrix, T>& m) {
176 assert(fSize==m.Obj().size());
177 if(m.Obj().Data()==fData) {
178 Mndscal(fSize, 1.+
double(m.f()), fData, 1);
180 Mndaxpy(fSize,
double(m.f()), m.Obj().Data(), 1, fData, 1);
186 template<
class A,
class T>
187 LASymMatrix& operator+=(
const ABObj<sym, A, T>& m) {
189 (*this) += LASymMatrix(m);
194 LASymMatrix& operator+=(
const ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, T>, T>, T>& m) {
197 LASymMatrix tmp(m.Obj().Obj());
199 tmp *= double(m.f());
205 LASymMatrix& operator+=(
const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T>& m) {
208 Outer_prod(*
this, m.Obj().Obj().Obj(), m.f()*m.Obj().Obj().f()*m.Obj().Obj().f());
212 LASymMatrix& operator*=(
double scal) {
213 Mndscal(fSize, scal, fData, 1);
217 double operator()(
unsigned int row,
unsigned int col)
const {
218 assert(row<fNRow && col < fNRow);
220 return fData[col+row*(row+1)/2];
222 return fData[row+col*(col+1)/2];
225 double& operator()(
unsigned int row,
unsigned int col) {
226 assert(row<fNRow && col < fNRow);
228 return fData[col+row*(row+1)/2];
230 return fData[row+col*(col+1)/2];
233 const double* Data()
const {
return fData;}
235 double* Data() {
return fData;}
237 unsigned int size()
const {
return fSize;}
239 unsigned int Nrow()
const {
return fNRow;}
241 unsigned int Ncol()
const {
return Nrow();}
252 LASymMatrix& operator=(
const ABObj<sym, LASymMatrix, T>& v) {
254 if(fSize == 0 && fData == 0) {
255 fSize = v.Obj().size();
256 fNRow = v.Obj().Nrow();
257 fData = (
double*)StackAllocatorHolder::Get().Allocate(
sizeof(
double)*fSize);
259 assert(fSize == v.Obj().size());
262 memcpy(fData, v.Obj().Data(), fSize*
sizeof(double));
267 template<
class A,
class T>
268 LASymMatrix& operator=(
const ABObj<sym, ABObj<sym, A, T>, T>& something) {
270 if(fSize == 0 && fData == 0) {
271 (*this) = something.Obj();
272 (*this) *= something.f();
274 LASymMatrix tmp(something.Obj());
275 tmp *= something.f();
276 assert(fSize == tmp.size());
277 memcpy(fData, tmp.Data(), fSize*
sizeof(double));
283 template<
class A,
class B,
class T>
284 LASymMatrix& operator=(
const ABObj<sym, ABSum<ABObj<sym, A, T>, ABObj<sym, B, T> >,T>& sum) {
287 if(fSize == 0 && fData == 0) {
288 (*this) = sum.Obj().A();
289 (*this) += sum.Obj().B();
292 LASymMatrix tmp(sum.Obj().A());
293 tmp += sum.Obj().B();
295 assert(fSize == tmp.size());
296 memcpy(fData, tmp.Data(), fSize*
sizeof(double));
301 template<
class A,
class T>
302 LASymMatrix& operator=(
const ABObj<sym, ABSum<ABObj<sym, LASymMatrix, T>, ABObj<sym, A, T> >,T>& sum) {
305 if(fSize == 0 && fData == 0) {
307 (*this) = sum.Obj().B();
308 (*this) += sum.Obj().A();
312 LASymMatrix tmp(sum.Obj().B());
313 tmp += sum.Obj().A();
315 assert(fSize == tmp.size());
316 memcpy(fData, tmp.Data(), fSize*
sizeof(double));
323 LASymMatrix& operator=(
const ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, T>, T>, T>& inv) {
324 if(fSize == 0 && fData == 0) {
325 fSize = inv.Obj().Obj().Obj().size();
326 fNRow = inv.Obj().Obj().Obj().Nrow();
327 fData = (
double*)StackAllocatorHolder::Get().Allocate(
sizeof(
double)*fSize);
328 memcpy(fData, inv.Obj().Obj().Obj().Data(), fSize*
sizeof(double));
329 (*this) *= inv.Obj().Obj().f();
333 LASymMatrix tmp(inv.Obj().Obj());
335 tmp *= double(inv.f());
336 assert(fSize == tmp.size());
337 memcpy(fData, tmp.Data(), fSize*
sizeof(double));
342 LASymMatrix& operator=(
const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, double>,
double>,
double>&);
349 #endif // ROOT_Minuit2_LASymMatrix