Imported Upstream version ceres 1.13.0
[platform/upstream/ceres-solver.git] / internal / ceres / is_close_test.cc
1 // Ceres Solver - A fast non-linear least squares minimizer
2 // Copyright 2015 Google Inc. All rights reserved.
3 // http://ceres-solver.org/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are met:
7 //
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.
16 //
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.
28 //
29 // Author: dgossow@google.com (David Gossow)
30 //
31 // This file contains tests for the IsClose function.
32
33 #include "ceres/is_close.h"
34 #include "gtest/gtest.h"
35
36 namespace ceres {
37 namespace internal {
38
39 const double kTolerance = 1e-9;
40
41 TEST(IsClose, BothParametersPositive) {
42   double relative_error = -1;
43   double absolute_error = -1;
44
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);
49   relative_error = -1;
50   absolute_error = -1;
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);
54   relative_error = -1;
55   absolute_error = -1;
56
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);
60   relative_error = -1;
61   absolute_error = -1;
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);
65 }
66
67 TEST(IsClose, BothParametersNegative) {
68   double relative_error = -1;
69   double absolute_error = -1;
70
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);
75   relative_error = -1;
76   absolute_error = -1;
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);
80   relative_error = -1;
81   absolute_error = -1;
82
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);
86   relative_error = -1;
87   absolute_error = -1;
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);
91 }
92
93 TEST(IsClose, ParametersHaveMixedSigns) {
94   double relative_error = -1;
95   double absolute_error = -1;
96
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);
101   relative_error = -1;
102   absolute_error = -1;
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);
106   relative_error = -1;
107   absolute_error = -1;
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);
111   relative_error = -1;
112   absolute_error = -1;
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);
116 }
117
118 TEST(IsClose, OneParameterZero) {
119   double relative_error = -1;
120   double absolute_error = -1;
121
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);
126   relative_error = -1;
127   absolute_error = -1;
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);
131   relative_error = -1;
132   absolute_error = -1;
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);
136   relative_error = -1;
137   absolute_error = -1;
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);
141   relative_error = -1;
142   absolute_error = -1;
143
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);
147   relative_error = -1;
148   absolute_error = -1;
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);
152   relative_error = -1;
153   absolute_error = -1;
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);
157   relative_error = -1;
158   absolute_error = -1;
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);
162 }
163
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);
170   relative_error = -1;
171   absolute_error = -1;
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);
175 }
176 }  // namespace internal
177 }  // namespace ceres