Miscellaneous smaller improvements
[libdai.git] / src / util.cpp
index b5e1d34..54eae31 100644 (file)
@@ -1,23 +1,12 @@
-/*  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
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    libDAI is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with libDAI; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-*/
+/*  This file is part of libDAI - http://www.libdai.org/
+ *
+ *  libDAI is licensed under the terms of the GNU General Public License version
+ *  2, or (at your option) any later version. libDAI is distributed without any
+ *  warranty. See the file COPYING for more details.
+ *
+ *  Copyright (C) 2006-2009  Joris Mooij  [joris dot mooij at libdai dot org]
+ *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
+ */
 
 
 #include <dai/util.h>
@@ -59,6 +48,13 @@ double log1p( double x ) {
 namespace dai {
 
 
+Real max( const std::vector<Real> &v ) {
+    if( v.size() == 0 )
+        return INFINITY;
+    else
+        return *std::max_element( v.begin(), v.end() );
+}
+
 // Returns user+system time in seconds
 double toc() {
 #ifdef WINDOWS
@@ -73,31 +69,34 @@ double toc() {
 #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;
+/// Type of global random number generator
+typedef boost::minstd_rand _rnd_gen_type;  // Try boost::mt19937 or boost::ecuyer1988 instead of boost::minstd_rand
 
+/// Global random number generator
 _rnd_gen_type _rnd_gen(42U);
 
-// 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);
+/// Uniform distribution with values between 0 and 1 (0 inclusive, 1 exclusive).
+boost::uniform_real<Real> _uni_dist(0,1);
+
+/// Global uniform random random number
+boost::variate_generator<_rnd_gen_type&, boost::uniform_real<Real> > _uni_rnd(_rnd_gen, _uni_dist);
+
+/// Normal distribution with mean 0 and standard deviation 1.
+boost::normal_distribution<Real> _normal_dist;
 
-// Define a normal distribution with mean 0 and standard deviation 1.
-boost::normal_distribution<> _normal_dist;
-boost::variate_generator<_rnd_gen_type&, boost::normal_distribution<> > _normal_rnd(_rnd_gen, _normal_dist);
+/// Global random number generator with standard normal distribution
+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);
 }
 
-double rnd_uniform() {
+Real rnd_uniform() {
     return _uni_rnd();
 }
 
-double rnd_stdnormal() {
+Real rnd_stdnormal() {
     return _normal_rnd();
 }
 
@@ -105,10 +104,7 @@ 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)
-{
+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);