Belle II Software  release-05-01-25
matrix.test.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2014 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Oliver Frost <oliver.frost@desy.de> *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 /*
12 This file contains some basic investigation on numerically matrix algorithms.
13 */
14 
15 #include <gtest/gtest.h>
16 
17 #include <vector>
18 #include <Eigen/Dense>
19 
20 
21 // 1. Study of matrix inversions
22 
23 // TL;DR use a rank revealing matrix inversion (usually involving pivoting)
24 // * pivoted householder QR decomposition
25 // * full pivoted LU
26 
27 // no good for inversion if rank of the matrix is not full.
28 // TEST(TrackFindingCDCTest, TMatrixDSym_invert)
29 // {
30 // TMatrixDSym weight(2);
31 // weight(0,0) = 2;
32 // weight(0,1) = 0;
33 // weight(1,0) = 0;
34 // weight(1,1) = 0;
35 
36 // EXPECT_EQ(2, weight.GetNrows());
37 // EXPECT_EQ(2, weight.GetNcols());
38 
39 // TMatrixDSym cov = weight;
40 // cov.Invert();
41 
42 // EXPECT_EQ(2, weight.GetNrows());
43 // EXPECT_EQ(2, weight.GetNcols());
44 
45 // // Already fails here
46 // EXPECT_EQ(2, cov.GetNrows());
47 // EXPECT_EQ(2, cov.GetNcols());
48 
49 // EXPECT_NEAR(1.0 / 2.0, cov(0,0), 10e-7);
50 // EXPECT_NEAR(0.0, cov(0,1), 10e-7);
51 // EXPECT_NEAR(0.0, cov(1,0), 10e-7);
52 // EXPECT_NEAR(0.0, cov(1,1), 10e-7);
53 // }
54 
55 // no good for inversion if rank of the matrix is not full.
56 // TEST(TrackFindingCDCTest, SMatrixDSym_inverse)
57 // {
58 // using CovarianceMatrix = ROOT::Math::SMatrix< double, 2, 2, ROOT::Math::MatRepSym< double, 2>
59 // >;
60 // using WeightMatrix = ROOT::Math::SMatrix< double, 2, 2, ROOT::Math::MatRepSym< double, 2> >;
61 
62 // WeightMatrix weight;
63 // weight(0,0) = 2;
64 // weight(0,1) = 0;
65 // weight(1,0) = 0;
66 // weight(1,1) = 0;
67 
68 // int state = 0;
69 // CovarianceMatrix cov = weight.Inverse(state);
70 
71 // EXPECT_NEAR(1.0 / 2.0, cov(0,0), 10e-7);
72 // EXPECT_NEAR(0.0, cov(0,1), 10e-7);
73 // EXPECT_NEAR(0.0, cov(1,0), 10e-7);
74 // EXPECT_NEAR(0.0, cov(1,1), 10e-7);
75 // }
76 
77 // no good for inversion if rank of the matrix is not full.
78 // TEST(TrackFindingCDCTest, SMatrixDSym_inverseChol)
79 // {
80 // using CovarianceMatrix = ROOT::Math::SMatrix< double, 2, 2, ROOT::Math::MatRepSym< double, 2>
81 // >;
82 // using WeightMatrix = ROOT::Math::SMatrix< double, 2, 2, ROOT::Math::MatRepSym< double, 2> >;
83 
84 // WeightMatrix weight;
85 // weight(0,0) = 2;
86 // weight(0,1) = 0;
87 // weight(1,0) = 0;
88 // weight(1,1) = 0;
89 
90 // int state = 0;
91 // CovarianceMatrix cov = weight.InverseChol(state);
92 
93 // EXPECT_NEAR(1.0 / 2.0, cov(0,0), 10e-7);
94 // EXPECT_NEAR(0.0, cov(0,1), 10e-7);
95 // EXPECT_NEAR(0.0, cov(1,0), 10e-7);
96 // EXPECT_NEAR(0.0, cov(1,1), 10e-7);
97 // }
98 
99 // no good for inversion if rank of the matrix is not full.
100 // TEST(TrackFindingCDCTest, Eigen_inverse)
101 // {
102 // Eigen::Matrix<double, 2, 2> weight;
103 // weight(0,0) = 2;
104 // weight(0,1) = 0;
105 // weight(1,0) = 0;
106 // weight(1,1) = 0;
107 
108 // Eigen::Matrix<double, 2, 2> cov = weight.inverse();
109 
110 // EXPECT_NEAR(1.0 / 2.0, cov(0,0), 10e-7);
111 // EXPECT_NEAR(0.0, cov(0,1), 10e-7);
112 // EXPECT_NEAR(0.0, cov(1,0), 10e-7);
113 // EXPECT_NEAR(0.0, cov(1,1), 10e-7);
114 // }
115 
116 // no good for inversion if rank of the matrix is not full.
117 // TEST(TrackFindingCDCTest, Eigen_llt_inverse)
118 // {
119 // Eigen::Matrix<double, 2, 2> weight;
120 // weight(0,0) = 2;
121 // weight(0,1) = 0;
122 // weight(1,0) = 0;
123 // weight(1,1) = 0;
124 
125 // Eigen::Matrix<double, 2, 2> cov = weight.llt().inverse();
126 
127 // EXPECT_NEAR(1.0 / 2.0, cov(0,0), 10e-7);
128 // EXPECT_NEAR(0.0, cov(0,1), 10e-7);
129 // EXPECT_NEAR(0.0, cov(1,0), 10e-7);
130 // EXPECT_NEAR(0.0, cov(1,1), 10e-7);
131 // }
132 
133 // No good for inversion if rank of the matrix is not full.
134 // TEST(TrackFindingCDCTest, Eigen_lldt_inverse)
135 // {
136 // Eigen::Matrix<double, 2, 2> weight;
137 // weight(0,0) = 2;
138 // weight(0,1) = 0;
139 // weight(1,0) = 0;
140 // weight(1,1) = 0;
141 
142 // Eigen::Matrix<double, 2, 2> cov = weight.lldt().inverse();
143 
144 // EXPECT_NEAR(1.0 / 2.0, cov(0,0), 10e-7);
145 // EXPECT_NEAR(0.0, cov(0,1), 10e-7);
146 // EXPECT_NEAR(0.0, cov(1,0), 10e-7);
147 // EXPECT_NEAR(0.0, cov(1,1), 10e-7);
148 // }
149 
150 TEST(TrackFindingCDCTest, Eigen_fullPivLu_inverse)
151 {
152  Eigen::Matrix<double, 2, 2> weight;
153  weight(0, 0) = 2;
154  weight(0, 1) = 0;
155  weight(1, 0) = 0;
156  weight(1, 1) = 0;
157 
158  Eigen::Matrix<double, 2, 2> cov = weight.fullPivLu().inverse();
159 
160  EXPECT_NEAR(1.0 / 2.0, cov(0, 0), 10e-7);
161  EXPECT_NEAR(0.0, cov(0, 1), 10e-7);
162  EXPECT_NEAR(0.0, cov(1, 0), 10e-7);
163  EXPECT_NEAR(0.0, cov(1, 1), 10e-7);
164 }
165 
166 // No good for inversion if rank of the matrix is not full.
167 // TEST(TrackFindingCDCTest, Eigen_partialPivLu_inverse)
168 // {
169 // Eigen::Matrix<double, 2, 2> weight;
170 // weight(0,0) = 2;
171 // weight(0,1) = 0;
172 // weight(1,0) = 0;
173 // weight(1,1) = 0;
174 
175 // Eigen::Matrix<double, 2, 2> cov = weight.partialPivLu().inverse();
176 
177 // EXPECT_NEAR(1.0 / 2.0, cov(0,0), 10e-7);
178 // EXPECT_NEAR(0.0, cov(0,1), 10e-7);
179 // EXPECT_NEAR(0.0, cov(1,0), 10e-7);
180 // EXPECT_NEAR(0.0, cov(1,1), 10e-7);
181 // }
182 
183 // Can not do inversion
184 // TEST(TrackFindingCDCTest, Eigen_householderQr_inverse)
185 // {
186 // Eigen::Matrix<double, 2, 2> weight;
187 // weight(0,0) = 2;
188 // weight(0,1) = 0;
189 // weight(1,0) = 0;
190 // weight(1,1) = 0;
191 
192 // Eigen::Matrix<double, 2, 2> cov = weight.householderQr().inverse();
193 
194 // EXPECT_NEAR(1.0 / 2.0, cov(0,0), 10e-7);
195 // EXPECT_NEAR(0.0, cov(0,1), 10e-7);
196 // EXPECT_NEAR(0.0, cov(1,0), 10e-7);
197 // EXPECT_NEAR(0.0, cov(1,1), 10e-7);
198 // }
199 
200 /* Method of choice for covariance <-> weight matrices */
201 TEST(TrackFindingCDCTest, Eigen_colPivHouseholderQr_inverse)
202 {
203  Eigen::Matrix<double, 2, 2> weight;
204  weight(0, 0) = 2;
205  weight(0, 1) = 0;
206  weight(1, 0) = 0;
207  weight(1, 1) = 0;
208 
209  Eigen::Matrix<double, 2, 2> cov = weight.colPivHouseholderQr().inverse();
210 
211  EXPECT_NEAR(1.0 / 2.0, cov(0, 0), 10e-7);
212  EXPECT_NEAR(0.0, cov(0, 1), 10e-7);
213  EXPECT_NEAR(0.0, cov(1, 0), 10e-7);
214  EXPECT_NEAR(0.0, cov(1, 1), 10e-7);
215 }
216 
217 TEST(TrackFindingCDCTest, Eigen_fullPivHouseholderQr_inverse)
218 {
219  Eigen::Matrix<double, 2, 2> weight;
220  weight(0, 0) = 2;
221  weight(0, 1) = 0;
222  weight(1, 0) = 0;
223  weight(1, 1) = 0;
224 
225  Eigen::Matrix<double, 2, 2> cov = weight.fullPivHouseholderQr().inverse();
226 
227  EXPECT_NEAR(1.0 / 2.0, cov(0, 0), 10e-7);
228  EXPECT_NEAR(0.0, cov(0, 1), 10e-7);
229  EXPECT_NEAR(0.0, cov(1, 0), 10e-7);
230  EXPECT_NEAR(0.0, cov(1, 1), 10e-7);
231 }
Belle2::TEST
TEST(TestgetDetectorRegion, TestgetDetectorRegion)
Test Constructors.
Definition: utilityFunctions.cc:18