Extended SWIG python interface (inspired by Kyle Ellrott): inference is possible...
[libdai.git] / tests / unit / prob_test.cpp
index e4a4ae0..f9215ef 100644 (file)
@@ -1,10 +1,8 @@
 /*  This file is part of libDAI - http://www.libdai.org/
  *
 /*  This file is part of libDAI - http://www.libdai.org/
  *
- *  libDAI is licensed under the terms of the GNU General Public License version
- *  2, or (at your option) any later version. libDAI is distributed without any
- *  warranty. See the file COPYING for more details.
+ *  Copyright (c) 2006-2011, The libDAI authors. All rights reserved.
  *
  *
- *  Copyright (C) 2010  Joris Mooij      [joris dot mooij at libdai dot org]
+ *  Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
  */
 
 
  */
 
 
@@ -120,7 +118,7 @@ BOOST_AUTO_TEST_CASE( IteratorTest ) {
         BOOST_CHECK_EQUAL( *it, (Real)(4 - i) );
 
     i = 0;
         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;
         BOOST_CHECK_EQUAL( *crit, (Real)i );
 
     i = 0;
@@ -128,7 +126,7 @@ BOOST_AUTO_TEST_CASE( IteratorTest ) {
         *rit = (Real)(2 * i);
     
     i = 0;
         *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
         BOOST_CHECK_EQUAL( *crit, (Real)2 * i );
 }
 #endif
@@ -140,8 +138,8 @@ BOOST_AUTO_TEST_CASE( QueriesTest ) {
         x.set( i, 2.0 - i );
 
     // test accumulate, min, max, sum, sumAbs, maxAbs
         x.set( i, 2.0 - i );
 
     // test accumulate, min, max, sum, sumAbs, maxAbs
-    BOOST_CHECK_CLOSE( x.sum(), (Real)0.0, tol );
-    BOOST_CHECK_CLOSE( x.accumulateSum( 0.0, fo_id<Real>() ), (Real)0.0, tol );
+    BOOST_CHECK_SMALL( x.sum(), tol );
+    BOOST_CHECK_SMALL( x.accumulateSum( 0.0, fo_id<Real>() ), tol );
     BOOST_CHECK_CLOSE( x.accumulateSum( 1.0, fo_id<Real>() ), (Real)1.0, tol );
     BOOST_CHECK_CLOSE( x.accumulateSum( -1.0, fo_id<Real>() ), (Real)-1.0, tol );
     BOOST_CHECK_CLOSE( x.max(), (Real)2.0, tol );
     BOOST_CHECK_CLOSE( x.accumulateSum( 1.0, fo_id<Real>() ), (Real)1.0, tol );
     BOOST_CHECK_CLOSE( x.accumulateSum( -1.0, fo_id<Real>() ), (Real)-1.0, tol );
     BOOST_CHECK_CLOSE( x.max(), (Real)2.0, tol );
@@ -274,14 +272,14 @@ BOOST_AUTO_TEST_CASE( UnaryTransformationsTest ) {
     Prob y = -x;
     Prob z = x.pwUnaryTr( std::negate<Real>() );
     BOOST_CHECK_CLOSE( y[0], (Real)2.0, tol );
     Prob y = -x;
     Prob z = x.pwUnaryTr( std::negate<Real>() );
     BOOST_CHECK_CLOSE( y[0], (Real)2.0, tol );
-    BOOST_CHECK_CLOSE( y[1], (Real)0.0, tol );
+    BOOST_CHECK_SMALL( y[1], tol );
     BOOST_CHECK_CLOSE( y[2], (Real)-2.0, tol );
     BOOST_CHECK( y == z );
 
     y = x.abs();
     z = x.pwUnaryTr( fo_abs<Real>() );
     BOOST_CHECK_CLOSE( y[0], (Real)2.0, tol );
     BOOST_CHECK_CLOSE( y[2], (Real)-2.0, tol );
     BOOST_CHECK( y == z );
 
     y = x.abs();
     z = x.pwUnaryTr( fo_abs<Real>() );
     BOOST_CHECK_CLOSE( y[0], (Real)2.0, tol );
-    BOOST_CHECK_CLOSE( y[1], (Real)0.0, tol );
+    BOOST_CHECK_SMALL( y[1], tol );
     BOOST_CHECK_CLOSE( y[2], (Real)2.0, tol );
     BOOST_CHECK( y == z );
 
     BOOST_CHECK_CLOSE( y[2], (Real)2.0, tol );
     BOOST_CHECK( y == z );
 
@@ -294,7 +292,7 @@ BOOST_AUTO_TEST_CASE( UnaryTransformationsTest ) {
 
     y = x.log(false);
     z = x.pwUnaryTr( fo_log<Real>() );
 
     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) );
     BOOST_CHECK_EQUAL( y[1], -INFINITY );
     BOOST_CHECK_CLOSE( y[2], dai::log((Real)2.0), tol );
     BOOST_CHECK( !(y == z) );
@@ -304,8 +302,8 @@ BOOST_AUTO_TEST_CASE( UnaryTransformationsTest ) {
 
     y = x.log(true);
     z = x.pwUnaryTr( fo_log0<Real>() );
 
     y = x.log(true);
     z = x.pwUnaryTr( fo_log0<Real>() );
-    BOOST_CHECK( isnan( y[0] ) );
-    BOOST_CHECK_CLOSE( y[1], (Real)0.0, tol );
+    BOOST_CHECK( dai::isnan( y[0] ) );
+    BOOST_CHECK_SMALL( y[1], tol );
     BOOST_CHECK_CLOSE( y[2], dai::log((Real)2.0), tol );
     BOOST_CHECK( !(y == z) );
     y.set( 0, 0.0 );
     BOOST_CHECK_CLOSE( y[2], dai::log((Real)2.0), tol );
     BOOST_CHECK( !(y == z) );
     y.set( 0, 0.0 );
@@ -322,25 +320,25 @@ BOOST_AUTO_TEST_CASE( UnaryTransformationsTest ) {
     y = x.inverse(true);
     z = x.pwUnaryTr( fo_inv0<Real>() );
     BOOST_CHECK_CLOSE( y[0], (Real)-0.5, tol );
     y = x.inverse(true);
     z = x.pwUnaryTr( fo_inv0<Real>() );
     BOOST_CHECK_CLOSE( y[0], (Real)-0.5, tol );
-    BOOST_CHECK_CLOSE( y[1], (Real)0.0, tol );
+    BOOST_CHECK_SMALL( y[1], tol );
     BOOST_CHECK_CLOSE( y[2], (Real)0.5, tol );
     BOOST_CHECK( y == z );
 
     x.set( 0, 2.0 );
     y = x.normalized();
     BOOST_CHECK_CLOSE( y[0], (Real)0.5, tol );
     BOOST_CHECK_CLOSE( y[2], (Real)0.5, tol );
     BOOST_CHECK( y == z );
 
     x.set( 0, 2.0 );
     y = x.normalized();
     BOOST_CHECK_CLOSE( y[0], (Real)0.5, tol );
-    BOOST_CHECK_CLOSE( y[1], (Real)0.0, tol );
+    BOOST_CHECK_SMALL( y[1], tol );
     BOOST_CHECK_CLOSE( y[2], (Real)0.5, tol );
 
     y = x.normalized( NORMPROB );
     BOOST_CHECK_CLOSE( y[0], (Real)0.5, tol );
     BOOST_CHECK_CLOSE( y[2], (Real)0.5, tol );
 
     y = x.normalized( NORMPROB );
     BOOST_CHECK_CLOSE( y[0], (Real)0.5, tol );
-    BOOST_CHECK_CLOSE( y[1], (Real)0.0, tol );
+    BOOST_CHECK_SMALL( y[1], tol );
     BOOST_CHECK_CLOSE( y[2], (Real)0.5, tol );
 
     x.set( 0, -2.0 );
     y = x.normalized( NORMLINF );
     BOOST_CHECK_CLOSE( y[0], (Real)-1.0, tol );
     BOOST_CHECK_CLOSE( y[2], (Real)0.5, tol );
 
     x.set( 0, -2.0 );
     y = x.normalized( NORMLINF );
     BOOST_CHECK_CLOSE( y[0], (Real)-1.0, tol );
-    BOOST_CHECK_CLOSE( y[1], (Real)0.0, tol );
+    BOOST_CHECK_SMALL( y[1], tol );
     BOOST_CHECK_CLOSE( y[2], (Real)1.0, tol );
 }
 
     BOOST_CHECK_CLOSE( y[2], (Real)1.0, tol );
 }
 
@@ -593,7 +591,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_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 );
     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 +601,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_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 );
     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 +662,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_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_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 );
 
     BOOST_CHECK_CLOSE( r[4], z[4], tol );
     BOOST_CHECK_CLOSE( r[5], z[5], tol );
 
