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