00001 // @(#)root/minuit2:$Id: LaProd.h 20880 2007-11-19 11:23:41Z rdm $ 00002 // Authors: M. Winkler, F. James, L. Moneta, A. Zsenei 2003-2005 00003 00004 /********************************************************************** 00005 * * 00006 * Copyright (c) 2005 LCG ROOT Math team, CERN/PH-SFT * 00007 * * 00008 **********************************************************************/ 00009 00010 #ifndef ROOT_Minuit2_LaProd 00011 #define ROOT_Minuit2_LaProd 00012 00013 #include "Minuit2/ABProd.h" 00014 #include "Minuit2/LAVector.h" 00015 #include "Minuit2/LASymMatrix.h" 00016 00017 namespace ROOT { 00018 00019 namespace Minuit2 { 00020 00021 00022 /* 00023 LM" remove this for fixing alpha poblem 00024 #define OP_MULT1(MT1,MT2,MAT1,MAT2,T) \ 00025 template<class B> \ 00026 inline ABObj<AlgebraicProdType<MT1,MT2>::Type,ABProd<ABObj<MT1,MAT1,T>, ABObj<MT2,B,T> >,T> operator*(const ABObj<MT1,MAT1,T>& a, const ABObj<MT2,B,T>& b) { return ABObj<AlgebraicProdType<MT1,MT2>::Type,ABProd<ABObj<MT1,MAT1,T>, ABObj<MT2,B,T> >,T>(ABProd<ABObj<MT1,MAT1,T>, ABObj<MT2,B,T> >(a, b)); } \ 00027 template<class A> \ 00028 inline ABObj<AlgebraicProdType<MT1,MT2>::Type,ABProd<ABObj<MT1,A,T>, ABObj<MT2,MAT2,T> >,T> operator*(const ABObj<MT1,A,T>& a, const ABObj<MT2,MAT2,T>& b) { \ 00029 return ABObj<AlgebraicProdType<MT1,MT2>::Type,ABProd<ABObj<MT1,A,T>, ABObj<MT2,MAT2,T> >,T>(ABProd<ABObj<MT1,A,T>, ABObj<MT2,MAT2,T> >(a, b)); \ 00030 } \ 00031 \ 00032 */ 00033 00034 #define OP_MULT1(MT1,MT2,MAT1,MAT2,T) \ 00035 inline ABObj<AlgebraicProdType<MT1,MT2>::Type,ABProd<ABObj<MT1,MAT1,T>, ABObj<MT2,MAT2,T> >,T> operator*(const ABObj<MT1,MAT1,T>& a, const ABObj<MT2,MAT2,T>& b) { \ 00036 return ABObj<AlgebraicProdType<MT1,MT2>::Type,ABProd<ABObj<MT1,MAT1,T>, ABObj<MT2,MAT2,T> >,T>(ABProd<ABObj<MT1,MAT1,T>, ABObj<MT2,MAT2,T> >(a, b)); \ 00037 } 00038 00039 OP_MULT1(sym,vec,LASymMatrix,LAVector,double) 00040 // OP_MULT1(sym,gen,LASymMatrix,LAGenMatrix,double) 00041 // OP_MULT1(sym,sym,LASymMatrix,LASymMatrix,double) 00042 // OP_MULT1(gen,vec,LAGenMatrix,LAVector,double) 00043 // OP_MULT1(gen,sym,LAGenMatrix,LASymMatrix,double) 00044 // OP_MULT1(gen,gen,LAGenMatrix,LAGenMatrix,double) 00045 00046 } // namespace Minuit2 00047 00048 } // namespace ROOT 00049 00050 #endif // ROOT_Minuit2_LaProd