ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
math_test.cc
Go to the documentation of this file.
1 // Copyright (c) 2018, ETH Zurich and UNC Chapel Hill.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are met:
6 //
7 // * Redistributions of source code must retain the above copyright
8 // notice, this list of conditions and the following disclaimer.
9 //
10 // * Redistributions in binary form must reproduce the above copyright
11 // notice, this list of conditions and the following disclaimer in the
12 // documentation and/or other materials provided with the distribution.
13 //
14 // * Neither the name of ETH Zurich and UNC Chapel Hill nor the names of
15 // its contributors may be used to endorse or promote products derived
16 // from this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
22 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 // POSSIBILITY OF SUCH DAMAGE.
29 //
30 // Author: Johannes L. Schoenberger (jsch-at-demuc-dot-de)
31 
32 #define TEST_NAME "util/math"
33 #include "util/testing.h"
34 
35 #include "util/math.h"
36 
37 using namespace colmap;
38 
39 BOOST_AUTO_TEST_CASE(TestSignOfNumber) {
40  BOOST_CHECK_EQUAL(SignOfNumber(0), 0);
41  BOOST_CHECK_EQUAL(SignOfNumber(-0.1), -1);
42  BOOST_CHECK_EQUAL(SignOfNumber(0.1), 1);
43  BOOST_CHECK_EQUAL(SignOfNumber(std::numeric_limits<float>::quiet_NaN()), 0);
44  BOOST_CHECK_EQUAL(SignOfNumber(std::numeric_limits<float>::infinity()), 1);
45  BOOST_CHECK_EQUAL(SignOfNumber(-std::numeric_limits<float>::infinity()), -1);
46 }
47 
49  BOOST_CHECK(!IsNaN(0.0f));
50  BOOST_CHECK(!IsNaN(0.0));
51  BOOST_CHECK(IsNaN(std::numeric_limits<float>::quiet_NaN()));
52  BOOST_CHECK(IsNaN(std::numeric_limits<double>::quiet_NaN()));
53 }
54 
56  BOOST_CHECK(!IsInf(0.0f));
57  BOOST_CHECK(!IsInf(0.0));
58  BOOST_CHECK(IsInf(std::numeric_limits<float>::infinity()));
59  BOOST_CHECK(IsInf(std::numeric_limits<double>::infinity()));
60  BOOST_CHECK(IsInf(-std::numeric_limits<float>::infinity()));
61  BOOST_CHECK(IsInf(-std::numeric_limits<double>::infinity()));
62 }
63 
65  BOOST_CHECK_EQUAL(Clip(0, -1, 1), 0);
66  BOOST_CHECK_EQUAL(Clip(0, 0, 1), 0);
67  BOOST_CHECK_EQUAL(Clip(0, -1, 0), 0);
68  BOOST_CHECK_EQUAL(Clip(0, -1, 1), 0);
69  BOOST_CHECK_EQUAL(Clip(0, 1, 2), 1);
70  BOOST_CHECK_EQUAL(Clip(0, -2, -1), -1);
71  BOOST_CHECK_EQUAL(Clip(0, 0, 0), 0);
72 }
73 
74 BOOST_AUTO_TEST_CASE(TestDegToRad) {
75  BOOST_CHECK_EQUAL(DegToRad(0.0f), 0.0f);
76  BOOST_CHECK_EQUAL(DegToRad(0.0), 0.0);
77  BOOST_CHECK_LT(std::abs(DegToRad(180.0f) - M_PI), 1e-6f);
78  BOOST_CHECK_LT(std::abs(DegToRad(180.0) - M_PI), 1e-6);
79 }
80 
81 BOOST_AUTO_TEST_CASE(TestRadToDeg) {
82  BOOST_CHECK_EQUAL(RadToDeg(0.0f), 0.0f);
83  BOOST_CHECK_EQUAL(RadToDeg(0.0), 0.0);
84  BOOST_CHECK_LT(std::abs(RadToDeg(M_PI) - 180.0f), 1e-6f);
85  BOOST_CHECK_LT(std::abs(RadToDeg(M_PI) - 180.0), 1e-6);
86 }
87 
88 BOOST_AUTO_TEST_CASE(TestMedian) {
89  BOOST_CHECK_EQUAL(Median<int>({1, 2, 3, 4}), 2.5);
90  BOOST_CHECK_EQUAL(Median<int>({1, 2, 3, 100}), 2.5);
91  BOOST_CHECK_EQUAL(Median<int>({1, 2, 3, 4, 100}), 3);
92  BOOST_CHECK_EQUAL(Median<int>({-100, 1, 2, 3, 4}), 2);
93  BOOST_CHECK_EQUAL(Median<int>({-1, -2, -3, -4}), -2.5);
94  BOOST_CHECK_EQUAL(Median<int>({-1, -2, 3, 4}), 1);
95 }
96 
97 BOOST_AUTO_TEST_CASE(TestPercentile) {
98  BOOST_CHECK_EQUAL(Percentile<int>({0}, 0), 0);
99  BOOST_CHECK_EQUAL(Percentile<int>({0}, 50), 0);
100  BOOST_CHECK_EQUAL(Percentile<int>({0}, 100), 0);
101  BOOST_CHECK_EQUAL(Percentile<int>({0, 1}, 0), 0);
102  BOOST_CHECK_EQUAL(Percentile<int>({0, 1}, 50), 1);
103  BOOST_CHECK_EQUAL(Percentile<int>({0, 1}, 100), 1);
104  BOOST_CHECK_EQUAL(Percentile<int>({0, 1, 2}, 0), 0);
105  BOOST_CHECK_EQUAL(Percentile<int>({0, 1, 2}, 50), 1);
106  BOOST_CHECK_EQUAL(Percentile<int>({0, 1, 2}, 100), 2);
107  BOOST_CHECK_EQUAL(Percentile<int>({0, 1, 1, 2}, 0), 0);
108  BOOST_CHECK_EQUAL(Percentile<int>({0, 1, 1, 2}, 33), 1);
109  BOOST_CHECK_EQUAL(Percentile<int>({0, 1, 1, 2}, 50), 1);
110  BOOST_CHECK_EQUAL(Percentile<int>({0, 1, 1, 2}, 66), 1);
111  BOOST_CHECK_EQUAL(Percentile<int>({0, 1, 1, 2}, 100), 2);
112 }
113 
115  BOOST_CHECK_EQUAL(Mean<int>({1, 2, 3, 4}), 2.5);
116  BOOST_CHECK_EQUAL(Mean<int>({1, 2, 3, 100}), 26.5);
117  BOOST_CHECK_EQUAL(Mean<int>({1, 2, 3, 4, 100}), 22);
118  BOOST_CHECK_EQUAL(Mean<int>({-100, 1, 2, 3, 4}), -18);
119  BOOST_CHECK_EQUAL(Mean<int>({-1, -2, -3, -4}), -2.5);
120  BOOST_CHECK_EQUAL(Mean<int>({-1, -2, 3, 4}), 1);
121 }
122 
123 BOOST_AUTO_TEST_CASE(TestVariance) {
124  BOOST_CHECK_LE(std::abs(Variance<int>({1, 2, 3, 4}) - 1.66666666), 1e-6);
125  BOOST_CHECK_LE(std::abs(Variance<int>({1, 2, 3, 100}) - 2401.66666666), 1e-6);
126  BOOST_CHECK_LE(std::abs(Variance<int>({1, 2, 3, 4, 100}) - 1902.5), 1e-6);
127  BOOST_CHECK_LE(std::abs(Variance<int>({-100, 1, 2, 3, 4}) - 2102.5), 1e-6);
128  BOOST_CHECK_LE(std::abs(Variance<int>({-1, -2, -3, -4}) - 1.66666666), 1e-6);
129  BOOST_CHECK_LE(std::abs(Variance<int>({-1, -2, 3, 4}) - 8.66666666), 1e-6);
130 }
131 
132 BOOST_AUTO_TEST_CASE(TestStdDev) {
133  BOOST_CHECK_LE(std::abs(std::sqrt(Variance<int>({1, 2, 3, 4})) -
134  StdDev<int>({1, 2, 3, 4})),
135  1e-6);
136  BOOST_CHECK_LE(std::abs(std::sqrt(Variance<int>({1, 2, 3, 100})) -
137  StdDev<int>({1, 2, 3, 100})),
138  1e-6);
139 }
140 
141 BOOST_AUTO_TEST_CASE(TestAnyLessThan) {
142  BOOST_CHECK(AnyLessThan<int>({1, 2, 3, 4}, 5));
143  BOOST_CHECK(AnyLessThan<int>({1, 2, 3, 4}, 4));
144  BOOST_CHECK(AnyLessThan<int>({1, 2, 3, 4}, 3));
145  BOOST_CHECK(AnyLessThan<int>({1, 2, 3, 4}, 2));
146  BOOST_CHECK(!AnyLessThan<int>({1, 2, 3, 4}, 1));
147  BOOST_CHECK(!AnyLessThan<int>({1, 2, 3, 4}, 0));
148 }
149 
150 BOOST_AUTO_TEST_CASE(TestAnyGreaterThan) {
151  BOOST_CHECK(!AnyGreaterThan<int>({1, 2, 3, 4}, 5));
152  BOOST_CHECK(!AnyGreaterThan<int>({1, 2, 3, 4}, 4));
153  BOOST_CHECK(AnyGreaterThan<int>({1, 2, 3, 4}, 3));
154  BOOST_CHECK(AnyGreaterThan<int>({1, 2, 3, 4}, 2));
155  BOOST_CHECK(AnyGreaterThan<int>({1, 2, 3, 4}, 1));
156  BOOST_CHECK(AnyGreaterThan<int>({1, 2, 3, 4}, 0));
157 }
158 
159 BOOST_AUTO_TEST_CASE(TestNextCombination) {
160  std::vector<int> list{0};
161  BOOST_CHECK(!NextCombination(list.begin(), list.begin() + 1, list.end()));
162  list = {0, 1};
163  BOOST_CHECK(!NextCombination(list.begin(), list.begin() + 2, list.end()));
164  BOOST_CHECK_EQUAL(list[0], 0);
165  BOOST_CHECK(NextCombination(list.begin(), list.begin() + 1, list.end()));
166  BOOST_CHECK_EQUAL(list[0], 1);
167  BOOST_CHECK(!NextCombination(list.begin(), list.begin() + 1, list.end()));
168  BOOST_CHECK_EQUAL(list[0], 0);
169  list = {0, 1, 2};
170  BOOST_CHECK_EQUAL(list[0], 0);
171  BOOST_CHECK_EQUAL(list[1], 1);
172  BOOST_CHECK_EQUAL(list[2], 2);
173  BOOST_CHECK(NextCombination(list.begin(), list.begin() + 2, list.end()));
174  BOOST_CHECK_EQUAL(list[0], 0);
175  BOOST_CHECK_EQUAL(list[1], 2);
176  BOOST_CHECK_EQUAL(list[2], 1);
177  BOOST_CHECK(NextCombination(list.begin(), list.begin() + 2, list.end()));
178  BOOST_CHECK_EQUAL(list[0], 1);
179  BOOST_CHECK_EQUAL(list[1], 2);
180  BOOST_CHECK_EQUAL(list[2], 0);
181  BOOST_CHECK(!NextCombination(list.begin(), list.begin() + 2, list.end()));
182  BOOST_CHECK_EQUAL(list[0], 0);
183  BOOST_CHECK_EQUAL(list[1], 1);
184  BOOST_CHECK_EQUAL(list[2], 2);
185 }
186 
187 BOOST_AUTO_TEST_CASE(TestSigmoid) {
188  BOOST_CHECK_EQUAL(Sigmoid(0.0), 0.5);
189  BOOST_CHECK_CLOSE(Sigmoid(100.0), 1.0, 1e-10);
190  BOOST_CHECK_SMALL(Sigmoid(-100.0), 1e-10);
191 }
192 
193 BOOST_AUTO_TEST_CASE(TestScaleSigmoid) {
194  BOOST_CHECK_CLOSE(ScaleSigmoid(0.5), 0.5, 1e-10);
195  BOOST_CHECK_CLOSE(ScaleSigmoid(1.0), 1.0, 1e-10);
196  BOOST_CHECK_SMALL(ScaleSigmoid(-1.0), 1e-4);
197 }
198 
199 BOOST_AUTO_TEST_CASE(TestNChooseK) {
200  BOOST_CHECK_EQUAL(NChooseK(1, 0), 1);
201  BOOST_CHECK_EQUAL(NChooseK(2, 0), 1);
202  BOOST_CHECK_EQUAL(NChooseK(3, 0), 1);
203 
204  BOOST_CHECK_EQUAL(NChooseK(1, 1), 1);
205  BOOST_CHECK_EQUAL(NChooseK(2, 1), 2);
206  BOOST_CHECK_EQUAL(NChooseK(3, 1), 3);
207 
208  BOOST_CHECK_EQUAL(NChooseK(2, 2), 1);
209  BOOST_CHECK_EQUAL(NChooseK(2, 3), 0);
210 
211  BOOST_CHECK_EQUAL(NChooseK(3, 2), 3);
212  BOOST_CHECK_EQUAL(NChooseK(4, 2), 6);
213  BOOST_CHECK_EQUAL(NChooseK(5, 2), 10);
214 
215  BOOST_CHECK_EQUAL(NChooseK(500, 3), 20708500);
216 }
217 
218 BOOST_AUTO_TEST_CASE(TestTruncateCast) {
219  BOOST_CHECK_EQUAL((TruncateCast<int, int8_t>(-129)), -128);
220  BOOST_CHECK_EQUAL((TruncateCast<int, int8_t>(128)), 127);
221  BOOST_CHECK_EQUAL((TruncateCast<int, uint8_t>(-1)), 0);
222  BOOST_CHECK_EQUAL((TruncateCast<int, uint8_t>(256)), 255);
223  BOOST_CHECK_EQUAL((TruncateCast<int, uint16_t>(-1)), 0);
224  BOOST_CHECK_EQUAL((TruncateCast<int, uint16_t>(65536)), 65535);
225 }
constexpr double M_PI
Pi.
Definition: CVConst.h:19
const double * e
BOOST_AUTO_TEST_CASE(TestSignOfNumber)
Definition: math_test.cc:39
float RadToDeg(const float rad)
Definition: math.h:180
T Sigmoid(const T x, const T alpha=1)
Definition: math.h:278
bool NextCombination(Iterator first, Iterator middle, Iterator last)
Definition: math.h:273
int SignOfNumber(const T val)
Definition: math.h:156
T ScaleSigmoid(T x, const T alpha=1, const T x0=10)
Definition: math.h:283
size_t NChooseK(const size_t n, const size_t k)
Definition: math.cc:36
bool IsNaN(const float x)
Definition: math.h:160
float DegToRad(const float deg)
Definition: math.h:171
T Clip(const T &value, const T &low, const T &high)
Definition: math.h:167
bool IsInf(const float x)
Definition: math.h:163