10 #ifndef ROOT_Minuit2_LAVector
11 #define ROOT_Minuit2_LAVector
29 int Mndaxpy(
unsigned int,
double,
const double*,
int,
double*,
int);
30 int Mndscal(
unsigned int,
double,
double*,
int);
31 int Mndspmv(
const char*,
unsigned int,
double,
const double*,
const double*,
int,
double,
double*,
int);
37 LAVector() : fSize(0), fData(0) {}
45 LAVector(
unsigned int n) : fSize(n), fData((double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*n)) {
47 memset(fData, 0, size()*
sizeof(
double));
56 if(fData) StackAllocatorHolder::Get().Deallocate(fData);
59 LAVector(
const LAVector& v) :
60 fSize(v.size()), fData((double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*v.size())) {
62 memcpy(fData, v.Data(), fSize*
sizeof(double));
65 LAVector& operator=(
const LAVector& v) {
69 assert(fSize == v.size());
70 memcpy(fData, v.Data(), fSize*
sizeof(double));
75 LAVector(
const ABObj<vec, LAVector, T>& v) :
76 fSize(v.Obj().size()), fData((double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*v.Obj().size())) {
79 memcpy(fData, v.Obj().Data(), fSize*
sizeof(T));
84 template<
class A,
class B,
class T>
85 LAVector(
const ABObj<vec, ABSum<ABObj<vec, A, T>, ABObj<vec, B, T> >,T>& sum) : fSize(0), fData(0) {
87 (*this) = sum.Obj().A();
88 (*this) += sum.Obj().B();
89 (*this) *= double(sum.f());
92 template<
class A,
class T>
93 LAVector(
const ABObj<vec, ABSum<ABObj<vec, LAVector, T>, ABObj<vec, A, T> >,T>& sum) : fSize(0), fData(0) {
98 (*this) = sum.Obj().B();
100 (*this) += sum.Obj().A();
101 (*this) *= double(sum.f());
105 template<
class A,
class T>
106 LAVector(
const ABObj<vec, ABObj<vec, A, T>, T>& something) : fSize(0), fData(0) {
108 (*this) = something.Obj();
109 (*this) *= something.f();
114 LAVector(
const ABObj<vec, ABProd<ABObj<sym, LASymMatrix, T>, ABObj<vec, LAVector, T> >, T>& prod) : fSize(prod.Obj().B().Obj().size()), fData((double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*prod.Obj().B().Obj().size())) {
117 Mndspmv(
"U", fSize, prod.f()*prod.Obj().A().f()*prod.Obj().B().f(), prod.Obj().A().Obj().Data(), prod.Obj().B().Obj().Data(), 1, 0., fData, 1);
122 LAVector(
const ABObj<vec, ABSum<ABObj<vec, ABProd<ABObj<sym, LASymMatrix, T>, ABObj<vec, LAVector, T> >, T>, ABObj<vec, LAVector, T> >, T>& prod) : fSize(0), fData(0) {
123 (*this) = prod.Obj().B();
124 (*this) += prod.Obj().A();
125 (*this) *= double(prod.f());
129 LAVector& operator+=(
const LAVector& m) {
131 assert(fSize==m.size());
132 Mndaxpy(fSize, 1., m.Data(), 1, fData, 1);
136 LAVector& operator-=(
const LAVector& m) {
138 assert(fSize==m.size());
139 Mndaxpy(fSize, -1., m.Data(), 1, fData, 1);
144 LAVector& operator+=(
const ABObj<vec, LAVector, T>& m) {
146 assert(fSize==m.Obj().size());
147 if(m.Obj().Data()==fData) {
148 Mndscal(fSize, 1.+
double(m.f()), fData, 1);
150 Mndaxpy(fSize,
double(m.f()), m.Obj().Data(), 1, fData, 1);
156 template<
class A,
class T>
157 LAVector& operator+=(
const ABObj<vec, A, T>& m) {
159 (*this) += LAVector(m);
164 LAVector& operator+=(
const ABObj<vec, ABProd<ABObj<sym, LASymMatrix, T>, ABObj<vec, LAVector, T> >, T>& prod) {
165 Mndspmv(
"U", fSize, prod.f()*prod.Obj().A().f()*prod.Obj().B().f(), prod.Obj().A().Obj().Data(), prod.Obj().B().Data(), 1, 1., fData, 1);
169 LAVector& operator*=(
double scal) {
170 Mndscal(fSize, scal, fData, 1);
174 double operator()(
unsigned int i)
const {
179 double& operator()(
unsigned int i) {
184 double operator[](
unsigned int i)
const {
189 double& operator[](
unsigned int i) {
194 const double* Data()
const {
return fData;}
196 double* Data() {
return fData;}
198 unsigned int size()
const {
return fSize;}
208 LAVector& operator=(
const ABObj<vec, LAVector, T>& v) {
210 if(fSize == 0 && fData == 0) {
211 fSize = v.Obj().size();
212 fData = (
double*)StackAllocatorHolder::Get().Allocate(
sizeof(
double)*fSize);
214 assert(fSize == v.Obj().size());
216 memcpy(fData, v.Obj().Data(), fSize*
sizeof(double));
221 template<
class A,
class T>
222 LAVector& operator=(
const ABObj<vec, ABObj<vec, A, T>, T>& something) {
224 if(fSize == 0 && fData == 0) {
225 (*this) = something.Obj();
227 LAVector tmp(something.Obj());
228 assert(fSize == tmp.size());
229 memcpy(fData, tmp.Data(), fSize*
sizeof(double));
231 (*this) *= something.f();
235 template<
class A,
class B,
class T>
236 LAVector& operator=(
const ABObj<vec, ABSum<ABObj<vec, A, T>, ABObj<vec, B, T> >,T>& sum) {
237 if(fSize == 0 && fData == 0) {
238 (*this) = sum.Obj().A();
239 (*this) += sum.Obj().B();
241 LAVector tmp(sum.Obj().A());
242 tmp += sum.Obj().B();
243 assert(fSize == tmp.size());
244 memcpy(fData, tmp.Data(), fSize*
sizeof(double));
250 template<
class A,
class T>
251 LAVector& operator=(
const ABObj<vec, ABSum<ABObj<vec, LAVector, T>, ABObj<vec, A, T> >,T>& sum) {
252 if(fSize == 0 && fData == 0) {
253 (*this) = sum.Obj().B();
254 (*this) += sum.Obj().A();
256 LAVector tmp(sum.Obj().A());
257 tmp += sum.Obj().B();
258 assert(fSize == tmp.size());
259 memcpy(fData, tmp.Data(), fSize*
sizeof(double));
267 LAVector& operator=(
const ABObj<vec, ABProd<ABObj<sym, LASymMatrix, T>, ABObj<vec, LAVector, T> >, T>& prod) {
268 if(fSize == 0 && fData == 0) {
269 fSize = prod.Obj().B().Obj().size();
270 fData = (
double*)StackAllocatorHolder::Get().Allocate(
sizeof(
double)*fSize);
271 Mndspmv(
"U", fSize,
double(prod.f()*prod.Obj().A().f()*prod.Obj().B().f()), prod.Obj().A().Obj().Data(), prod.Obj().B().Obj().Data(), 1, 0., fData, 1);
273 LAVector tmp(prod.Obj().B());
274 assert(fSize == tmp.size());
275 Mndspmv(
"U", fSize,
double(prod.f()*prod.Obj().A().f()), prod.Obj().A().Obj().Data(), tmp.Data(), 1, 0., fData, 1);
282 LAVector& operator=(
const ABObj<vec, ABSum<ABObj<vec, ABProd<ABObj<sym, LASymMatrix, T>, ABObj<vec, LAVector, T> >, T>, ABObj<vec, LAVector, T> >, T>& prod) {
283 if(fSize == 0 && fData == 0) {
284 (*this) = prod.Obj().B();
285 (*this) += prod.Obj().A();
288 LAVector tmp(prod.Obj().B());
289 tmp += prod.Obj().A();
290 assert(fSize == tmp.size());
291 memcpy(fData, tmp.Data(), fSize*
sizeof(double));
303 #endif // ROOT_Minuit2_LAVector