Renamed SampleData->Observation, changed Observation and Evidence
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Thu, 16 Jul 2009 07:25:38 +0000 (09:25 +0200)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Thu, 16 Jul 2009 07:25:38 +0000 (09:25 +0200)
by removing Observation::_name and changing the Evidence::_samples
variable from map<string,Observation> to vector<Observation>

include/dai/emalg.h
include/dai/evidence.h
src/emalg.cpp
src/evidence.cpp
tests/testem/2var_data.tab
tests/testem/hoi1_data.tab
tests/testem/testem.cpp

index 24d44b5..44bd289 100644 (file)
@@ -106,7 +106,7 @@ class CondProbEstimation : private ParameterEstimation {
     virtual ~CondProbEstimation() {}
     /// Returns an estimate of the conditional probability distribution.
     /** The format of the resulting Prob keeps all the values for 
-     *  \f$ P(X | Y=a) \f$ sequential in teh array.
+     *  \f$ P(X | Y=a) \f$ sequential in the array.
      */
     virtual Prob estimate();
     /// Accumulate sufficient statistics from the expectations in p.
@@ -205,7 +205,7 @@ class MaximizationStep {
  *     - InfAlg for performing the E-step, which includes the factor graph
  *     - a vector of MaximizationSteps steps to be performed
  *
- *  This implementation can peform incremental EM by using multiple 
+ *  This implementation can perform incremental EM by using multiple 
  *  MaximizationSteps.  An expectation step is performed between execution
  *  of each MaximizationStep.  A call to iterate() will cycle through all
  *  MaximizationSteps.
index 77e790a..6c0ff26 100644 (file)
@@ -20,7 +20,7 @@
 
 
 /// \file
-/// \brief Defines classes Evidence and SampleData
+/// \brief Defines classes Evidence and Observation
 /// \todo Improve documentation
 
 
 namespace dai {
 
 
-/// Stores a set of observations on a graphical model.
-class SampleData {
+/// Stores observed values of a subset of variables
+class Observation {
     private:
-        std::string _name;
         std::map<Var, size_t> _obs;
+
     public:
-        /// Construct an empty object
-        SampleData() : _name(), _obs() {}
-        /// Set the name of the sample
-        void name(const std::string& name) { _name = name; }
-        /// Get the name of the sample
-        const std::string& name() const { return _name; }
-        /// Read from the observation map
+        /// Default constructor
+        Observation() : _obs() {}
+        /// Get all observations
         const std::map<Var, size_t>& observations() const { return _obs; }
         /// Add an observation
-        void addObservation(Var node, size_t setting);
-        /// Add evidence by clamping variables to observed values.
-        void applyEvidence(InfAlg& alg) const;
+        void addObservation( Var node, size_t setting );
+        /// Clamp variables to observed values
+        void applyEvidence( InfAlg& alg ) const;
 };
 
 
-/// Store observations from a graphical model.
+/// Stores multiple observations of variables
 class Evidence {
     private:
-        std::map<std::string, SampleData> _samples;
-public:
-    /// Start with empty obects, then fill with calls to addEvidenceTabFile()
-    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.
-     */
-    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.
-     */
-    void addEvidenceTabFile(std::istream& is, FactorGraph& fg);
-  
-    /// Total number of samples in this evidence file
-    size_t nrSamples() const { return _samples.size(); }
-
-    /// @name iterator interface
-    //@{
-    typedef std::map< std::string, SampleData >::iterator iterator;
-    typedef std::map< std::string, SampleData >::const_iterator const_iterator;
-    iterator begin() { return _samples.begin(); }
-    const_iterator begin() const { return _samples.begin(); }
-    iterator end() { return _samples.end(); }
-    const_iterator end() const { return _samples.end(); }
-    //@}
+        std::vector<Observation> _samples;
+
+    public:
+        /// Default constructor
+        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.
+         */
+        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.
+         */
+        void addEvidenceTabFile(std::istream& is, FactorGraph& fg);
+      
+        /// Total number of samples in this evidence file
+        size_t nrSamples() const { return _samples.size(); }
+
+        /// @name iterator interface
+        //@{
+        typedef std::vector<Observation>::iterator iterator;
+        typedef std::vector<Observation>::const_iterator const_iterator;
+
+        iterator begin() { return _samples.begin(); }
+        const_iterator begin() const { return _samples.begin(); }
+        iterator end() { return _samples.end(); }
+        const_iterator end() const { return _samples.end(); }
+        //@}
 };
 
 
index e2ec61f..0831599 100644 (file)
@@ -319,7 +319,7 @@ Real EMAlg::iterate(MaximizationStep& mstep) {
     // Expectation calculation
     for ( ; e != _evidence.end(); ++e) {
         InfAlg* clamped = _estep.clone();
-        e->second.applyEvidence(*clamped);
+        e->applyEvidence(*clamped);
         clamped->run();
       
         logZ += clamped->logZ();
index 40c9f0d..ec852ae 100644 (file)
 namespace dai {
 
 
-void SampleData::addObservation( Var node, size_t setting ) {
+void Observation::addObservation( Var node, size_t setting ) {
     _obs[node] = setting;
 }
 
 
-void SampleData::applyEvidence( InfAlg& alg ) const {
+void Observation::applyEvidence( InfAlg& alg ) const {
     std::map<Var, size_t>::const_iterator i = _obs.begin();
     for( ; i != _obs.end(); ++i )
         alg.clamp( i->first, i->second );
@@ -68,7 +68,6 @@ void Evidence::addEvidenceTabFile( std::istream& is, std::map<std::string, Var>&
     if( p_field == header_fields.end() ) 
         DAI_THROW(INVALID_EVIDENCE_LINE);
 
-    ++p_field; // first column are sample labels
     for( ; p_field != header_fields.end(); ++p_field ) {
         std::map<std::string, Var>::iterator elem = varMap.find( *p_field );
         if( elem == varMap.end() )
@@ -82,21 +81,21 @@ void Evidence::addEvidenceTabFile( std::istream& is, std::map<std::string, Var>&
 
         tokenizeString( line, fields );
         
-        if( fields.size() != vars.size() + 1 
+        if( fields.size() != vars.size() ) 
             DAI_THROW(INVALID_EVIDENCE_LINE);
         
-        SampleData& sampleData = _samples[fields[0]];
-        sampleData.name( fields[0] ); // in case of a new sample
+        Observation sampleData;
         for( size_t i = 0; i < vars.size(); ++i ) {
-            if( fields[i+1].size() > 0 ) { // skip if missing observation
-                if( fields[i+1].find_first_not_of("0123456789") != std::string::npos )
+            if( fields[i].size() > 0 ) { // skip if missing observation
+                if( fields[i].find_first_not_of("0123456789") != std::string::npos )
                     DAI_THROW(INVALID_EVIDENCE_OBSERVATION);
-                size_t state = atoi( fields[i+1].c_str() );
+                size_t state = atoi( fields[i].c_str() );
                 if( state >= vars[i].states() )
                     DAI_THROW(INVALID_EVIDENCE_OBSERVATION);
                 sampleData.addObservation( vars[i], state );
             }
         }
+        _samples.push_back( sampleData );
     } // finished sample line
 }
 
index 1b7593b..e59a890 100644 (file)
@@ -1,21 +1,21 @@
-sample_id      0       1
-sample_0       0       1
-sample_1       0       1
-sample_2       0       1
-sample_3       0       1
-sample_4       0       1
-sample_5       0       1
-sample_6       0       1
-sample_7       0       1
-sample_8       0       1
-sample_9       0       0
-sample.0       1       1
-sample.1       1       1
-sample.2       1       1
-sample.3       1       0
-sample.4       1       0
-sample.5       1       0
-sample.6       1       0
-sample.7       1       0
-sample.8       1       0
-sample.9       1       0
\ No newline at end of file
+0      1
+0      1
+0      1
+0      1
+0      1
+0      1
+0      1
+0      1
+0      1
+0      1
+0      0
+1      1
+1      1
+1      1
+1      0
+1      0
+1      0
+1      0
+1      0
+1      0
+1      0
index b103867..ad5f220 100644 (file)
@@ -1,6 +1,6 @@
-sample_id      0       1       2       4       6       7
-sample_0       0       0       1               1       0
-sample_1       1                       1       1       0
-sample_2       0       1       0       0       0       1
-sample_3       0       0       0       1       0       0
-sample_4       1       0       0               1       0
+0      1       2       4       6       7
+0      0       1               1       0
+1                      1       1       0
+0      1       0       0       0       1
+0      0       0       1       0       0
+1      0       0               1       0
index cfa172a..0fef4c9 100644 (file)
@@ -40,7 +40,7 @@ int main( int argc, char** argv ) {
     cout << "Number of samples: " << e.nrSamples() << endl;
     Evidence::iterator ps = e.begin();
     for( ; ps != e.end(); ps++ )
-        cout << "Sample " << ps->first << " has " << ps->second.observations().size() << " observations." << endl;
+        cout << "Sample #" << (ps - e.begin()) << " has " << ps->observations().size() << " observations." << endl;
 
     ifstream emstream( argv[3] );
     EMAlg em(e, *inf, emstream);