Merge branch 'vaskeEmFix' of git://disco.cse.ucsc.edu/libDAI into mergeVaskeEmFix
[libdai.git] / include / dai / factor.h
index 1427002..6b04966 100644 (file)
 #include <dai/prob.h>
 #include <dai/varset.h>
 #include <dai/index.h>
+#include <dai/util.h>
 
 
 namespace dai {
 
 
-/// Function object similar to std::divides(), but different in that dividing by zero results in zero
+// Function object similar to std::divides(), but different in that dividing by zero results in zero
 template<typename T> struct divides0 : public std::binary_function<T, T, T> {
+    // Returns (j == 0 ? 0 : (i/j))
     T operator()(const T& i, const T& j) const {
         if( j == (T)0 )
             return (T)0;
@@ -109,9 +111,7 @@ template <typename T> class TFactor {
 
         /// Constructs TFactor depending on variables in ns, with values set to the TProb p
         TFactor( const VarSet& ns, const TProb<T>& p ) : _vs(ns), _p(p) {
-#ifdef DAI_DEBUG
-            assert( _vs.nrStates() == _p.size() );
-#endif
+            DAI_DEBASSERT( _vs.nrStates() == _p.size() );
         }
         TFactor( const std::vector< Var >& vars, const std::vector< T >& p ) : _vs(vars.begin(), vars.end(), vars.size()), _p(p.size()) {
             Permute permindex(vars);
@@ -460,6 +460,7 @@ template<typename T> TFactor<T> TFactor<T>::maxMarginal(const VarSet & ns, bool
 }
 
 
+/// Apply binary operator pointwise on two factors
 template<typename T, typename binaryOp> TFactor<T> pointwiseOp( const TFactor<T> &f, const TFactor<T> &g, binaryOp op ) {
     if( f.vars() == g.vars() ) { // optimizate special case
         TFactor<T> result(f); 
@@ -481,11 +482,9 @@ template<typename T, typename binaryOp> TFactor<T> pointwiseOp( const TFactor<T>
 
 
 template<typename T> T TFactor<T>::strength( const Var &i, const Var &j ) const {
-#ifdef DAI_DEBUG
-    assert( _vs.contains( i ) );
-    assert( _vs.contains( j ) );
-    assert( i != j );
-#endif
+    DAI_DEBASSERT( _vs.contains( i ) );
+    DAI_DEBASSERT( _vs.contains( j ) );
+    DAI_DEBASSERT( i != j );
     VarSet ij(i, j);
 
     T max = 0.0;
@@ -531,9 +530,7 @@ template<typename T> Real dist( const TFactor<T> &f, const TFactor<T> &g, Prob::
     if( f.vars().empty() || g.vars().empty() )
         return -1;
     else {
-#ifdef DAI_DEBUG
-        assert( f.vars() == g.vars() );
-#endif
+        DAI_DEBASSERT( f.vars() == g.vars() );
         return dist( f.p(), g.p(), dt );
     }
 }