@@ -706,32 +704,32 @@ BOOST_AUTO_TEST_CASE( RelatedFunctionsTest ) {
     BOOST_CHECK_EQUAL( z[1], (Real)0.8 );
     BOOST_CHECK_EQUAL( z[2], (Real)0.4 );
 
     BOOST_CHECK_EQUAL( z[1], (Real)0.8 );
     BOOST_CHECK_EQUAL( z[2], (Real)0.4 );
 
-    BOOST_CHECK_CLOSE( dist( x, x, DISTL1 ), (Real)0.0, tol );
-    BOOST_CHECK_CLOSE( dist( y, y, DISTL1 ), (Real)0.0, tol );
+    BOOST_CHECK_SMALL( dist( x, x, DISTL1 ), tol );
+    BOOST_CHECK_SMALL( dist( y, y, DISTL1 ), tol );
     BOOST_CHECK_CLOSE( dist( x, y, DISTL1 ), (Real)(0.2 + 0.2 + 0.4), tol );
     BOOST_CHECK_CLOSE( dist( y, x, DISTL1 ), (Real)(0.2 + 0.2 + 0.4), tol );
     BOOST_CHECK_CLOSE( dist( x, y, DISTL1 ), x.innerProduct( y, 0.0, std::plus<Real>(), fo_absdiff<Real>() ), tol );
     BOOST_CHECK_CLOSE( dist( y, x, DISTL1 ), y.innerProduct( x, 0.0, std::plus<Real>(), fo_absdiff<Real>() ), tol );
     BOOST_CHECK_CLOSE( dist( x, y, DISTL1 ), (Real)(0.2 + 0.2 + 0.4), tol );
     BOOST_CHECK_CLOSE( dist( y, x, DISTL1 ), (Real)(0.2 + 0.2 + 0.4), tol );
     BOOST_CHECK_CLOSE( dist( x, y, DISTL1 ), x.innerProduct( y, 0.0, std::plus<Real>(), fo_absdiff<Real>() ), tol );
     BOOST_CHECK_CLOSE( dist( y, x, DISTL1 ), y.innerProduct( x, 0.0, std::plus<Real>(), fo_absdiff<Real>() ), tol );
-    BOOST_CHECK_CLOSE( dist( x, x, DISTLINF ), (Real)0.0, tol );
-    BOOST_CHECK_CLOSE( dist( y, y, DISTLINF ), (Real)0.0, tol );
+    BOOST_CHECK_SMALL( dist( x, x, DISTLINF ), tol );
+    BOOST_CHECK_SMALL( dist( y, y, DISTLINF ), tol );
     BOOST_CHECK_CLOSE( dist( x, y, DISTLINF ), (Real)0.4, tol );
     BOOST_CHECK_CLOSE( dist( y, x, DISTLINF ), (Real)0.4, tol );
     BOOST_CHECK_CLOSE( dist( x, y, DISTLINF ), x.innerProduct( y, 0.0, fo_max<Real>(), fo_absdiff<Real>() ), tol );
     BOOST_CHECK_CLOSE( dist( y, x, DISTLINF ), y.innerProduct( x, 0.0, fo_max<Real>(), fo_absdiff<Real>() ), tol );
     BOOST_CHECK_CLOSE( dist( x, y, DISTLINF ), (Real)0.4, tol );
     BOOST_CHECK_CLOSE( dist( y, x, DISTLINF ), (Real)0.4, tol );
     BOOST_CHECK_CLOSE( dist( x, y, DISTLINF ), x.innerProduct( y, 0.0, fo_max<Real>(), fo_absdiff<Real>() ), tol );
     BOOST_CHECK_CLOSE( dist( y, x, DISTLINF ), y.innerProduct( x, 0.0, fo_max<Real>(), fo_absdiff<Real>() ), tol );
-    BOOST_CHECK_CLOSE( dist( x, x, DISTTV ), (Real)0.0, tol );
-    BOOST_CHECK_CLOSE( dist( y, y, DISTTV ), (Real)0.0, tol );
+    BOOST_CHECK_SMALL( dist( x, x, DISTTV ), tol );
+    BOOST_CHECK_SMALL( dist( y, y, DISTTV ), tol );
     BOOST_CHECK_CLOSE( dist( x, y, DISTTV ), (Real)(0.5 * (0.2 + 0.2 + 0.4)), tol );
     BOOST_CHECK_CLOSE( dist( y, x, DISTTV ), (Real)(0.5 * (0.2 + 0.2 + 0.4)), tol );
     BOOST_CHECK_CLOSE( dist( x, y, DISTTV ), x.innerProduct( y, 0.0, std::plus<Real>(), fo_absdiff<Real>() ) / 2.0, tol );
     BOOST_CHECK_CLOSE( dist( y, x, DISTTV ), y.innerProduct( x, 0.0, std::plus<Real>(), fo_absdiff<Real>() ) / 2.0, tol );
     BOOST_CHECK_CLOSE( dist( x, y, DISTTV ), (Real)(0.5 * (0.2 + 0.2 + 0.4)), tol );
     BOOST_CHECK_CLOSE( dist( y, x, DISTTV ), (Real)(0.5 * (0.2 + 0.2 + 0.4)), tol );
     BOOST_CHECK_CLOSE( dist( x, y, DISTTV ), x.innerProduct( y, 0.0, std::plus<Real>(), fo_absdiff<Real>() ) / 2.0, tol );
     BOOST_CHECK_CLOSE( dist( y, x, DISTTV ), y.innerProduct( x, 0.0, std::plus<Real>(), fo_absdiff<Real>() ) / 2.0, tol );
-    BOOST_CHECK_CLOSE( dist( x, x, DISTKL ), (Real)0.0, tol );
-    BOOST_CHECK_CLOSE( dist( y, y, DISTKL ), (Real)0.0, tol );
+    BOOST_CHECK_SMALL( dist( x, x, DISTKL ), tol );
+    BOOST_CHECK_SMALL( dist( x, x, DISTKL ), tol );
     BOOST_CHECK_EQUAL( dist( x, y, DISTKL ), INFINITY );
     BOOST_CHECK_EQUAL( dist( y, x, DISTKL ), INFINITY );
     BOOST_CHECK_EQUAL( dist( x, y, DISTKL ), x.innerProduct( y, 0.0, std::plus<Real>(), fo_KL<Real>() ) );
     BOOST_CHECK_EQUAL( dist( y, x, DISTKL ), y.innerProduct( x, 0.0, std::plus<Real>(), fo_KL<Real>() ) );
     BOOST_CHECK_EQUAL( dist( x, y, DISTKL ), INFINITY );
     BOOST_CHECK_EQUAL( dist( y, x, DISTKL ), INFINITY );
     BOOST_CHECK_EQUAL( dist( x, y, DISTKL ), x.innerProduct( y, 0.0, std::plus<Real>(), fo_KL<Real>() ) );
     BOOST_CHECK_EQUAL( dist( y, x, DISTKL ), y.innerProduct( x, 0.0, std::plus<Real>(), fo_KL<Real>() ) );
-    BOOST_CHECK_CLOSE( dist( x, x, DISTHEL ), (Real)0.0, tol );
-    BOOST_CHECK_CLOSE( dist( y, y, DISTHEL ), (Real)0.0, tol );
+    BOOST_CHECK_SMALL( dist( x, x, DISTHEL ), tol );
+    BOOST_CHECK_SMALL( dist( y, y, DISTHEL ), tol );
     BOOST_CHECK_CLOSE( dist( x, y, DISTHEL ), (Real)(0.5 * (0.2 + dai::pow(std::sqrt(0.8) - std::sqrt(0.6), 2.0) + 0.4)), tol );
     BOOST_CHECK_CLOSE( dist( y, x, DISTHEL ), (Real)(0.5 * (0.2 + dai::pow(std::sqrt(0.8) - std::sqrt(0.6), 2.0) + 0.4)), tol );
     BOOST_CHECK_CLOSE( dist( x, y, DISTHEL ), x.innerProduct( y, 0.0, std::plus<Real>(), fo_Hellinger<Real>() ) / 2.0, tol );
     BOOST_CHECK_CLOSE( dist( x, y, DISTHEL ), (Real)(0.5 * (0.2 + dai::pow(std::sqrt(0.8) - std::sqrt(0.6), 2.0) + 0.4)), tol );
     BOOST_CHECK_CLOSE( dist( y, x, DISTHEL ), (Real)(0.5 * (0.2 + dai::pow(std::sqrt(0.8) - std::sqrt(0.6), 2.0) + 0.4)), tol );
     BOOST_CHECK_CLOSE( dist( x, y, DISTHEL ), x.innerProduct( y, 0.0, std::plus<Real>(), fo_Hellinger<Real>() ) / 2.0, tol );
@@ -753,18 +751,20 @@ BOOST_AUTO_TEST_CASE( RelatedFunctionsTest ) {
     std::string s;
     std::getline( ss, s );
 #ifdef DAI_SPARSE
     std::string s;
     std::getline( ss, s );
 #ifdef DAI_SPARSE
-    BOOST_CHECK_EQUAL( s, std::string("(size:4, def:0.25, 0:0.2, 1:0.7, 2:0.1)") );
+    BOOST_CHECK_EQUAL( s, "(size:4, def:0.25, 0:0.2, 1:0.7, 2:0.1)" );
 #else
 #else
-    BOOST_CHECK_EQUAL( s, std::string("(0.2, 0.7, 0.1, 0.25)") );
+    BOOST_CHECK_EQUAL( s, "(0.2, 0.7, 0.1, 0.25)" );
 #endif
 #endif
+    BOOST_CHECK_EQUAL( xx.toString(), s );
     std::stringstream ss2;
     ss2 << yy;
     std::getline( ss2, s );
 #ifdef DAI_SPARSE
     std::stringstream ss2;
     ss2 << yy;
     std::getline( ss2, s );
 #ifdef DAI_SPARSE
-    BOOST_CHECK_EQUAL( s, std::string("(size:4, def:0.25, 0:0.1, 1:0.5, 2:0.4)") );
+    BOOST_CHECK_EQUAL( s, "(size:4, def:0.25, 0:0.1, 1:0.5, 2:0.4)" );
 #else
 #else
-    BOOST_CHECK_EQUAL( s, std::string("(0.1, 0.5, 0.4, 0.25)") );
+    BOOST_CHECK_EQUAL( s, "(0.1, 0.5, 0.4, 0.25)" );
 #endif
 #endif
+    BOOST_CHECK_EQUAL( yy.toString(), s );
 
     z = min( x, y );
     BOOST_CHECK_EQUAL( z[0], (Real)0.1 );
 
     z = min( x, y );
     BOOST_CHECK_EQUAL( z[0], (Real)0.1 );