index 7ce3362..b1378be 100644 (file)
#include <iostream>
#include <boost/foreach.hpp>
#include <boost/functional/hash.hpp>
+#include <boost/lexical_cast.hpp>
#include <algorithm>
+#include <cerrno>
+
+#include <dai/exceptions.h>

#if defined(WINDOWS)
@@ -61,9 +65,6 @@

#ifdef WINDOWS
-    /// Returns true if argument is NAN (Not A Number)
-    bool isnan( double x );
-
/// Returns inverse hyperbolic tangent of argument
double atanh( double x );

@@ -81,6 +82,9 @@ namespace dai {
/// Real number (alias for \c double, which could be changed to <tt>long double</tt> if necessary)
typedef double Real;

+/// Returns true if argument is NAN (Not A Number)
+bool isnan( Real x );
+
/// Returns logarithm of \a x
inline Real log( Real x ) {
return std::log(x);
@@ -96,8 +100,13 @@ inline Real exp( Real x ) {
return std::exp(x);
}

-/// Returns maximum value of a std::vector<Real>
-Real max( const std::vector<Real> &v );
+/// Returns \a to the power \a y
+inline Real pow( Real x, Real y ) {
+    errno = 0;
+    Real result = std::pow(x, y);
+    DAI_DEBASSERT( errno == 0 );
+    return result;
+}

/// hash_map is an alias for \c std::tr1::unordered_map.
@@ -136,6 +145,20 @@ inline int rnd( int n ) {
}

+/// Converts a variable of type \a T to a \c std::string by using a \c boost::lexical_cast
+template<class T>
+std::string toString( const T& x ) {
+    return boost::lexical_cast<std::string>(x);
+}
+
+
+/// Converts a variable of type std::string to \a T by using a \c boost::lexical_cast
+template<class T>
+T fromString( const std::string& x ) {
+    return boost::lexical_cast<T>(x);
+}
+
+
/// Writes a \c std::vector<> to a \c std::ostream
template<class T>
std::ostream& operator << (std::ostream& os, const std::vector<T> & x) {
@@ -186,9 +209,38 @@ std::vector<T> concat( const std::vector<T>& u, const std::vector<T>& v ) {
}

/// Split a string into tokens delimited by one of the characters in \a delim
+/** \param s the string to be split into tokens
+ *  \param singleDelim if \c true, any single delimiter forms a boundary between two tokens;
+ *         if \c false, a maximal group of consecutive delimiters forms a boundary between two tokens
+ *  \param delim delimiter characters
+ */
+std::vector<std::string> tokenizeString( const std::string& s, bool singleDelim, const std::string& delim="\t\n" );
+
+
+/// Split a string into tokens delimited by one of the characters in \a delim
+/** \deprecated Please use dai::tokenizeString( const std::string&, bool, const std::string& ) instead
+ */
void tokenizeString( const std::string& s, std::vector<std::string>& outTokens, const std::string& delim="\t\n" );

+/// Enumerates different ways of normalizing a probability measure.
+/**
+ *  - NORMPROB means that the sum of all entries should be 1;
+ *  - NORMLINF means that the maximum absolute value of all entries should be 1.
+ */
+typedef enum { NORMPROB, NORMLINF } ProbNormType;
+
+/// Enumerates different distance measures between probability measures.
+/**
+ *  - DISTL1 is the \f$\ell_1\f$ distance (sum of absolute values of pointwise difference);
+ *  - DISTLINF is the \f$\ell_\infty\f$ distance (maximum absolute value of pointwise difference);
+ *  - DISTTV is the total variation distance (half of the \f$\ell_1\f$ distance);
+ *  - DISTKL is the Kullback-Leibler distance (\f$\sum_i p_i (\log p_i - \log q_i)\f$).
+ *  - DISTHEL is the Hellinger distance (\f$\frac{1}{2}\sum_i (\sqrt{p_i}-\sqrt{q_i})^2\f$).
+ */
+typedef enum { DISTL1, DISTLINF, DISTTV, DISTKL, DISTHEL } ProbDistType;
+
+
} // end of namespace dai