Improved documentation of bipgraph.h and added example_bipgraph.cpp
[libdai.git] / src / util.cpp
index bcad313..e37cb2b 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
     This file is part of libDAI.
 
     libDAI is free software; you can redistribute it and/or modify
 #include <boost/random/normal_distribution.hpp>
 #include <boost/random/variate_generator.hpp>
 
 #include <boost/random/normal_distribution.hpp>
 #include <boost/random/variate_generator.hpp>
 
+#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>
+#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
+
 
 namespace dai {
 
 
 
 namespace dai {
 
 
-clock_t toc() {
+// Returns user+system time in seconds
+double toc() {
+#ifdef WINDOWS
+    SYSTEMTIME  tbuf;
+    GetSystemTime(&tbuf);
+    return( (double)(tbuf.wSecond + (double)tbuf.wMilliseconds / 1000.0) );
+#else
     tms tbuf;
     times(&tbuf);
     tms tbuf;
     times(&tbuf);
-    return( tbuf.tms_utime );
+    return( (double)(tbuf.tms_utime + tbuf.tms_stime) / HZ );
+#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;
 
 // 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;
 
-_rnd_gen_type _rnd_gen(42);
+_rnd_gen_type _rnd_gen(42U);
 
 
-// Define a uniform random number distribution which produces "double"
+// Define a uniform random number distribution which produces
 // values between 0 and 1 (0 inclusive, 1 exclusive).
 boost::uniform_real<> _uni_dist(0,1);
 boost::variate_generator<_rnd_gen_type&, boost::uniform_real<> > _uni_rnd(_rnd_gen, _uni_dist);
 // values between 0 and 1 (0 inclusive, 1 exclusive).
 boost::uniform_real<> _uni_dist(0,1);
 boost::variate_generator<_rnd_gen_type&, boost::uniform_real<> > _uni_rnd(_rnd_gen, _uni_dist);
@@ -52,7 +83,7 @@ boost::normal_distribution<> _normal_dist;
 boost::variate_generator<_rnd_gen_type&, boost::normal_distribution<> > _normal_rnd(_rnd_gen, _normal_dist);
 
 
 boost::variate_generator<_rnd_gen_type&, boost::normal_distribution<> > _normal_rnd(_rnd_gen, _normal_dist);
 
 
-void rnd_seed( int seed ) {
+void rnd_seed( size_t seed ) {
     _rnd_gen.seed(seed);
 }
 
     _rnd_gen.seed(seed);
 }
 
@@ -64,5 +95,9 @@ double rnd_stdnormal() {
     return _normal_rnd();
 }
 
     return _normal_rnd();
 }
 
+int rnd_int( int min, int max ) {
+    return (int)floor(_uni_rnd() * (max + 1 - min) + min);
+}
+
 
 } // end of namespace dai
 
 } // end of namespace dai