1 /* Copyright (C) 2009 Charles Vaske [cvaske at soe dot ucsc dot edu]
2 University of California Santa Cruz
4 This file is part of libDAI.
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.
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.
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
27 #include <dai/evidence.h>
33 void SampleData::addObservation( Var node
, size_t setting
) {
38 void SampleData::applyEvidence( InfAlg
& alg
) const {
39 std::map
<Var
, size_t>::const_iterator i
= _obs
.begin();
40 for( ; i
!= _obs
.end(); ++i
)
41 alg
.clamp( i
->first
, i
->second
);
45 void Evidence::addEvidenceTabFile( std::istream
& is
, FactorGraph
& fg
) {
46 std::map
<std::string
, Var
> varMap
;
47 std::vector
<Var
>::const_iterator v
= fg
.vars().begin();
48 for( ; v
!= fg
.vars().end(); ++v
) {
54 addEvidenceTabFile( is
, varMap
);
58 void Evidence::addEvidenceTabFile( std::istream
& is
, std::map
<std::string
, Var
>& varMap
) {
59 std::vector
<std::string
> header_fields
;
60 std::vector
<Var
> vars
;
65 tokenizeString( line
, header_fields
);
66 std::vector
<std::string
>::const_iterator p_field
= header_fields
.begin();
68 if( p_field
== header_fields
.end() )
69 DAI_THROW(INVALID_EVIDENCE_LINE
);
71 ++p_field
; // first column are sample labels
72 for( ; p_field
!= header_fields
.end(); ++p_field
) {
73 std::map
<std::string
, Var
>::iterator elem
= varMap
.find( *p_field
);
74 if( elem
== varMap
.end() )
75 DAI_THROW(INVALID_EVIDENCE_FILE
);
76 vars
.push_back( elem
->second
);
80 while( getline(is
, line
) ) {
81 std::vector
<std::string
> fields
;
83 tokenizeString( line
, fields
);
85 if( fields
.size() != vars
.size() + 1 )
86 DAI_THROW(INVALID_EVIDENCE_LINE
);
88 SampleData
& sampleData
= _samples
[fields
[0]];
89 sampleData
.name( fields
[0] ); // in case of a new sample
90 for( size_t i
= 0; i
< vars
.size(); ++i
) {
91 if( fields
[i
+1].size() > 0 ) { // skip if missing observation
92 if( fields
[i
+1].find_first_not_of("0123456789") != std::string::npos
)
93 DAI_THROW(INVALID_EVIDENCE_OBSERVATION
);
94 size_t state
= atoi( fields
[i
+1].c_str() );
95 if( state
>= vars
[i
].states() )
96 DAI_THROW(INVALID_EVIDENCE_OBSERVATION
);
97 sampleData
.addObservation( vars
[i
], state
);
100 } // finished sample line
104 } // end of namespace dai