1 // Ceres Solver - A fast non-linear least squares minimizer
2 // Copyright 2015 Google Inc. All rights reserved.
3 // http://ceres-solver.org/
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are met:
8 // * Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright notice,
11 // this list of conditions and the following disclaimer in the documentation
12 // and/or other materials provided with the distribution.
13 // * Neither the name of Google Inc. nor the names of its contributors may be
14 // used to endorse or promote products derived from this software without
15 // specific prior written permission.
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 // POSSIBILITY OF SUCH DAMAGE.
29 // Author: dgossow@google.com (David Gossow)
31 // This file contains tests for the IsClose function.
33 #include "ceres/is_close.h"
34 #include "gtest/gtest.h"
39 const double kTolerance = 1e-9;
41 TEST(IsClose, BothParametersPositive) {
42 double relative_error = -1;
43 double absolute_error = -1;
45 // Test cases where both values are positive.
46 EXPECT_TRUE(IsClose(9.9, 10.0, 0.011, &relative_error, &absolute_error));
47 EXPECT_NEAR(relative_error, 0.01, kTolerance);
48 EXPECT_NEAR(absolute_error, 0.1, kTolerance);
51 EXPECT_TRUE(IsClose(10.0, 9.9, 0.011, &relative_error, &absolute_error));
52 EXPECT_NEAR(relative_error, 0.01, kTolerance);
53 EXPECT_NEAR(absolute_error, 0.1, kTolerance);
57 EXPECT_FALSE(IsClose(9.9, 10.0, 0.009, &relative_error, &absolute_error));
58 EXPECT_NEAR(relative_error, 0.01, kTolerance);
59 EXPECT_NEAR(absolute_error, 0.1, kTolerance);
62 EXPECT_FALSE(IsClose(10.0, 9.9, 0.009, &relative_error, &absolute_error));
63 EXPECT_NEAR(relative_error, 0.01, kTolerance);
64 EXPECT_NEAR(absolute_error, 0.1, kTolerance);
67 TEST(IsClose, BothParametersNegative) {
68 double relative_error = -1;
69 double absolute_error = -1;
71 // Test cases where both values are negative.
72 EXPECT_TRUE(IsClose(-9.9, -10.0, 0.011, &relative_error, &absolute_error));
73 EXPECT_NEAR(relative_error, 0.01, kTolerance);
74 EXPECT_NEAR(absolute_error, 0.1, kTolerance);
77 EXPECT_TRUE(IsClose(-10.0, -9.9, 0.011, &relative_error, &absolute_error));
78 EXPECT_NEAR(relative_error, 0.01, kTolerance);
79 EXPECT_NEAR(absolute_error, 0.1, kTolerance);
83 EXPECT_FALSE(IsClose(-9.9, -10.0, 0.009, &relative_error, &absolute_error));
84 EXPECT_NEAR(relative_error, 0.01, kTolerance);
85 EXPECT_NEAR(absolute_error, 0.1, kTolerance);
88 EXPECT_FALSE(IsClose(-10.0, -9.9, 0.009, &relative_error, &absolute_error));
89 EXPECT_NEAR(relative_error, 0.01, kTolerance);
90 EXPECT_NEAR(absolute_error, 0.1, kTolerance);
93 TEST(IsClose, ParametersHaveMixedSigns) {
94 double relative_error = -1;
95 double absolute_error = -1;
97 // Test cases with mixed signs.
98 EXPECT_FALSE(IsClose(-0.1, 0.1, 1.99, &relative_error, &absolute_error));
99 EXPECT_NEAR(relative_error, 2.0, kTolerance);
100 EXPECT_NEAR(absolute_error, 0.2, kTolerance);
103 EXPECT_TRUE(IsClose(-0.1, 0.1, 2.01, &relative_error, &absolute_error));
104 EXPECT_NEAR(relative_error, 2.0, kTolerance);
105 EXPECT_NEAR(absolute_error, 0.2, kTolerance);
108 EXPECT_FALSE(IsClose(0.1, -0.1, 1.99, &relative_error, &absolute_error));
109 EXPECT_NEAR(relative_error, 2.0, kTolerance);
110 EXPECT_NEAR(absolute_error, 0.2, kTolerance);
113 EXPECT_TRUE(IsClose(0.1, -0.1, 2.01, &relative_error, &absolute_error));
114 EXPECT_NEAR(relative_error, 2.0, kTolerance);
115 EXPECT_NEAR(absolute_error, 0.2, kTolerance);
118 TEST(IsClose, OneParameterZero) {
119 double relative_error = -1;
120 double absolute_error = -1;
122 // Test cases where one of the values is zero.
123 EXPECT_TRUE(IsClose(0.0, 10.0, 10.1, &relative_error, &absolute_error));
124 EXPECT_NEAR(relative_error, 10.0, kTolerance);
125 EXPECT_NEAR(absolute_error, 10.0, kTolerance);
128 EXPECT_TRUE(IsClose(10.0, 0.0, 10.1, &relative_error, &absolute_error));
129 EXPECT_NEAR(relative_error, 10.0, kTolerance);
130 EXPECT_NEAR(absolute_error, 10.0, kTolerance);
133 EXPECT_TRUE(IsClose(0.0, -10.0, 10.1, &relative_error, &absolute_error));
134 EXPECT_NEAR(relative_error, 10.0, kTolerance);
135 EXPECT_NEAR(absolute_error, 10.0, kTolerance);
138 EXPECT_TRUE(IsClose(-10.0, 0.0, 10.1, &relative_error, &absolute_error));
139 EXPECT_NEAR(relative_error, 10.0, kTolerance);
140 EXPECT_NEAR(absolute_error, 10.0, kTolerance);
144 EXPECT_FALSE(IsClose(0, 10.0, 9.9, &relative_error, &absolute_error));
145 EXPECT_NEAR(relative_error, 10.0, kTolerance);
146 EXPECT_NEAR(absolute_error, 10.0, kTolerance);
149 EXPECT_FALSE(IsClose(10.0, 0.0, 9.9, &relative_error, &absolute_error));
150 EXPECT_NEAR(relative_error, 10.0, kTolerance);
151 EXPECT_NEAR(absolute_error, 10.0, kTolerance);
154 EXPECT_FALSE(IsClose(0, -10.0, 9.9, &relative_error, &absolute_error));
155 EXPECT_NEAR(relative_error, 10.0, kTolerance);
156 EXPECT_NEAR(absolute_error, 10.0, kTolerance);
159 EXPECT_FALSE(IsClose(-10.0, 0.0, 9.9, &relative_error, &absolute_error));
160 EXPECT_NEAR(relative_error, 10.0, kTolerance);
161 EXPECT_NEAR(absolute_error, 10.0, kTolerance);
164 TEST(IsClose, BothParametersZero) {
165 double relative_error = -1;
166 double absolute_error = -1;
167 EXPECT_TRUE(IsClose(0.0, 0.0, 0.1, &relative_error, &absolute_error));
168 EXPECT_NEAR(relative_error, 0.0, kTolerance);
169 EXPECT_NEAR(absolute_error, 0.0, kTolerance);
172 EXPECT_FALSE(IsClose(0.0, 0.0, 0.0, &relative_error, &absolute_error));
173 EXPECT_NEAR(relative_error, 0.0, kTolerance);
174 EXPECT_NEAR(absolute_error, 0.0, kTolerance);
176 } // namespace internal