CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
invertPosDefMatrix.h
Go to the documentation of this file.
1 #ifndef DataFormat_Math_invertPosDefMatrix_H
2 #define DataFormat_Math_invertPosDefMatrix_H
3 
4 #define SMATRIX_USE_CONSTEXPR
5 #include "Math/SMatrix.h"
6 #include "Math/CholeskyDecomp.h"
7 // #include "DataFormats/Math/interface/CholeskyDecomp.h"
8 #include "SIMDVec.h"
9 
10 template<typename T,unsigned int N>
11 inline bool invertPosDefMatrix(ROOT::Math::SMatrix<T,N,N,ROOT::Math::MatRepSym<T,N> > & m) {
12 
13  ROOT::Math::CholeskyDecomp<T,N> decomp(m);
14  if (!decomp) {
15  return m.Invert();
16  } else
17  decomp.Invert(m);
18  return true;
19 
20 }
21 
22 template<typename T,unsigned int N>
23 inline bool invertPosDefMatrix(ROOT::Math::SMatrix<T,N,N,ROOT::Math::MatRepSym<T,N> > const & mIn,
24  ROOT::Math::SMatrix<T,N,N,ROOT::Math::MatRepSym<T,N> > & mOut) {
25 
26  ROOT::Math::CholeskyDecomp<T,N> decomp(mIn);
27  if (!decomp) {
28  mOut=mIn;
29  return mOut.Invert();
30  } else
31  decomp.Invert(mOut);
32  return true;
33 
34 }
35 
36 
37 // here for a test
38 #ifdef NEVER
39 // #if defined(USE_EXTVECT)
40 
41 namespace mathSSE {
42  struct M2 {
43  using Vec=Vec4<double>;
44  // the matrix is shuffed
45  Vec mm[2];
46 
47  double m00() const { return mm[0][0];}
48  double m01() const { return mm[0][1];}
49  double m11() const { return mm[1][0];}
50  double m10() const { return mm[1][1];}
51 
52  double & m00() { return mm[0][0];}
53  double & m01() { return mm[0][1];}
54  double & m11() { return mm[1][0];}
55  double & m10() { return mm[1][1];}
56 
57 
58  // load shuffled
59  inline M2(double i00, double i01, double i10, double i11) {
60  m00()=i00; m01()=i01; m11()=i11; m10()=i10; }
61 
62  Vec & r0() { return mm[0]; }
63  Vec & r1() { return mm[1]; }
64 
65  Vec const & r0() const { return mm[0]; }
66  Vec const & r1() const { return mm[1]; }
67 
68 
69  // assume second row is already shuffled
70  inline bool invert() {
71  Vec tmp = r1();
72  // mult and sub
73  Vec det = r0()*tmp;
74  Vec det2{det[1],det[0]};
75  // det and -det
76  det -= det2;
77  // m0 /det, m1/-det -> m3, m2
78  r1() = r0()/det;
79  // m3/det, m2/-det -> m0 m1
80  r0() = tmp/det;
81  return (0.!=det[0]);
82  }
83 
84  };
85 }
86 
87 template<>
88 inline bool invertPosDefMatrix<double,2>(ROOT::Math::SMatrix<double,2,2,ROOT::Math::MatRepSym<double,2> > & m) {
89  mathSSE::M2 mm(m.Array()[0], m.Array()[1], m.Array()[1], m.Array()[2]);
90 
91  bool ok = mm.invert();
92  if (ok) {
93  m.Array()[0] = mm.m00();
94  m.Array()[1] = mm.m01();
95  m.Array()[2] = mm.m11();
96  }
97  return ok;
98 }
99 
100 template<>
101 inline bool invertPosDefMatrix<double,2>(ROOT::Math::SMatrix<double,2,2,ROOT::Math::MatRepSym<double,2> > const & mIn,
102  ROOT::Math::SMatrix<double,2,2,ROOT::Math::MatRepSym<double,2> > & mOut) {
103 
104  mathSSE::M2 mm(mIn.Array()[0], mIn.Array()[1], mIn.Array()[1], mIn.Array()[2]);
105 
106  bool ok = mm.invert();
107  mOut.Array()[0] = mm.m00();
108  mOut.Array()[1] = mm.m01();
109  mOut.Array()[2] = mm.m11();
110 
111  return ok;
112 }
113 
114 
115 
116 
117 #endif
118 
119 
120 #endif
ExtVec< T, 4 > Vec4
Definition: ExtVec.h:23
bool invertPosDefMatrix(ROOT::Math::SMatrix< T, N, N, ROOT::Math::MatRepSym< T, N > > &m)
#define N
Definition: blowfish.cc:9
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
long double T