Fixed two problems related to g++ 4.0.0 on Darwin 9.8.0
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Wed, 12 May 2010 09:49:28 +0000 (11:49 +0200)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Wed, 12 May 2010 09:49:28 +0000 (11:49 +0200)
- Moved isnan() into dai namespace
- Added workaround for standard library implementations that
  cannot compare const_reverse_iterator and reverse_iterator

13 files changed:
ChangeLog
Makefile
README
include/dai/doc.h
include/dai/prob.h
include/dai/util.h
src/util.cpp
tests/testdai.cpp
tests/unit/factor_test.cpp
tests/unit/prob_test.cpp
tests/unit/smallset_test.cpp
tests/unit/util_test.cpp
tests/unit/varset_test.cpp

index d6cadb6..9315858 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+git HEAD
+--------
+* Fixed a problem with isnan() on FreeBSD; it is now in the dai namespace.
+* Workaround for older g++ compilers (e.g. version 4.0.0 on Darwin 9.8.0)
+  which have problems when comparing const_reverse_iterator with
+  reverse_iterator.
+
+
 libDAI-0.2.5 (2010-05-09)
 -------------------------
 
index 4dc2980..23d1201 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -15,8 +15,8 @@ include Makefile.ALL
 include Makefile.conf
 
 # Set version and date
-DAI_VERSION="0.2.5"
-DAI_DATE="May 9, 2010"
+DAI_VERSION="git HEAD"
+DAI_DATE="May 12, 2010, or later"
 
 # Directories of libDAI sources
 # Location libDAI headers
diff --git a/README b/README
index 8267941..fc7ddae 100644 (file)
--- a/README
+++ b/README
@@ -2,8 +2,8 @@ libDAI  -  A free/open source C++ library for Discrete Approximate Inference
 
 -------------------------------------------------------------------------------
 
-Version:  0.2.5
-Date:     May 9, 2010
+Version:  git HEAD
+Date:     May 12, 2010, or later
 See also: http://www.libdai.org
 
 -------------------------------------------------------------------------------
@@ -325,4 +325,3 @@ Install doxygen, graphviz and a TeX distribution and use
 to build the documentation. If the documentation is not clear enough, feel free
 to send me an email (or even better, to improve the documentation and send a
 patch!). The documentation can also be browsed online at http://www.libdai.org.
