Merge branch 'vaske'
[libdai.git] / include / dai / evidence.h
1 /* Copyright (C) 2009 Charles Vaske [cvaske at soe dot ucsc dot edu]
2 University of California Santa Cruz
3
4 This file is part of libDAI.
5
6 libDAI is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 libDAI is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with libDAI; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21
22 /// \file
23 /// \brief Defines classes Evidence and Observation
24 /// \todo Describe tabular data file format
25
26
27 #ifndef __defined_libdai_evidence_h
28 #define __defined_libdai_evidence_h
29
30
31 #include <istream>
32 #include <dai/daialg.h>
33
34
35 namespace dai {
36
37
38 /// Stores observed values of a subset of variables
39 class Observation {
40 private:
41 /// Used to store the state of some variables
42 std::map<Var, size_t> _obs;
43
44 public:
45 /// Default constructor
46 Observation() : _obs() {}
47
48 /// Get all observations
49 const std::map<Var, size_t>& observations() const { return _obs; }
50
51 /// Add an observation
52 void addObservation( Var node, size_t setting );
53
54 /// Clamp variables in the graphical model to their observed values
55 void applyEvidence( InfAlg& alg ) const;
56 };
57
58
59 /// Stores multiple joint observations of sets of variables.
60 /** The Evidence class stores multiple samples, where each sample is the joint
61 * observation of the states of some variables.
62 */
63 class Evidence {
64 private:
65 /// Each sample is the joint observation of the states of some variables
66 std::vector<Observation> _samples;
67
68 public:
69 /// Default constructor
70 Evidence() : _samples() {}
71
72 /// Read in tabular data from a stream.
73 /** Each line contains one sample, and the first line is a header line with names.
74 */
75 void addEvidenceTabFile( std::istream& is, std::map<std::string, Var> &varMap );
76
77 /// Read in tabular data from a stream.
78 /** Each line contains one sample, and the first line is a header line with
79 * variable labels which should correspond with a subset of the variables in fg.
80 */
81 void addEvidenceTabFile( std::istream& is, FactorGraph& fg );
82
83 /// Returns number of stored samples
84 size_t nrSamples() const { return _samples.size(); }
85
86 /// @name Iterator interface
87 //@{
88 /// Iterator over the elements
89 typedef std::vector<Observation>::iterator iterator;
90 /// Constant iterator over the elements
91 typedef std::vector<Observation>::const_iterator const_iterator;
92
93 /// Returns iterator that points to the first element
94 iterator begin() { return _samples.begin(); }
95 /// Returns constant iterator that points to the first element
96 const_iterator begin() const { return _samples.begin(); }
97 /// Returns iterator that points beyond the last element
98 iterator end() { return _samples.end(); }
99 /// Returns constant iterator that points beyond the last element
100 const_iterator end() const { return _samples.end(); }
101 //@}
102 };
103
104
105 } // end of namespace dai
106
107
108 #endif