libDAI
util.h
Go to the documentation of this file.
1 /* This file is part of libDAI - http://www.libdai.org/
2  *
3  * Copyright (c) 2006-2011, The libDAI authors. All rights reserved.
4  *
5  * Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
6  */
7 
8 
11 
12 
13 #ifndef __defined_libdai_util_h
14 #define __defined_libdai_util_h
15 
16 
17 #include <string>
18 #include <vector>
19 #include <set>
20 #include <map>
21 #include <iostream>
22 #include <boost/foreach.hpp>
23 #include <boost/functional/hash.hpp>
24 #include <boost/lexical_cast.hpp>
25 #include <algorithm>
26 #include <cerrno>
27 
28 #if defined(WINDOWS)
29 #include <cstdint> // only defined in C++11 and higher, but needed for Win64 builds in order to enable conditional code in MPIR library
30 #endif
31 #include <gmpxx.h>
32 
33 #include <dai/exceptions.h>
34 
35 
36 #if defined(WINDOWS)
37  #include <boost/tr1/unordered_map.hpp> // only present in boost 1.37 and higher
38 #elif defined(CYGWIN)
39  #include <boost/tr1/unordered_map.hpp> // only present in boost 1.37 and higher
40 #elif defined(MACOSX)
41  #include <boost/tr1/unordered_map.hpp> // only present in boost 1.37 and higher
42 #else
43  #include <tr1/unordered_map> // only present in modern GCC distributions
44 #endif
45 
46 
48 #define bforeach BOOST_FOREACH
49 
50 #ifdef DAI_DEBUG
51 
57 #define DAI_PV(x) do {std::cerr << #x "= " << (x) << std::endl;} while(0)
58 #define DAI_DMSG(str) do {std::cerr << str << std::endl;} while(0)
60 #else
61 #define DAI_PV(x) do {} while(0)
62 #define DAI_DMSG(str) do {} while(0)
63 #endif
64 
66 #define DAI_IFVERB(n, stmt) if(props.verbose>=n) { std::cerr << stmt; }
67 
68 
69 #ifdef WINDOWS
70  double atanh( double x );
72 
74  double log1p( double x );
75 
77  #define INFINITY (std::numeric_limits<Real>::infinity())
78 
80  #define NAN (std::numeric_limits<Real>::quiet_NaN())
81 
82  #if defined(_MSC_VER)
83  // Disable unsafe warning (use of the function 'strcpy' instead of
84  // 'strcpy_s' for portability reasons;
85  #pragma warning( disable : 4996 )
86  // Workaround for the char16_t type defined in Matlab and MSVC 2010
87  #if (_MSC_VER >= 1600)
88  #define __STDC_UTF_16__
89  #endif
90  #endif
91 #endif
92 
93 
94 namespace dai {
95 
96 
98 typedef double Real;
99 
101 typedef mpz_class BigInt;
102 
104 inline size_t BigInt_size_t( const BigInt &N ) {
105  DAI_ASSERT( N <= (BigInt)std::numeric_limits<size_t>::max() );
106  return N.get_ui();
107 }
108 
110 bool isnan( Real x );
111 
113 inline Real log( Real x ) {
114  return std::log(x);
115 }
116 
118 inline Real log0( Real x ) {
119  return x ? std::log(x) : 0;
120 }
121 
123 inline Real exp( Real x ) {
124  return std::exp(x);
125 }
126 
128 
132 inline Real pow( Real x, Real y ) {
133  errno = 0;
134  if( x == 0.0 && y < 0.0 )
135  return 0.0;
136  Real result = std::pow(x, y);
137  DAI_DEBASSERT( errno == 0 );
138  return result;
139 }
140 
141 
143 
145 template <typename T, typename U, typename H = boost::hash<T> >
146  class hash_map : public std::tr1::unordered_map<T,U,H> {};
147 
148 
150 double toc();
151 
152 
154 template<class T>
155 inline T abs( const T &t ) {
156  return (t < 0) ? (-t) : t;
157 }
158 
159 
161 void rnd_seed( size_t seed );
162 
164 Real rnd_uniform();
165 
167 Real rnd_stdnormal();
168 
170 int rnd_int( int min, int max );
171 
173 inline int rnd( int n ) {
174  return rnd_int( 0, n-1 );
175 }
176 
177 
179 template<class T>
180 std::string toString( const T& x ) {
181  return boost::lexical_cast<std::string>(x);
182 }
183 
184 
186 template<class T>
187 T fromString( const std::string& x ) {
188  return boost::lexical_cast<T>(x);
189 }
190 
191 
193 template<class T>
194 std::ostream& operator << (std::ostream& os, const std::vector<T> & x) {
195  os << "(";
196  for( typename std::vector<T>::const_iterator it = x.begin(); it != x.end(); it++ )
197  os << (it != x.begin() ? ", " : "") << *it;
198  os << ")";
199  return os;
200 }
201 
203 template<class T>
204 std::ostream& operator << (std::ostream& os, const std::set<T> & x) {
205  os << "{";
206  for( typename std::set<T>::const_iterator it = x.begin(); it != x.end(); it++ )
207  os << (it != x.begin() ? ", " : "") << *it;
208  os << "}";
209  return os;
210 }
211 
213 template<class T1, class T2>
214 std::ostream& operator << (std::ostream& os, const std::map<T1,T2> & x) {
215  os << "{";
216  for( typename std::map<T1,T2>::const_iterator it = x.begin(); it != x.end(); it++ )
217  os << (it != x.begin() ? ", " : "") << it->first << "->" << it->second;
218  os << "}";
219  return os;
220 }
221 
223 template<class T1, class T2>
224 std::ostream& operator << (std::ostream& os, const std::pair<T1,T2> & x) {
225  os << "(" << x.first << ", " << x.second << ")";
226  return os;
227 }
228 
230 template<class T>
231 std::vector<T> concat( const std::vector<T>& u, const std::vector<T>& v ) {
232  std::vector<T> w;
233  w.reserve( u.size() + v.size() );
234  for( size_t i = 0; i < u.size(); i++ )
235  w.push_back( u[i] );
236  for( size_t i = 0; i < v.size(); i++ )
237  w.push_back( v[i] );
238  return w;
239 }
240 
242 
247 std::vector<std::string> tokenizeString( const std::string& s, bool singleDelim, const std::string& delim="\t\n" );
248 
249 
251 
255 typedef enum { NORMPROB, NORMLINF } ProbNormType;
256 
258 
265 typedef enum { DISTL1, DISTLINF, DISTTV, DISTKL, DISTHEL } ProbDistType;
266 
267 
268 } // end of namespace dai
269 
270 
271 #endif
size_t BigInt_size_t(const BigInt &N)
Safe down-cast of big integer to size_t.
Definition: util.h:104
ProbNormType
Enumerates different ways of normalizing a probability measure.
Definition: util.h:255
Real pow(Real x, Real y)
Returns x to the power y.
Definition: util.h:132
ProbDistType
Enumerates different distance measures between probability measures.
Definition: util.h:265
Real log(Real x)
Returns logarithm of x.
Definition: util.h:113
Real rnd_stdnormal()
Returns a real number from a standard-normal distribution.
Definition: util.cpp:91
std::vector< std::string > tokenizeString(const std::string &s, bool singleDelim, const std::string &delim)
Split a string into tokens delimited by one of the characters in delim.
Definition: util.cpp:99
int rnd_int(int min, int max)
Returns a random integer in interval [min, max].
Definition: util.cpp:95
std::string toString(const T &x)
Converts a variable of type T to a std::string by using a boost::lexical_cast.
Definition: util.h:180
double Real
Real number (alias for double, which could be changed to long double if necessary) ...
Definition: util.h:98
T abs(const T &t)
Returns absolute value of t.
Definition: util.h:155
void rnd_seed(size_t seed)
Sets the random seed.
Definition: util.cpp:82
mpz_class BigInt
Arbitrary precision integer number.
Definition: util.h:101
bool isnan(Real x)
Returns true if argument is NAN (Not A Number)
Definition: util.cpp:44
int rnd(int n)
Returns a random integer in the half-open interval [0, n)
Definition: util.h:173
Defines the Exception class and macros for throwing exceptions and doing assertions.
T fromString(const std::string &x)
Converts a variable of type std::string to T by using a boost::lexical_cast.
Definition: util.h:187
Real log0(Real x)
Returns logarithm of x, or 0 if x == 0.
Definition: util.h:118
std::vector< T > concat(const std::vector< T > &u, const std::vector< T > &v)
Concatenates two vectors.
Definition: util.h:231
double toc()
Returns wall clock time in seconds.
Definition: util.cpp:50
hash_map is an alias for std::tr1::unordered_map.
Definition: util.h:146
Namespace for libDAI.
Definition: alldai.cpp:16
#define DAI_ASSERT(condition)
Assertion mechanism, similar to the standard assert() macro. It is always active, even if NDEBUG is d...
Definition: exceptions.h:60
#define DAI_DEBASSERT(x)
Assertion mechanism similar to DAI_ASSERT which is only active if DAI_DEBUG is defined.
Definition: exceptions.h:65
Real rnd_uniform()
Returns a real number, distributed uniformly on [0,1)
Definition: util.cpp:87
Real exp(Real x)
Returns exponent of x.
Definition: util.h:123