Fixed vector comparisons that will erroneously return true when there are NaN values.

release/4.3a0
Alex Cunningham 2009-11-09 16:47:37 +00:00
parent a3de1964d7
commit 1ae81b59d8
3 changed files with 44 additions and 5 deletions

View File

@ -9,6 +9,7 @@
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include <iomanip> #include <iomanip>
#include <cmath>
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#ifdef WIN32 #ifdef WIN32
@ -117,9 +118,12 @@ namespace gtsam {
Vector::const_iterator it1 = vec1.begin(); Vector::const_iterator it1 = vec1.begin();
Vector::const_iterator it2 = vec2.begin(); Vector::const_iterator it2 = vec2.begin();
if (vec1.size()!=vec2.size()) return false; if (vec1.size()!=vec2.size()) return false;
for(size_t i=0; i<vec1.size(); i++) for(size_t i=0; i<vec1.size(); i++) {
if(isnan(it1[i]) xor isnan(it2[i]))
return false;
if(fabs(it1[i] - it2[i]) > tol) if(fabs(it1[i] - it2[i]) > tol)
return false; return false;
}
return true; return true;
} }

View File

@ -203,6 +203,17 @@ TEST( TestVector, ediv )
CHECK(assert_equal(c,actual)); CHECK(assert_equal(c,actual));
} }
/* ************************************************************************* */
TEST( TestVector, equals )
{
Vector v1 = Vector_(1, 0.0/0.0); //testing nan
Vector v2 = Vector_(1, 1.0);
double tol = 1.;
print(v1, "v1");
print(v2, "v2");
CHECK(!equal_with_abs_tol(v1, v2, tol));
}
/* ************************************************************************* */ /* ************************************************************************* */
int main() { TestResult tr; return TestRegistry::runAllTests(tr); } int main() { TestResult tr; return TestRegistry::runAllTests(tr); }
/* ************************************************************************* */ /* ************************************************************************* */

View File

@ -24,7 +24,7 @@ using namespace std;
using namespace gtsam; using namespace gtsam;
/* ************************************************************************* */ /* ************************************************************************* */
TEST( VectorConfig, equals ) TEST( VectorConfig, equals1 )
{ {
VectorConfig expected; VectorConfig expected;
Vector v = Vector_(3, 5.0, 6.0, 7.0); Vector v = Vector_(3, 5.0, 6.0, 7.0);
@ -32,6 +32,30 @@ TEST( VectorConfig, equals )
VectorConfig actual; VectorConfig actual;
actual.insert("a",v); actual.insert("a",v);
CHECK(actual.equals(expected)); CHECK(actual.equals(expected));
}
/* ************************************************************************* */
TEST( VectorConfig, equals2 )
{
VectorConfig cfg1, cfg2;
Vector v1 = Vector_(3, 5.0, 6.0, 7.0);
Vector v2 = Vector_(3, 5.0, 6.0, 8.0);
cfg1.insert("x", v1);
cfg2.insert("x", v2);
CHECK(!cfg1.equals(cfg2));
CHECK(!cfg2.equals(cfg1));
}
/* ************************************************************************* */
TEST( VectorConfig, equals_nan )
{
VectorConfig cfg1, cfg2;
Vector v1 = Vector_(3, 5.0, 6.0, 7.0);
Vector v2 = Vector_(3, 0.0/0.0, 0.0/0.0, 0.0/0.0);
cfg1.insert("x", v1);
cfg2.insert("x", v2);
CHECK(!cfg1.equals(cfg2));
CHECK(!cfg2.equals(cfg1));
} }
/* ************************************************************************* */ /* ************************************************************************* */