Some small changes
authorJoris Mooij <jorism@tuebingen.mpg.de>
Fri, 14 Nov 2008 15:52:50 +0000 (16:52 +0100)
committerJoris Mooij <jorism@tuebingen.mpg.de>
Fri, 14 Nov 2008 15:52:50 +0000 (16:52 +0100)
- Improved constructors of TProb and TFactor to use iterators instead of pointers
- Added TProb::draw() function, which draws a random index
- Fixed whitespace in tests/testdai.cpp

include/dai/factor.h
include/dai/prob.h
src/bipgraph.cpp
tests/testdai.cpp

index bee1ca6..10d4f15 100644 (file)
@@ -81,8 +81,13 @@ template <typename T> class TFactor {
         /// Constructs TFactor depending on variables in ns, with all values set to p
         TFactor( const VarSet& ns, Real p ) : _vs(ns), _p(_vs.nrStates(),p) {}
         
-        /// Constructs TFactor depending on variables in ns, copying the values from the array p
-        TFactor( const VarSet& ns, const Real *p ) : _vs(ns), _p(_vs.nrStates(),p) {}
+        /// Constructs TFactor depending on variables in ns, copying the values from the range starting at begin
+        /** \param ns contains the variables that the new TFactor should depend on.
+         *  \tparam Iterator Iterates over instances of type T; should support addition of size_t.
+         *  \param begin Points to first element to be added.
+         */
+        template<typename TIterator>
+        TFactor( const VarSet& ns, TIterator begin ) : _vs(ns), _p(begin, begin + _vs.nrStates(), _vs.nrStates()) {}
 
         /// Constructs TFactor depending on variables in ns, with values set to the TProb p
         TFactor( const VarSet& ns, const TProb<T>& p ) : _vs(ns), _p(p) {
index d165bfc..4d6ea84 100644 (file)
@@ -78,8 +78,17 @@ template <typename T> class TProb {
         /// Construct vector of length n with each entry set to p
         explicit TProb( size_t n, Real p ) : _p(n, (T)p) {}
         
-        /// Construct vector of length n by copying the elements between p and p+n
-        TProb( size_t n, const Real* p ) : _p(p, p + n ) {}
+        /// Construct vector from a range
+        /** \tparam Iterator Iterates over instances that can be cast to T.
+         *  \param begin Points to first instance to be added.
+         *  \param end Points just beyond last instance to be added.
+         *  \param sizeHint For efficiency, the number of elements can be speficied by sizeHint.
+         */
+        template <typename Iterator>
+        TProb( Iterator begin, Iterator end, size_t sizeHint=0 ) : _p() {
+            _p.reserve( sizeHint );
+            _p.insert( _p.begin(), begin, end );
+        }
         
         /// Returns a const reference to the vector
         const std::vector<T> & p() const { return _p; }
@@ -442,6 +451,18 @@ template <typename T> class TProb {
                 S -= (_p[i] == 0 ? 0 : _p[i] * std::log(_p[i]));
             return S;
         }
+
+        /// Returns a random index, according to the (normalized) distribution described by *this
+        size_t draw() {
+            double x = rnd_uniform() * totalSum();
+            T s = 0;
+            for( size_t i = 0; i < size(); i++ ) {
+                s += _p[i];
+                if( s > x ) 
+                    return i;
+            }
+            return( size() - 1 );
+        }
 };
 
 
index 2c5f4b3..4a12326 100644 (file)
@@ -110,6 +110,9 @@ std::vector<size_t> BipartiteGraph::delta2( size_t n2, bool include ) const {
 
 
 bool BipartiteGraph::isConnected() const {
+    // TODO: use BGL, like:
+    // std::vector<int> component( num_vertices( g ) );
+    // int num_comp = connected_components( g, make_iterator_property_map(component.begin(), get(vertex_index, g)) );
     if( nr1() == 0 ) {
         return true;
     } else {
index dfb14ab..57d8342 100644 (file)
@@ -282,7 +282,7 @@ int main( int argc, char *argv[] ) {
         cout.width( 39 );
         cout << left << "# METHOD" << "\t";
         if( report_time )
-            cout << right << "SECONDS" << "\t";
+            cout << right << "SECONDS  " << "\t";
         if( report_iters )
             cout << "ITERS" << "\t";
         cout << "MAX ERROR" << "\t";