-
index 26115e5..13000ec 100644 (file)
@@ -38,8 +38,8 @@
 
 /** \mainpage Reference manual for libDAI - A free/open source C++ library for Discrete Approximate Inference methods
  *  \author Joris Mooij, Frederik Eaton
- *  \version 0.2.5
- *  \date May 9, 2010
+ *  \version git HEAD
+ *  \date May 12, 2010, or later
  *
  *  <hr size="1">
  *  \section about About libDAI
index 90b457b..ca6850c 100644 (file)
@@ -414,7 +414,7 @@ class TProb {
         bool hasNaNs() const {
             bool foundnan = false;
             for( const_iterator x = _p.begin(); x != _p.end(); x++ )
-                if( isnan( *x ) ) {
+                if( dai::isnan( *x ) ) {
                     foundnan = true;
                     break;
                 }
index 48858c7..f913da4 100644 (file)
 #define DAI_IFVERB(n, stmt) if(props.verbose>=n) { std::cerr << stmt; }
 
 
-#ifdef CYGWIN
-    /// Returns true if argument is NAN (Not A Number)
-    bool isnan( double x );
-#endif
-
-
 #ifdef WINDOWS
-    /// Returns true if argument is NAN (Not A Number)
-    bool isnan( double x );
-
     /// Returns inverse hyperbolic tangent of argument
     double atanh( double x );
 
@@ -91,6 +82,9 @@ namespace dai {
 /// Real number (alias for \c double, which could be changed to <tt>long double</tt> if necessary)
 typedef double Real;
 
+/// Returns true if argument is NAN (Not A Number)
+bool isnan( Real x );
+
 /// Returns logarithm of \a x
 inline Real log( Real x ) {
     return std::log(x);
index 5b94118..5a79380 100644 (file)
 #endif
 
 
-#ifdef CYGWIN
-bool isnan( double x ) {
-    return __isnand( x );  // isnan() is a macro in Cygwin (as required by C99)
-}
-#endif
-
 #ifdef WINDOWS
-bool isnan( double x ) {
-    return _isnan( x );
-}
 double atanh( double x ) {
     return boost::math::atanh( x );
 }
@@ -47,6 +38,19 @@ double log1p( double x ) {
 
 namespace dai {
 
+#if defined CYGWIN
+bool isnan( Real x ) {
+    return __isnand( x );  // isnan() is a macro in Cygwin (as required by C99)
+}
+#elif defined WINDOWS
+bool isnan( Real x ) {
+    return _isnan( x );
+}
+#else
+bool isnan( Real x ) {
+    return std::isnan( x );
+}
+#endif
 
 // Returns user+system time in seconds
 double toc() {
index 93416e0..a052b26 100644 (file)
@@ -408,9 +408,9 @@ int main( int argc, char *argv[] ) {
                 // Output maximum difference in last iteration
                 if( testdai.has_maxdiff ) {
                     Real md = clipReal( testdai.maxdiff, 1e-9 );
-                    if( isnan( mev ) )
+                    if( dai::isnan( mev ) )
                         md = mev;
-                    if( isnan( aev ) )
+                    if( dai::isnan( aev ) )
                         md = aev;
                     if( md == INFINITY )
                         md = 1.0;
index 6e6f195..72e8d4e 100644 (file)
@@ -221,12 +221,12 @@ BOOST_AUTO_TEST_CASE( UnaryTransformationsTest ) {
     BOOST_CHECK_CLOSE( y[2], (Real)1.0 / y[0], tol );
 
     y = x.log(false);
-    BOOST_CHECK( isnan( y[0] ) );
+    BOOST_CHECK( dai::isnan( y[0] ) );
     BOOST_CHECK_EQUAL( y[1], -INFINITY );
     BOOST_CHECK_CLOSE( y[2], dai::log((Real)2.0), tol );
 
     y = x.log(true);
-    BOOST_CHECK( isnan( y[0] ) );
+    BOOST_CHECK( dai::isnan( y[0] ) );
     BOOST_CHECK_CLOSE( y[1], (Real)0.0, tol );
     BOOST_CHECK_CLOSE( y[2], dai::log((Real)2.0), tol );
 
index e4a4ae0..87f11a8 100644 (file)
@@ -120,7 +120,7 @@ BOOST_AUTO_TEST_CASE( IteratorTest ) {
         BOOST_CHECK_EQUAL( *it, (Real)(4 - i) );
 
     i = 0;
-    for( Prob::const_reverse_iterator crit = x.rbegin(); crit != x.rend(); crit++, i++ )
+    for( Prob::const_reverse_iterator crit = x.rbegin(); crit != static_cast<Prob::const_reverse_iterator>(x.rend()); crit++, i++ )
         BOOST_CHECK_EQUAL( *crit, (Real)i );
 
     i = 0;
@@ -128,7 +128,7 @@ BOOST_AUTO_TEST_CASE( IteratorTest ) {
         *rit = (Real)(2 * i);
     
     i = 0;
-    for( Prob::const_reverse_iterator crit = x.rbegin(); crit != x.rend(); crit++, i++ )
+    for( Prob::const_reverse_iterator crit = x.rbegin(); crit != static_cast<Prob::const_reverse_iterator>(x.rend()); crit++, i++ )
         BOOST_CHECK_EQUAL( *crit, (Real)2 * i );
 }
 #endif
@@ -294,7 +294,7 @@ BOOST_AUTO_TEST_CASE( UnaryTransformationsTest ) {
 
     y = x.log(false);
     z = x.pwUnaryTr( fo_log<Real>() );
-    BOOST_CHECK( isnan( y[0] ) );
+    BOOST_CHECK( dai::isnan( y[0] ) );
     BOOST_CHECK_EQUAL( y[1], -INFINITY );
     BOOST_CHECK_CLOSE( y[2], dai::log((Real)2.0), tol );
     BOOST_CHECK( !(y == z) );
@@ -304,7 +304,7 @@ BOOST_AUTO_TEST_CASE( UnaryTransformationsTest ) {
 
     y = x.log(true);
     z = x.pwUnaryTr( fo_log0<Real>() );
-    BOOST_CHECK( isnan( y[0] ) );
+    BOOST_CHECK( dai::isnan( y[0] ) );
     BOOST_CHECK_CLOSE( y[1], (Real)0.0, tol );
     BOOST_CHECK_CLOSE( y[2], dai::log((Real)2.0), tol );
     BOOST_CHECK( !(y == z) );
@@ -593,7 +593,7 @@ BOOST_AUTO_TEST_CASE( VectorOperationsTest ) {
     BOOST_CHECK_CLOSE( r[0], z[0], tol );
     BOOST_CHECK_CLOSE( r[1], z[1], tol );
     BOOST_CHECK_EQUAL( r[2], z[2] );
-    BOOST_CHECK( isnan(r[3]) );
+    BOOST_CHECK( dai::isnan(r[3]) );
     BOOST_CHECK_CLOSE( r[4], z[4], tol );
     BOOST_CHECK_CLOSE( r[5], z[5], tol );
     x.set( 3, 0.0 ); r.set( 3, 0.0 );
@@ -603,7 +603,7 @@ BOOST_AUTO_TEST_CASE( VectorOperationsTest ) {
     BOOST_CHECK_CLOSE( r[0], z[0], tol );
     BOOST_CHECK_CLOSE( r[1], z[1], tol );
     BOOST_CHECK_EQUAL( r[2], z[2] );
-    BOOST_CHECK( isnan(r[3]) );
+    BOOST_CHECK( dai::isnan(r[3]) );
     BOOST_CHECK_CLOSE( r[4], z[4], tol );
     BOOST_CHECK_CLOSE( r[5], z[5], tol );
     x.set( 3, 0.0 ); r.set( 3, 0.0 );
@@ -664,14 +664,14 @@ BOOST_AUTO_TEST_CASE( VectorTransformationsTest ) {
     BOOST_CHECK_CLOSE( r[0], z[0], tol );
     BOOST_CHECK_CLOSE( r[1], z[1], tol );
     BOOST_CHECK_EQUAL( r[2], z[2] );
-    BOOST_CHECK( isnan(r[3]) );
+    BOOST_CHECK( dai::isnan(r[3]) );
     BOOST_CHECK_CLOSE( r[4], z[4], tol );
     BOOST_CHECK_CLOSE( r[5], z[5], tol );
     z = x.pwBinaryTr( y, std::divides<Real>() );
     BOOST_CHECK_CLOSE( r[0], z[0], tol );
     BOOST_CHECK_CLOSE( r[1], z[1], tol );
     BOOST_CHECK_EQUAL( r[2], z[2] );
-    BOOST_CHECK( isnan(r[3]) );
+    BOOST_CHECK( dai::isnan(r[3]) );
     BOOST_CHECK_CLOSE( r[4], z[4], tol );
     BOOST_CHECK_CLOSE( r[5], z[5], tol );
 
index a55f381..e7bf3d3 100644 (file)
@@ -138,7 +138,8 @@ BOOST_AUTO_TEST_CASE( IteratorTest ) {
         BOOST_CHECK_EQUAL( i, *rj );
         BOOST_CHECK_EQUAL( i, *rk );
     }
-    BOOST_CHECK( rj == x.rend() );
+
+    BOOST_CHECK( rj == static_cast<SmallSet<int>::const_reverse_iterator>(x.rend()) );
     BOOST_CHECK( rk == x.rend() );
 }
 
index 249351f..21dba60 100644 (file)
@@ -27,8 +27,8 @@ using namespace dai;
 
 BOOST_AUTO_TEST_CASE( IsNanTest ) {
     double x = 0.0, y = 0.0;
-    BOOST_CHECK( isnan( x / y ) );
-    BOOST_CHECK( !isnan( x ) );
+    BOOST_CHECK( dai::isnan( x / y ) );
+    BOOST_CHECK( !dai::isnan( x ) );
 }
 
 
index a482cc6..4ae7dff 100644 (file)
@@ -145,7 +145,7 @@ BOOST_AUTO_TEST_CASE( IteratorTest ) {
         BOOST_CHECK_EQUAL( i, rj->label() );
         BOOST_CHECK_EQUAL( i, rk->label() );
     }
-    BOOST_CHECK( rj == x.rend() );
+    BOOST_CHECK( rj == static_cast<VarSet::const_reverse_iterator>(x.rend()) );
     BOOST_CHECK( rk == x.rend() );
 }