Fixed testem failure caused by rounding error
[libdai.git] / src / util.cpp
index 18596ee..b5e1d34 100644 (file)
@@ -1,6 +1,7 @@
-/*  Copyright (C) 2006-2008  Joris Mooij  [j dot mooij at science dot ru dot nl]
-    Radboud University Nijmegen, The Netherlands
-    
+/*  Copyright (C) 2006-2008  Joris Mooij  [joris dot mooij at tuebingen dot mpg dot de]
+    Radboud University Nijmegen, The Netherlands /
+    Max Planck Institute for Biological Cybernetics, Germany
+
     This file is part of libDAI.
 
     libDAI is free software; you can redistribute it and/or modify
 
 #ifdef WINDOWS
     #include <windows.h>
+    #include <boost/math/special_functions/atanh.hpp>  // for atanh
+    #include <boost/math/special_functions/log1p.hpp>  // for log1p
+    #include <float.h>  // for _isnan
 #else
-    // Assume POSIX compliant system. We need the following for querying the CPU time for this process
-    #include <sys/times.h>
-    #include <sys/param.h>
+    // Assume POSIX compliant system. We need the following for querying the system time
+    #include <sys/time.h>
+#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 );
+}
+double log1p( double x ) {
+    return boost::math::log1p( x );
+}
 #endif
 
 
@@ -40,17 +62,17 @@ namespace dai {
 // Returns user+system time in seconds
 double toc() {
 #ifdef WINDOWS
-    SYSTEMTIME  tbuf;
+    SYSTEMTIME tbuf;
     GetSystemTime(&tbuf);
     return( (double)(tbuf.wSecond + (double)tbuf.wMilliseconds / 1000.0) );
 #else
-    tms tbuf;
-    times(&tbuf);
-    return( (double)(tbuf.tms_utime + tbuf.tms_stime) / HZ );
+    struct timeval tv;
+    struct timezone tz;
+    gettimeofday( &tv, &tz );
+    return( (double)(tv.tv_sec + (double)tv.tv_usec / 1000000.0) );
 #endif
 }
 
-
 // This is a typedef for a random number generator.
 // Try boost::mt19937 or boost::ecuyer1988 instead of boost::minstd_rand
 typedef boost::minstd_rand _rnd_gen_type;
@@ -79,10 +101,22 @@ double rnd_stdnormal() {
     return _normal_rnd();
 }
 
-// Returns integer in interval [min, max]
 int rnd_int( int min, int max ) {
     return (int)floor(_uni_rnd() * (max + 1 - min) + min);
 }
 
+void tokenizeString(const std::string& s,
+                    std::vector<std::string>& outTokens,
+                    const std::string& delim)
+{
+    size_t start = 0;
+    while (start < s.size()) {
+        size_t end = s.find_first_of(delim, start);
+        if (end > s.size())
+            end = s.size();
+        outTokens.push_back(s.substr(start, end - start));
+        start = end + 1;
+    }
+}
 
 } // end of namespace dai