Removed interfaces deprecated in 0.2.6
[libdai.git] / src / util.cpp
index 3b2f0a0..52e2215 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() {
@@ -69,27 +73,28 @@ typedef boost::minstd_rand _rnd_gen_type;  // Try boost::mt19937 or boost::ecuye
 _rnd_gen_type _rnd_gen(42U);
 
 /// Uniform distribution with values between 0 and 1 (0 inclusive, 1 exclusive).
-boost::uniform_real<> _uni_dist(0,1);
-
-/// Global uniform random random number
-boost::variate_generator<_rnd_gen_type&, boost::uniform_real<> > _uni_rnd(_rnd_gen, _uni_dist);
+boost::uniform_real<Real> _uni_dist(0,1);
 
 /// Normal distribution with mean 0 and standard deviation 1.
-boost::normal_distribution<> _normal_dist;
+boost::normal_distribution<Real> _normal_dist;
+
+/// Global uniform random random number
+boost::variate_generator<_rnd_gen_type&, boost::uniform_real<Real> > _uni_rnd(_rnd_gen, _uni_dist);
 
 /// Global random number generator with standard normal distribution
-boost::variate_generator<_rnd_gen_type&, boost::normal_distribution<> > _normal_rnd(_rnd_gen, _normal_dist);
+boost::variate_generator<_rnd_gen_type&, boost::normal_distribution<Real> > _normal_rnd(_rnd_gen, _normal_dist);
 
 
 void rnd_seed( size_t seed ) {
     _rnd_gen.seed(seed);
+    _normal_rnd.distribution().reset(); // needed for clearing the cache used in boost::normal_distribution
 }
 
-double rnd_uniform() {
+Real rnd_uniform() {
     return _uni_rnd();
 }
 
-double rnd_stdnormal() {
+Real rnd_stdnormal() {
     return _normal_rnd();
 }
 
@@ -97,15 +102,29 @@ 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())
+std::vector<std::string> tokenizeString( const std::string& s, bool singleDelim, const std::string& delim ) {
+    using namespace std;
+    vector<string> tokens;
+
+    string::size_type start = 0;
+    while( start < s.size() ) {
+        string::size_type end = s.find_first_of( delim, start );
+        if( end == string::npos )
             end = s.size();
-        outTokens.push_back(s.substr(start, end - start));
-        start = end + 1;
+
+        if( end == start && !singleDelim ) {
+            // skip to next non-delimiter
+            start = s.find_first_not_of( delim, start );
+            if( start == string::npos )
+                start = s.size();
+        } else { // we found a token
+            tokens.push_back( s.substr(start, end - start) );
+            start = end + 1;
+        }
     }
+
+    return tokens;
 }
 
+
 } // end of namespace dai