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

View File

@ -203,6 +203,17 @@ TEST( TestVector, ediv )
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); }
/* ************************************************************************* */

View File

@ -24,14 +24,38 @@ using namespace std;
using namespace gtsam;
/* ************************************************************************* */
TEST( VectorConfig, equals )
{
TEST( VectorConfig, equals1 )
{
VectorConfig expected;
Vector v = Vector_(3, 5.0, 6.0, 7.0);
expected.insert("a",v);
VectorConfig actual;
actual.insert("a",v);
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));
}
/* ************************************************************************* */