Fixed tabs and trailing whitespaces
[libdai.git] / include / dai / util.h
index a45d274..accc90c 100644 (file)
 #define __defined_libdai_util_h
 
 
+#include <string>
 #include <vector>
 #include <set>
 #include <map>
 #include <iostream>
-#include <cstdio>
 #include <boost/foreach.hpp>
 #include <boost/functional/hash.hpp>
 #include <algorithm>
 #ifdef DAI_DEBUG
 /// \brief "Print variable". Prints the text of an expression, followed by its value (only if DAI_DEBUG is defined)
 /**
- *  Useful debugging macro to see what your code is doing. 
+ *  Useful debugging macro to see what your code is doing.
  *  Example: \code DAI_PV(3+4) \endcode
- */ Output: \code 3+4= 7 \endcode
+ *  Output: \code 3+4= 7 \endcode
+ */
 #define DAI_PV(x) do {std::cerr << #x "= " << (x) << std::endl;} while(0)
 /// "Debugging message": Prints a message (only if DAI_DEBUG is defined)
 #define DAI_DMSG(str) do {std::cerr << str << std::endl;} while(0)
+/// Assertion if DAI_DEBUG is defined
+#define DAI_DEBASSERT(x) do {assert(x);} while(0)
 #else
 #define DAI_PV(x) do {} while(0)
 #define DAI_DMSG(str) do {} while(0)
+#define DAI_DEBASSERT(X) do {} while(0)
 #endif
 
 /// Produces accessor and mutator methods according to the common pattern.
 /** Example:
  *  \code DAI_ACCMUT(size_t& maxIter(), { return props.maxiter; }); \endcode
  *  \todo At the moment, only the mutator appears in doxygen documentation.
+ */
 #define DAI_ACCMUT(x,y)                     \
       x y;                                  \
       const x const y;
@@ -130,9 +135,14 @@ double rnd_stdnormal();
 /// Returns a random integer in interval [min, max]
 int rnd_int( int min, int max );
 
+/// Returns a random integer in the half-open interval \f$[0,n)\f$
+inline int rnd( int n) {
+    return rnd_int( 0, n-1 );
+}
+
 
 /// Writes a std::vector to a std::ostream
-template<class T> 
+template<class T>
 std::ostream& operator << (std::ostream& os, const std::vector<T> & x) {
     os << "(";
     for( typename std::vector<T>::const_iterator it = x.begin(); it != x.end(); it++ )
@@ -142,7 +152,7 @@ std::ostream& operator << (std::ostream& os, const std::vector<T> & x) {
 }
 
 /// Writes a std::set to a std::ostream
-template<class T> 
+template<class T>
 std::ostream& operator << (std::ostream& os, const std::set<T> & x) {
     os << "{";
    for( typename std::set<T>::const_iterator it = x.begin(); it != x.end(); it++ )
@@ -170,7 +180,7 @@ std::ostream& operator << (std::ostream& os, const std::pair<T1,T2> & x) {
 
 /// Concatenate two vectors
 template<class T>
-std::vector<T> concata (const std::vector<T>& u, const std::vector<T>& v ) {
+std::vector<T> concatconst std::vector<T>& u, const std::vector<T>& v ) {
     std::vector<T> w;
     w.reserve( u.size() + v.size() );
     for( size_t i = 0; i < u.size(); i++ )
@@ -180,6 +190,9 @@ std::vector<T> concata (const std::vector<T>& u, const std::vector<T>& v ) {
     return w;
 }
 
+/// Split a string into tokens
+void tokenizeString( const std::string& s, std::vector<std::string>& outTokens, const std::string& delim="\t\n" );
+
 /// Used to keep track of the progress made by iterative algorithms
 class Diffs : public std::vector<double> {
     private:
@@ -189,17 +202,17 @@ class Diffs : public std::vector<double> {
         std::vector<double>::iterator _maxpos;
     public:
         /// Constructor
-        Diffs(long maxsize, double def) : std::vector<double>(), _maxsize(maxsize), _def(def) { 
-            this->reserve(_maxsize); 
-            _pos = begin(); 
-            _maxpos = begin(); 
+        Diffs(long maxsize, double def) : std::vector<double>(), _maxsize(maxsize), _def(def) {
+            this->reserve(_maxsize);
+            _pos = begin();
+            _maxpos = begin();
         }
         /// Returns maximum difference encountered
-        double maxDiff() { 
+        double maxDiff() {
             if( size() < _maxsize )
                 return _def;
             else
-                return( *_maxpos ); 
+                return( *_maxpos );
         }
         /// Register new difference x
         void push(double x) {
@@ -214,12 +227,11 @@ class Diffs : public std::vector<double> {
                 } else {
                     _maxpos = begin();
                 }
-            }
-            else {
+            } else {
                 if( _pos == end() )
                     _pos = begin();
                 if( _maxpos == _pos ) {
-                    *_pos++ = x; 
+                    *_pos++ = x;
                     _maxpos = max_element(begin(),end());
                 } else {
                     if( x > *_maxpos )