1// Ceres Solver - A fast non-linear least squares minimizer 2// Copyright 2012 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: sameeragarwal@google.com (Sameer Agarwal) 30 31#include "ceres/array_utils.h" 32 33#include <limits> 34#include <cmath> 35#include <vector> 36#include "gtest/gtest.h" 37 38namespace ceres { 39namespace internal { 40 41TEST(ArrayUtils, IsArrayValid) { 42 double x[3]; 43 x[0] = 0.0; 44 x[1] = 1.0; 45 x[2] = 2.0; 46 EXPECT_TRUE(IsArrayValid(3, x)); 47 x[1] = std::numeric_limits<double>::infinity(); 48 EXPECT_FALSE(IsArrayValid(3, x)); 49 x[1] = std::numeric_limits<double>::quiet_NaN(); 50 EXPECT_FALSE(IsArrayValid(3, x)); 51 x[1] = std::numeric_limits<double>::signaling_NaN(); 52 EXPECT_FALSE(IsArrayValid(3, x)); 53 EXPECT_TRUE(IsArrayValid(1, NULL)); 54 InvalidateArray(3, x); 55 EXPECT_FALSE(IsArrayValid(3, x)); 56} 57 58TEST(ArrayUtils, FindInvalidIndex) { 59 double x[3]; 60 x[0] = 0.0; 61 x[1] = 1.0; 62 x[2] = 2.0; 63 EXPECT_EQ(FindInvalidValue(3, x), 3); 64 x[1] = std::numeric_limits<double>::infinity(); 65 EXPECT_EQ(FindInvalidValue(3, x), 1); 66 x[1] = std::numeric_limits<double>::quiet_NaN(); 67 EXPECT_EQ(FindInvalidValue(3, x), 1); 68 x[1] = std::numeric_limits<double>::signaling_NaN(); 69 EXPECT_EQ(FindInvalidValue(3, x), 1); 70 EXPECT_EQ(FindInvalidValue(1, NULL), 1); 71 InvalidateArray(3, x); 72 EXPECT_EQ(FindInvalidValue(3, x), 0); 73} 74 75TEST(MapValuesToContiguousRange, ContiguousEntries) { 76 vector<int> array; 77 array.push_back(0); 78 array.push_back(1); 79 vector<int> expected = array; 80 MapValuesToContiguousRange(array.size(), &array[0]); 81 EXPECT_EQ(array, expected); 82 array.clear(); 83 84 array.push_back(1); 85 array.push_back(0); 86 expected = array; 87 MapValuesToContiguousRange(array.size(), &array[0]); 88 EXPECT_EQ(array, expected); 89} 90 91TEST(MapValuesToContiguousRange, NonContiguousEntries) { 92 vector<int> array; 93 array.push_back(0); 94 array.push_back(2); 95 vector<int> expected; 96 expected.push_back(0); 97 expected.push_back(1); 98 MapValuesToContiguousRange(array.size(), &array[0]); 99 EXPECT_EQ(array, expected); 100} 101 102TEST(MapValuesToContiguousRange, NonContiguousRepeatingEntries) { 103 vector<int> array; 104 array.push_back(3); 105 array.push_back(1); 106 array.push_back(0); 107 array.push_back(0); 108 array.push_back(0); 109 array.push_back(5); 110 vector<int> expected; 111 expected.push_back(2); 112 expected.push_back(1); 113 expected.push_back(0); 114 expected.push_back(0); 115 expected.push_back(0); 116 expected.push_back(3); 117 MapValuesToContiguousRange(array.size(), &array[0]); 118 EXPECT_EQ(array, expected); 119} 120 121} // namespace internal 122} // namespace ceres 123