blob: 3eea042d5111d24df89d328694c950aaf9b6642f [file] [log] [blame]
Sameer Agarwal1fdc5202012-05-12 07:29:10 -07001// 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 <cmath>
34#include <cstddef>
Sameer Agarwal5e8321c2014-01-22 17:23:27 -080035#include <string>
36
Keir Mierle58ede272012-06-24 17:23:57 -070037#include "ceres/fpclassify.h"
Sameer Agarwal5e8321c2014-01-22 17:23:27 -080038#include "ceres/stringprintf.h"
Sameer Agarwal1fdc5202012-05-12 07:29:10 -070039
40namespace ceres {
41namespace internal {
42
43// It is a near impossibility that user code generates this exact
44// value in normal operation, thus we will use it to fill arrays
45// before passing them to user code. If on return an element of the
46// array still contains this value, we will assume that the user code
47// did not write to that memory location.
48const double kImpossibleValue = 1e302;
49
50bool IsArrayValid(const int size, const double* x) {
51 if (x != NULL) {
52 for (int i = 0; i < size; ++i) {
Keir Mierle58ede272012-06-24 17:23:57 -070053 if (!IsFinite(x[i]) || (x[i] == kImpossibleValue)) {
Sameer Agarwal1fdc5202012-05-12 07:29:10 -070054 return false;
55 }
56 }
57 }
58 return true;
59}
60
Sameer Agarwal5e8321c2014-01-22 17:23:27 -080061int FindInvalidValue(const int size, const double* x) {
62 if (x == NULL) {
63 return size;
64 }
65
66 for (int i = 0; i < size; ++i) {
67 if (!IsFinite(x[i]) || (x[i] == kImpossibleValue)) {
68 return i;
69 }
70 }
71
72 return size;
73};
74
Sameer Agarwal1fdc5202012-05-12 07:29:10 -070075void InvalidateArray(const int size, double* x) {
76 if (x != NULL) {
77 for (int i = 0; i < size; ++i) {
78 x[i] = kImpossibleValue;
79 }
80 }
81}
82
Sameer Agarwal5e8321c2014-01-22 17:23:27 -080083void AppendArrayToString(const int size, const double* x, string* result) {
84 for (int i = 0; i < size; ++i) {
85 if (x == NULL) {
86 StringAppendF(result, "Not Computed ");
87 } else {
88 if (x[i] == kImpossibleValue) {
89 StringAppendF(result, "Uninitialized ");
90 } else {
91 StringAppendF(result, "%12g ", x[i]);
92 }
93 }
94 }
95}
96
Sameer Agarwal1fdc5202012-05-12 07:29:10 -070097} // namespace internal
98} // namespace ceres