blob: 12d623632ff0874c4847887ef083b4209a52597f [file] [log] [blame]
Austin Schuh70cc9552019-01-21 19:46:48 -08001// 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"
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080034
Austin Schuh70cc9552019-01-21 19:46:48 -080035#include "gtest/gtest.h"
36
37namespace ceres {
38namespace internal {
39
40const double kTolerance = 1e-9;
41
42TEST(IsClose, BothParametersPositive) {
43 double relative_error = -1;
44 double absolute_error = -1;
45
46 // Test cases where both values are positive.
47 EXPECT_TRUE(IsClose(9.9, 10.0, 0.011, &relative_error, &absolute_error));
48 EXPECT_NEAR(relative_error, 0.01, kTolerance);
49 EXPECT_NEAR(absolute_error, 0.1, kTolerance);
50 relative_error = -1;
51 absolute_error = -1;
52 EXPECT_TRUE(IsClose(10.0, 9.9, 0.011, &relative_error, &absolute_error));
53 EXPECT_NEAR(relative_error, 0.01, kTolerance);
54 EXPECT_NEAR(absolute_error, 0.1, kTolerance);
55 relative_error = -1;
56 absolute_error = -1;
57
58 EXPECT_FALSE(IsClose(9.9, 10.0, 0.009, &relative_error, &absolute_error));
59 EXPECT_NEAR(relative_error, 0.01, kTolerance);
60 EXPECT_NEAR(absolute_error, 0.1, kTolerance);
61 relative_error = -1;
62 absolute_error = -1;
63 EXPECT_FALSE(IsClose(10.0, 9.9, 0.009, &relative_error, &absolute_error));
64 EXPECT_NEAR(relative_error, 0.01, kTolerance);
65 EXPECT_NEAR(absolute_error, 0.1, kTolerance);
66}
67
68TEST(IsClose, BothParametersNegative) {
69 double relative_error = -1;
70 double absolute_error = -1;
71
72 // Test cases where both values are negative.
73 EXPECT_TRUE(IsClose(-9.9, -10.0, 0.011, &relative_error, &absolute_error));
74 EXPECT_NEAR(relative_error, 0.01, kTolerance);
75 EXPECT_NEAR(absolute_error, 0.1, kTolerance);
76 relative_error = -1;
77 absolute_error = -1;
78 EXPECT_TRUE(IsClose(-10.0, -9.9, 0.011, &relative_error, &absolute_error));
79 EXPECT_NEAR(relative_error, 0.01, kTolerance);
80 EXPECT_NEAR(absolute_error, 0.1, kTolerance);
81 relative_error = -1;
82 absolute_error = -1;
83
84 EXPECT_FALSE(IsClose(-9.9, -10.0, 0.009, &relative_error, &absolute_error));
85 EXPECT_NEAR(relative_error, 0.01, kTolerance);
86 EXPECT_NEAR(absolute_error, 0.1, kTolerance);
87 relative_error = -1;
88 absolute_error = -1;
89 EXPECT_FALSE(IsClose(-10.0, -9.9, 0.009, &relative_error, &absolute_error));
90 EXPECT_NEAR(relative_error, 0.01, kTolerance);
91 EXPECT_NEAR(absolute_error, 0.1, kTolerance);
92}
93
94TEST(IsClose, ParametersHaveMixedSigns) {
95 double relative_error = -1;
96 double absolute_error = -1;
97
98 // Test cases with mixed signs.
99 EXPECT_FALSE(IsClose(-0.1, 0.1, 1.99, &relative_error, &absolute_error));
100 EXPECT_NEAR(relative_error, 2.0, kTolerance);
101 EXPECT_NEAR(absolute_error, 0.2, kTolerance);
102 relative_error = -1;
103 absolute_error = -1;
104 EXPECT_TRUE(IsClose(-0.1, 0.1, 2.01, &relative_error, &absolute_error));
105 EXPECT_NEAR(relative_error, 2.0, kTolerance);
106 EXPECT_NEAR(absolute_error, 0.2, kTolerance);
107 relative_error = -1;
108 absolute_error = -1;
109 EXPECT_FALSE(IsClose(0.1, -0.1, 1.99, &relative_error, &absolute_error));
110 EXPECT_NEAR(relative_error, 2.0, kTolerance);
111 EXPECT_NEAR(absolute_error, 0.2, kTolerance);
112 relative_error = -1;
113 absolute_error = -1;
114 EXPECT_TRUE(IsClose(0.1, -0.1, 2.01, &relative_error, &absolute_error));
115 EXPECT_NEAR(relative_error, 2.0, kTolerance);
116 EXPECT_NEAR(absolute_error, 0.2, kTolerance);
117}
118
119TEST(IsClose, OneParameterZero) {
120 double relative_error = -1;
121 double absolute_error = -1;
122
123 // Test cases where one of the values is zero.
124 EXPECT_TRUE(IsClose(0.0, 10.0, 10.1, &relative_error, &absolute_error));
125 EXPECT_NEAR(relative_error, 10.0, kTolerance);
126 EXPECT_NEAR(absolute_error, 10.0, kTolerance);
127 relative_error = -1;
128 absolute_error = -1;
129 EXPECT_TRUE(IsClose(10.0, 0.0, 10.1, &relative_error, &absolute_error));
130 EXPECT_NEAR(relative_error, 10.0, kTolerance);
131 EXPECT_NEAR(absolute_error, 10.0, kTolerance);
132 relative_error = -1;
133 absolute_error = -1;
134 EXPECT_TRUE(IsClose(0.0, -10.0, 10.1, &relative_error, &absolute_error));
135 EXPECT_NEAR(relative_error, 10.0, kTolerance);
136 EXPECT_NEAR(absolute_error, 10.0, kTolerance);
137 relative_error = -1;
138 absolute_error = -1;
139 EXPECT_TRUE(IsClose(-10.0, 0.0, 10.1, &relative_error, &absolute_error));
140 EXPECT_NEAR(relative_error, 10.0, kTolerance);
141 EXPECT_NEAR(absolute_error, 10.0, kTolerance);
142 relative_error = -1;
143 absolute_error = -1;
144
145 EXPECT_FALSE(IsClose(0, 10.0, 9.9, &relative_error, &absolute_error));
146 EXPECT_NEAR(relative_error, 10.0, kTolerance);
147 EXPECT_NEAR(absolute_error, 10.0, kTolerance);
148 relative_error = -1;
149 absolute_error = -1;
150 EXPECT_FALSE(IsClose(10.0, 0.0, 9.9, &relative_error, &absolute_error));
151 EXPECT_NEAR(relative_error, 10.0, kTolerance);
152 EXPECT_NEAR(absolute_error, 10.0, kTolerance);
153 relative_error = -1;
154 absolute_error = -1;
155 EXPECT_FALSE(IsClose(0, -10.0, 9.9, &relative_error, &absolute_error));
156 EXPECT_NEAR(relative_error, 10.0, kTolerance);
157 EXPECT_NEAR(absolute_error, 10.0, kTolerance);
158 relative_error = -1;
159 absolute_error = -1;
160 EXPECT_FALSE(IsClose(-10.0, 0.0, 9.9, &relative_error, &absolute_error));
161 EXPECT_NEAR(relative_error, 10.0, kTolerance);
162 EXPECT_NEAR(absolute_error, 10.0, kTolerance);
163}
164
165TEST(IsClose, BothParametersZero) {
166 double relative_error = -1;
167 double absolute_error = -1;
168 EXPECT_TRUE(IsClose(0.0, 0.0, 0.1, &relative_error, &absolute_error));
169 EXPECT_NEAR(relative_error, 0.0, kTolerance);
170 EXPECT_NEAR(absolute_error, 0.0, kTolerance);
171 relative_error = -1;
172 absolute_error = -1;
173 EXPECT_FALSE(IsClose(0.0, 0.0, 0.0, &relative_error, &absolute_error));
174 EXPECT_NEAR(relative_error, 0.0, kTolerance);
175 EXPECT_NEAR(absolute_error, 0.0, kTolerance);
176}
177} // namespace internal
178} // namespace ceres