blob: 6f3b1727e687b49f4ce6ab7cb3190bebe526c2bc [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://code.google.com/p/ceres-solver/
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: vitus@google.com (Michael Vitus)
30
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080031#include "ceres/internal/householder_vector.h"
32
Austin Schuh70cc9552019-01-21 19:46:48 -080033#include "ceres/internal/eigen.h"
34#include "glog/logging.h"
35#include "gtest/gtest.h"
36
37namespace ceres {
38namespace internal {
39
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080040static void HouseholderTestHelper(const Vector& x) {
Austin Schuh70cc9552019-01-21 19:46:48 -080041 const double kTolerance = 1e-14;
42
43 // Check to ensure that H * x = ||x|| * [0 ... 0 1]'.
44 Vector v(x.rows());
45 double beta;
Austin Schuh1d1e6ea2020-12-23 21:56:30 -080046
47 // NOTE: The explicit template arguments are needed here because
48 // ComputeHouseholderVector is templated and some versions of MSVC
49 // have trouble deducing the type of v automatically.
50 ComputeHouseholderVector<Vector, double, Eigen::Dynamic>(x, &v, &beta);
Austin Schuh70cc9552019-01-21 19:46:48 -080051 Vector result = x - beta * v * (v.transpose() * x);
52
53 Vector expected_result(x.rows());
54 expected_result.setZero();
55 expected_result(x.rows() - 1) = 1;
56 expected_result *= x.norm();
57
58 for (int i = 0; i < x.rows(); ++i) {
59 EXPECT_NEAR(expected_result[i], result[i], kTolerance);
60 }
61}
62
63TEST(HouseholderVector, ZeroPositive) {
64 Vector x(3);
65 x << 0.0, 0.0, 0.25;
66
67 HouseholderTestHelper(x);
68}
69
70TEST(HouseholderVector, ZeroNegative) {
71 Vector x(3);
72 x << 0.0, 0.0, -0.25;
73
74 HouseholderTestHelper(x);
75}
76
77TEST(HouseholderVector, NearZeroPositive) {
78 Vector x(3);
79 x << 1e-18, 1e-18, 0.25;
80
81 HouseholderTestHelper(x);
82}
83
84TEST(HouseholderVector, NearZeroNegative) {
85 Vector x(3);
86 x << 1e-18, 1e-18, -0.25;
87
88 HouseholderTestHelper(x);
89}
90
91TEST(HouseholderVector, NonZeroNegative) {
92 Vector x(3);
93 x << 1.0, 0.0, -3.0;
94
95 HouseholderTestHelper(x);
96}
97
98TEST(HouseholderVector, NonZeroPositive) {
99 Vector x(3);
100 x << 1.0, 1.0, 1.0;
101
102 HouseholderTestHelper(x);
103}
104
105TEST(HouseholderVector, NonZeroPositive_Size4) {
106 Vector x(4);
107 x << 1.0, 1.0, 0.0, 2.0;
108
109 HouseholderTestHelper(x);
110}
111
112TEST(HouseholderVector, LastElementZero) {
113 Vector x(4);
114 x << 1.0, 1.0, 0.0, 0.0;
115
116 HouseholderTestHelper(x);
117}
118
119} // namespace internal
120} // namespace ceres