blob: 8f9c5ed23365073d4548103abc92bbd613deeb01 [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: sameeragarwal@google.com (Sameer Agarwal)
30
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080031#include "ceres/detect_structure.h"
32
Austin Schuh70cc9552019-01-21 19:46:48 -080033#include "Eigen/Core"
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080034#include "ceres/block_structure.h"
Austin Schuh70cc9552019-01-21 19:46:48 -080035#include "glog/logging.h"
36#include "gtest/gtest.h"
Austin Schuh70cc9552019-01-21 19:46:48 -080037
38namespace ceres {
39namespace internal {
40
41TEST(DetectStructure, EverythingStatic) {
42 const int expected_row_block_size = 2;
43 const int expected_e_block_size = 3;
44 const int expected_f_block_size = 4;
45
46 CompressedRowBlockStructure bs;
47
48 bs.cols.push_back(Block());
49 bs.cols.back().size = 3;
50 bs.cols.back().position = 0;
51
52 bs.cols.push_back(Block());
53 bs.cols.back().size = 4;
54 bs.cols.back().position = 3;
55
56 bs.cols.push_back(Block());
57 bs.cols.back().size = 4;
58 bs.cols.back().position = 7;
59
60 {
61 bs.rows.push_back(CompressedRow());
62 CompressedRow& row = bs.rows.back();
63 row.block.size = 2;
64 row.block.position = 0;
65 row.cells.push_back(Cell(0, 0));
66 row.cells.push_back(Cell(1, 0));
67 }
68
69 {
70 bs.rows.push_back(CompressedRow());
71 CompressedRow& row = bs.rows.back();
72 row.block.size = 2;
73 row.block.position = 2;
74 row.cells.push_back(Cell(0, 0));
75 row.cells.push_back(Cell(2, 0));
76 }
77
78 int row_block_size = 0;
79 int e_block_size = 0;
80 int f_block_size = 0;
81 const int num_eliminate_blocks = 1;
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080082 DetectStructure(
83 bs, num_eliminate_blocks, &row_block_size, &e_block_size, &f_block_size);
Austin Schuh70cc9552019-01-21 19:46:48 -080084
85 EXPECT_EQ(row_block_size, expected_row_block_size);
86 EXPECT_EQ(e_block_size, expected_e_block_size);
87 EXPECT_EQ(f_block_size, expected_f_block_size);
88}
89
90TEST(DetectStructure, DynamicRow) {
91 const int expected_row_block_size = Eigen::Dynamic;
92 const int expected_e_block_size = 3;
93 const int expected_f_block_size = 4;
94
95 CompressedRowBlockStructure bs;
96
97 bs.cols.push_back(Block());
98 bs.cols.back().size = 3;
99 bs.cols.back().position = 0;
100
101 bs.cols.push_back(Block());
102 bs.cols.back().size = 4;
103 bs.cols.back().position = 3;
104
105 bs.cols.push_back(Block());
106 bs.cols.back().size = 4;
107 bs.cols.back().position = 7;
108
109 {
110 bs.rows.push_back(CompressedRow());
111 CompressedRow& row = bs.rows.back();
112 row.block.size = 2;
113 row.block.position = 0;
114 row.cells.push_back(Cell(0, 0));
115 row.cells.push_back(Cell(1, 0));
116 }
117
118 {
119 bs.rows.push_back(CompressedRow());
120 CompressedRow& row = bs.rows.back();
121 row.block.size = 1;
122 row.block.position = 2;
123 row.cells.push_back(Cell(0, 0));
124 row.cells.push_back(Cell(2, 0));
125 }
126
127 int row_block_size = 0;
128 int e_block_size = 0;
129 int f_block_size = 0;
130 const int num_eliminate_blocks = 1;
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800131 DetectStructure(
132 bs, num_eliminate_blocks, &row_block_size, &e_block_size, &f_block_size);
Austin Schuh70cc9552019-01-21 19:46:48 -0800133
134 EXPECT_EQ(row_block_size, expected_row_block_size);
135 EXPECT_EQ(e_block_size, expected_e_block_size);
136 EXPECT_EQ(f_block_size, expected_f_block_size);
137}
138
139TEST(DetectStructure, DynamicFBlockDifferentRows) {
140 const int expected_row_block_size = 2;
141 const int expected_e_block_size = 3;
142 const int expected_f_block_size = Eigen::Dynamic;
143
Austin Schuh70cc9552019-01-21 19:46:48 -0800144 CompressedRowBlockStructure bs;
145
146 bs.cols.push_back(Block());
147 bs.cols.back().size = 3;
148 bs.cols.back().position = 0;
149
150 bs.cols.push_back(Block());
151 bs.cols.back().size = 4;
152 bs.cols.back().position = 3;
153
154 bs.cols.push_back(Block());
155 bs.cols.back().size = 3;
156 bs.cols.back().position = 7;
157
158 {
159 bs.rows.push_back(CompressedRow());
160 CompressedRow& row = bs.rows.back();
161 row.block.size = 2;
162 row.block.position = 0;
163 row.cells.push_back(Cell(0, 0));
164 row.cells.push_back(Cell(1, 0));
165 }
166
167 {
168 bs.rows.push_back(CompressedRow());
169 CompressedRow& row = bs.rows.back();
170 row.block.size = 2;
171 row.block.position = 2;
172 row.cells.push_back(Cell(0, 0));
173 row.cells.push_back(Cell(2, 0));
174 }
175
176 int row_block_size = 0;
177 int e_block_size = 0;
178 int f_block_size = 0;
179 const int num_eliminate_blocks = 1;
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800180 DetectStructure(
181 bs, num_eliminate_blocks, &row_block_size, &e_block_size, &f_block_size);
Austin Schuh70cc9552019-01-21 19:46:48 -0800182
183 EXPECT_EQ(row_block_size, expected_row_block_size);
184 EXPECT_EQ(e_block_size, expected_e_block_size);
185 EXPECT_EQ(f_block_size, expected_f_block_size);
186}
187
188TEST(DetectStructure, DynamicEBlock) {
189 const int expected_row_block_size = 2;
190 const int expected_e_block_size = Eigen::Dynamic;
191 const int expected_f_block_size = 3;
192
193 CompressedRowBlockStructure bs;
194
195 bs.cols.push_back(Block());
196 bs.cols.back().size = 3;
197 bs.cols.back().position = 0;
198
199 bs.cols.push_back(Block());
200 bs.cols.back().size = 4;
201 bs.cols.back().position = 3;
202
203 bs.cols.push_back(Block());
204 bs.cols.back().size = 3;
205 bs.cols.back().position = 7;
206
207 {
208 bs.rows.push_back(CompressedRow());
209 CompressedRow& row = bs.rows.back();
210 row.block.size = 2;
211 row.block.position = 0;
212 row.cells.push_back(Cell(0, 0));
213 row.cells.push_back(Cell(2, 0));
214 }
215
216 {
217 bs.rows.push_back(CompressedRow());
218 CompressedRow& row = bs.rows.back();
219 row.block.size = 2;
220 row.block.position = 2;
221 row.cells.push_back(Cell(1, 0));
222 row.cells.push_back(Cell(2, 0));
223 }
224
225 int row_block_size = 0;
226 int e_block_size = 0;
227 int f_block_size = 0;
228 const int num_eliminate_blocks = 2;
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800229 DetectStructure(
230 bs, num_eliminate_blocks, &row_block_size, &e_block_size, &f_block_size);
Austin Schuh70cc9552019-01-21 19:46:48 -0800231
232 EXPECT_EQ(row_block_size, expected_row_block_size);
233 EXPECT_EQ(e_block_size, expected_e_block_size);
234 EXPECT_EQ(f_block_size, expected_f_block_size);
235}
236
237TEST(DetectStructure, DynamicFBlockSameRow) {
238 const int expected_row_block_size = 2;
239 const int expected_e_block_size = 3;
240 const int expected_f_block_size = Eigen::Dynamic;
241
242 CompressedRowBlockStructure bs;
243
244 bs.cols.push_back(Block());
245 bs.cols.back().size = 3;
246 bs.cols.back().position = 0;
247
248 bs.cols.push_back(Block());
249 bs.cols.back().size = 4;
250 bs.cols.back().position = 3;
251
252 bs.cols.push_back(Block());
253 bs.cols.back().size = 3;
254 bs.cols.back().position = 7;
255
256 {
257 bs.rows.push_back(CompressedRow());
258 CompressedRow& row = bs.rows.back();
259 row.block.size = 2;
260 row.block.position = 0;
261 row.cells.push_back(Cell(0, 0));
262 row.cells.push_back(Cell(1, 0));
263 row.cells.push_back(Cell(2, 0));
264 }
265
266 int row_block_size = 0;
267 int e_block_size = 0;
268 int f_block_size = 0;
269 const int num_eliminate_blocks = 1;
Austin Schuh1d1e6ea2020-12-23 21:56:30 -0800270 DetectStructure(
271 bs, num_eliminate_blocks, &row_block_size, &e_block_size, &f_block_size);
Austin Schuh70cc9552019-01-21 19:46:48 -0800272
273 EXPECT_EQ(row_block_size, expected_row_block_size);
274 EXPECT_EQ(e_block_size, expected_e_block_size);
275 EXPECT_EQ(f_block_size, expected_f_block_size);
276}
277
278} // namespace internal
279} // namespace ceres