Fixed testem failure caused by rounding error
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Tue, 21 Jul 2009 11:35:19 +0000 (13:35 +0200)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Tue, 21 Jul 2009 11:35:19 +0000 (13:35 +0200)
Makefile
include/dai/emalg.h
include/dai/evidence.h
include/dai/factorgraph.h
src/factorgraph.cpp
tests/testem/testem.cpp
tests/testem/testem.out

index a67eed1..37732cb 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -202,6 +202,7 @@ tests/testdai$(EE) : tests/testdai.cpp $(HEADERS) $(LIB)/libdai$(LE)
 tests/testem/testem$(EE) : tests/testem/testem.cpp $(HEADERS) $(LIB)/libdai$(LE)
        $(CC) $(CCO)$@ $< $(LIBS) $(BOOSTLIBS)
 
+
 # MATLAB INTERFACE
 ###################
 
index 44bd289..1e353ff 100644 (file)
@@ -127,7 +127,7 @@ class CondProbEstimation : private ParameterEstimation {
  *  canonical variable ordering.  This canonical variable ordering
  *  will likely not be the order of variables required to make two
  *  factors parameters isomorphic.  Therefore, this ordering of the
- *  variables must be specified for ever factor to ensure that
+ *  variables must be specified for ever factory to ensure that
  *  parameters can be shared between different factors during EM.
  */
 class SharedParameters {
@@ -181,7 +181,7 @@ class MaximizationStep {
     public:
         MaximizationStep() : _params() {}
 
-        /// Construct an step object taht contains all these estimation probelms
+        /// Construct an step object that contains all these estimation problems
         MaximizationStep( std::vector<SharedParameters>& maximizations ) : _params(maximizations) {}  
 
         /// Construct a step from an input stream
index 6c0ff26..25ae67d 100644 (file)
@@ -62,18 +62,16 @@ class Evidence {
         Evidence() : _samples() {}
       
         /** Read in tab-data from a stream. Each line contains one sample, and
-         *  the first line is a header line with names. The first column contains
-         *  names for each of the samples.
+         *  the first line is a header line with names.
          */
         void addEvidenceTabFile(std::istream& is, std::map<std::string, Var>& varMap);
 
         /** Read in tab-data from a stream. Each line contains one sample,
-         *  and the first line is a header line with variable IDs. The first
-         *  column contains names for each of the samples.
+         *  and the first line is a header line with variable labels. 
          */
         void addEvidenceTabFile(std::istream& is, FactorGraph& fg);
       
-        /// Total number of samples in this evidence file
+        /// Returns total number of samples
         size_t nrSamples() const { return _samples.size(); }
 
         /// @name iterator interface
index a3f5d40..e0cdb1a 100644 (file)
@@ -244,7 +244,7 @@ class FactorGraph {
         void ReadFromFile(const char *filename);
 
         /// Writes a FactorGraph to a file
-        void WriteToFile(const char *filename) const;
+        void WriteToFile(const char *filename, size_t precision=15) const;
 
         /// Writes a FactorGraph to a GraphViz .dot file
         void printDot( std::ostream& os ) const;
index 57614c2..87bbe47 100644 (file)
@@ -21,6 +21,7 @@
 
 
 #include <iostream>
+#include <iomanip>
 #include <iterator>
 #include <map>
 #include <set>
@@ -100,11 +101,8 @@ ostream& operator << (ostream& os, const FactorGraph& fg) {
                 nr_nonzeros++;
         os << nr_nonzeros << endl;
         for( size_t k = 0; k < fg.factor(I).states(); k++ )
-            if( fg.factor(I)[k] != 0.0 ) {
-                char buf[20];
-                sprintf(buf,"%18.14g", fg.factor(I)[k]);
-                os << k << " " << buf << endl;
-            }
+            if( fg.factor(I)[k] != 0.0 )
+                os << k << " " << setw(os.precision()+4) << fg.factor(I)[k] << endl;
     }
 
     return(os);
@@ -268,10 +266,11 @@ void FactorGraph::ReadFromFile( const char *filename ) {
 }
 
 
-void FactorGraph::WriteToFile( const char *filename ) const {
+void FactorGraph::WriteToFile( const char *filename, size_t precision ) const {
     ofstream outfile;
     outfile.open( filename );
     if( outfile.is_open() ) {
+        outfile.precision( precision );
         outfile << *this;
         outfile.close();
     } else
index 0fef4c9..74e5c99 100644 (file)
@@ -1,3 +1,24 @@
+/*  Copyright (C) 2009  Charles Vaske  [cvaske at soe dot ucsc dot edu]
+    University of California Santa Cruz
+
+    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
+*/
+
+
 #include <iostream>
 #include <fstream>
 #include <string>
@@ -24,8 +45,7 @@ int main( int argc, char** argv ) {
       usage("Incorrect number of arguments.");
     
     FactorGraph fg;
-    ifstream fgstream( argv[1] );
-    fgstream >> fg;
+    fg.ReadFromFile( argv[1] );
 
     PropertySet infprops;
     infprops.Set( "verbose", (size_t)1 );
@@ -50,7 +70,9 @@ int main( int argc, char** argv ) {
         cout << "Iteration " << em.getCurrentIters() << " likelihood: " << l <<endl;
     }
 
-    cout << endl << "Inferred Factor Graph:" << endl << "######################" << endl << inf->fg();
+    cout << endl << "Inferred Factor Graph:" << endl << "######################" << endl;
+    cout.precision(12);
+    cout << inf->fg();
 
     return 0;
 }
index 9637392..5e777cb 100644 (file)
@@ -1,24 +1,24 @@
 Number of samples: 20
-Sample sample.0 has 2 observations.
-Sample sample.1 has 2 observations.
-Sample sample.2 has 2 observations.
-Sample sample.3 has 2 observations.
-Sample sample.4 has 2 observations.
-Sample sample.5 has 2 observations.
-Sample sample.6 has 2 observations.
-Sample sample.7 has 2 observations.
-Sample sample.8 has 2 observations.
-Sample sample.9 has 2 observations.
-Sample sample_0 has 2 observations.
-Sample sample_1 has 2 observations.
-Sample sample_2 has 2 observations.
-Sample sample_3 has 2 observations.
-Sample sample_4 has 2 observations.
-Sample sample_5 has 2 observations.
-Sample sample_6 has 2 observations.
-Sample sample_7 has 2 observations.
-Sample sample_8 has 2 observations.
-Sample sample_9 has 2 observations.
+Sample #0 has 2 observations.
+Sample #1 has 2 observations.
+Sample #2 has 2 observations.
+Sample #3 has 2 observations.
+Sample #4 has 2 observations.
+Sample #5 has 2 observations.
+Sample #6 has 2 observations.
+Sample #7 has 2 observations.
+Sample #8 has 2 observations.
+Sample #9 has 2 observations.
+Sample #10 has 2 observations.
+Sample #11 has 2 observations.
+Sample #12 has 2 observations.
+Sample #13 has 2 observations.
+Sample #14 has 2 observations.
+Sample #15 has 2 observations.
+Sample #16 has 2 observations.
+Sample #17 has 2 observations.
+Sample #18 has 2 observations.
+Sample #19 has 2 observations.
 Iteration 1 likelihood: -13.8629
 Iteration 2 likelihood: -9.56675
 Iteration 3 likelihood: -9.56675
@@ -31,31 +31,31 @@ Inferred Factor Graph:
 0 1 
 2 2 
 4
-0   0.16666666666667
-1   0.66666666666667
-2   0.83333333333333
-3   0.33333333333333
+0   0.166666666667
+1   0.666666666667
+2   0.833333333333
+3   0.333333333333
 Number of samples: 20
-Sample sample.0 has 2 observations.
-Sample sample.1 has 2 observations.
-Sample sample.2 has 2 observations.
-Sample sample.3 has 2 observations.
-Sample sample.4 has 2 observations.
-Sample sample.5 has 2 observations.
-Sample sample.6 has 2 observations.
-Sample sample.7 has 2 observations.
-Sample sample.8 has 2 observations.
-Sample sample.9 has 2 observations.
-Sample sample_0 has 2 observations.
-Sample sample_1 has 2 observations.
-Sample sample_2 has 2 observations.
-Sample sample_3 has 2 observations.
-Sample sample_4 has 2 observations.
-Sample sample_5 has 2 observations.
-Sample sample_6 has 2 observations.
-Sample sample_7 has 2 observations.
-Sample sample_8 has 2 observations.
-Sample sample_9 has 2 observations.
+Sample #0 has 2 observations.
+Sample #1 has 2 observations.
+Sample #2 has 2 observations.
+Sample #3 has 2 observations.
+Sample #4 has 2 observations.
+Sample #5 has 2 observations.
+Sample #6 has 2 observations.
+Sample #7 has 2 observations.
+Sample #8 has 2 observations.
+Sample #9 has 2 observations.
+Sample #10 has 2 observations.
+Sample #11 has 2 observations.
+Sample #12 has 2 observations.
+Sample #13 has 2 observations.
+Sample #14 has 2 observations.
+Sample #15 has 2 observations.
+Sample #16 has 2 observations.
+Sample #17 has 2 observations.
+Sample #18 has 2 observations.
+Sample #19 has 2 observations.
 Iteration 1 likelihood: 0
 Iteration 2 likelihood: 3.97035
 Iteration 3 likelihood: 3.97035
@@ -68,20 +68,20 @@ Inferred Factor Graph:
 0 1 2 
 2 2 2 
 8
-0   0.21428571428571
-1   0.64285714285714
-2   0.78571428571429
-3   0.35714285714286
-4   0.21428571428571
-5   0.64285714285714
-6   0.78571428571429
-7   0.35714285714286
+0   0.214285714286
+1   0.642857142857
+2   0.785714285714
+3   0.357142857143
+4   0.214285714286
+5   0.642857142857
+6   0.785714285714
+7   0.357142857143
 Number of samples: 5
-Sample sample_0 has 5 observations.
-Sample sample_1 has 4 observations.
-Sample sample_2 has 6 observations.
-Sample sample_3 has 6 observations.
-Sample sample_4 has 5 observations.
+Sample #0 has 5 observations.
+Sample #1 has 4 observations.
+Sample #2 has 6 observations.
+Sample #3 has 6 observations.
+Sample #4 has 5 observations.
 Iteration 1 likelihood: 11.1646
 Iteration 2 likelihood: 1.53723
 Iteration 3 likelihood: 1.64691
@@ -96,46 +96,46 @@ Inferred Factor Graph:
 2 6 7 
 2 2 2 
 8
-0   0.39834336080566
-1   0.35146414656547
-2   0.60165663919434
-3   0.64853585343454
-4   0.80484468795651
-5   0.67374245802992
-6   0.19515531204349
-7   0.32625754197008
+0   0.398343360806
+1   0.351464146565
+2   0.601656639194
+3   0.648535853435
+4   0.804844687957
+5    0.67374245803
+6   0.195155312043
+7    0.32625754197
 
 3
 0 1 6 
 2 2 2 
 8
-0    1.0352133626924
-1     1.547478952122
-2    2.3176521897449
-3    1.2804190071868
-4    4.9220798130027
-5    2.5272557501946
-6   0.83127929631575
-7   0.26280563080263
+0    1.03521336269
+1    1.54747895212
+2    2.31765218974
+3    1.28041900719
+4      4.922079813
+5    2.52725575019
+6   0.831279296316
+7   0.262805630803
 
 3
 1 2 4 
 2 2 2 
 8
-0   0.39834336080566
-1   0.60165663919434
-2   0.35146414656547
-3   0.64853585343454
-4   0.80484468795651
-5   0.19515531204349
-6   0.67374245802992
-7   0.32625754197008
+0   0.398343360806
+1   0.601656639194
+2   0.351464146565
+3   0.648535853435
+4   0.804844687957
+5   0.195155312043
+6    0.67374245803
+7    0.32625754197
 Number of samples: 5
-Sample sample_0 has 5 observations.
-Sample sample_1 has 4 observations.
-Sample sample_2 has 6 observations.
-Sample sample_3 has 6 observations.
-Sample sample_4 has 5 observations.
+Sample #0 has 5 observations.
+Sample #1 has 4 observations.
+Sample #2 has 6 observations.
+Sample #3 has 6 observations.
+Sample #4 has 5 observations.
 Iteration 1 likelihood: 11.1646
 Iteration 2 likelihood: -7.29331
 Iteration 3 likelihood: -7.261
@@ -148,37 +148,37 @@ Inferred Factor Graph:
 2 6 7 
 2 2 2 
 8
-0   0.49531219972645
-1   0.49910794290825
-2   0.50468780027355
-3   0.50089205709175
-4   0.64041654995841
-5   0.49512229392399
-6   0.35958345004159
-7   0.50487770607601
+0   0.495312199726
+1   0.499107942908
+2   0.504687800274
+3   0.500892057092
+4   0.640416549958
+5   0.495122293924
+6   0.359583450042
+7   0.504877706076
 
 3
 0 1 6 
 2 2 2 
 8
-0   0.49531219972645
-1   0.50468780027355
-2   0.49910794290825
-3   0.50089205709175
-4   0.64041654995841
-5   0.35958345004159
-6   0.49512229392399
-7   0.50487770607601
+0   0.495312199726
+1   0.504687800274
+2   0.499107942908
+3   0.500892057092
+4   0.640416549958
+5   0.359583450042
+6   0.495122293924
+7   0.504877706076
 
 3
 1 2 4 
 2 2 2 
 8
-0   0.49531219972645
-1   0.50468780027355
-2   0.49910794290825
-3   0.50089205709175
-4   0.64041654995841
-5   0.35958345004159
-6   0.49512229392399
-7   0.50487770607601
+0   0.495312199726
+1   0.504687800274
+2   0.499107942908
+3   0.500892057092
+4   0.640416549958
+5   0.359583450042
+6   0.495122293924
+7   0.504877706076