blob: 7b071af38f471c00b8b70ed80ead613f067f7800 [file] [log] [blame]
Austin Schuh70cc9552019-01-21 19:46:48 -08001// Ceres Solver - A fast non-linear least squares minimizer
Austin Schuh3de38b02024-06-25 18:25:10 -07002// Copyright 2023 Google Inc. All rights reserved.
Austin Schuh70cc9552019-01-21 19:46:48 -08003// 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
Austin Schuh3de38b02024-06-25 18:25:10 -070037namespace ceres::internal {
Austin Schuh70cc9552019-01-21 19:46:48 -080038
39const double kTolerance = 1e-9;
40
41TEST(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
67TEST(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
93TEST(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
118TEST(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
164TEST(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}
Austin Schuh3de38b02024-06-25 18:25:10 -0700176} // namespace ceres::internal