libDAI
factorgraph.h
Go to the documentation of this file.
1 /* This file is part of libDAI - http://www.libdai.org/
2  *
3  * Copyright (c) 2006-2011, The libDAI authors. All rights reserved.
4  *
5  * Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
6  */
7 
8 
11 
12 
13 #ifndef __defined_libdai_factorgraph_h
14 #define __defined_libdai_factorgraph_h
15 
16 
17 #include <iostream>
18 #include <map>
19 #include <dai/bipgraph.h>
20 #include <dai/graph.h>
21 #include <dai/factor.h>
22 
23 
24 namespace dai {
25 
26 
28 
65 class FactorGraph {
66  private:
70  std::vector<Var> _vars;
72  std::vector<Factor> _factors;
74  std::map<size_t,Factor> _backup;
75 
76  public:
78 
79 
80  FactorGraph() : _G(), _vars(), _factors(), _backup() {}
81 
83  FactorGraph( const std::vector<Factor>& P );
84 
86 
90  template<typename FactorInputIterator, typename VarInputIterator>
91  FactorGraph(FactorInputIterator facBegin, FactorInputIterator facEnd, VarInputIterator varBegin, VarInputIterator varEnd, size_t nrFacHint = 0, size_t nrVarHint = 0 );
92 
94  virtual ~FactorGraph() {}
95 
97  virtual FactorGraph* clone() const { return new FactorGraph(*this); }
99 
101 
102 
103  const Var& var( size_t i ) const {
104  DAI_DEBASSERT( i < nrVars() );
105  return _vars[i];
106  }
107 
109  const std::vector<Var>& vars() const { return _vars; }
110 
112  const Factor& factor( size_t I ) const {
113  DAI_DEBASSERT( I < nrFactors() );
114  return _factors[I];
115  }
117  const std::vector<Factor>& factors() const { return _factors; }
118 
120  const Neighbors& nbV( size_t i ) const { return _G.nb1(i); }
122  const Neighbors& nbF( size_t I ) const { return _G.nb2(I); }
124  const Neighbor& nbV( size_t i, size_t _I ) const { return _G.nb1(i)[_I]; }
126  const Neighbor& nbF( size_t I, size_t _i ) const { return _G.nb2(I)[_i]; }
128 
130 
131 
132  const BipartiteGraph& bipGraph() const { return _G; }
134  size_t nrVars() const { return vars().size(); }
136  size_t nrFactors() const { return factors().size(); }
138 
140  size_t nrEdges() const { return _G.nrEdges(); }
141 
143 
146  size_t findVar( const Var& n ) const {
147  size_t i = find( vars().begin(), vars().end(), n ) - vars().begin();
148  if( i == nrVars() )
149  DAI_THROW(OBJECT_NOT_FOUND);
150  return i;
151  }
152 
154 
157  SmallSet<size_t> findVars( const VarSet& ns ) const {
158  SmallSet<size_t> result;
159  for( VarSet::const_iterator n = ns.begin(); n != ns.end(); n++ )
160  result.insert( findVar( *n ) );
161  return result;
162  }
163 
165 
168  size_t findFactor( const VarSet& ns ) const {
169  size_t I;
170  for( I = 0; I < nrFactors(); I++ )
171  if( factor(I).vars() == ns )
172  break;
173  if( I == nrFactors() )
174  DAI_THROW(OBJECT_NOT_FOUND);
175  return I;
176  }
177 
179  VarSet Delta( size_t i ) const;
180 
182  VarSet Delta( const VarSet& vs ) const;
183 
185  VarSet delta( size_t i ) const {
186  return( Delta( i ) / var( i ) );
187  }
188 
190  VarSet delta( const VarSet& vs ) const {
191  return Delta( vs ) / vs;
192  }
193 
195  bool isConnected() const { return _G.isConnected(); }
196 
198  bool isTree() const { return _G.isTree(); }
199 
201  bool isPairwise() const;
202 
204  bool isBinary() const;
205 
207 
210  GraphAL MarkovGraph() const;
211 
213 
216  bool isMaximal( size_t I ) const;
217 
219 
222  size_t maximalFactor( size_t I ) const;
223 
225 
228  std::vector<VarSet> maximalFactorDomains() const;
229 
231  Real logScore( const std::vector<size_t>& statevec ) const;
233 
235 
236 
237  virtual void setFactor( size_t I, const Factor& newFactor, bool backup = false ) {
238  DAI_ASSERT( newFactor.vars() == factor(I).vars() );
239  if( backup )
240  backupFactor( I );
241  _factors[I] = newFactor;
242  }
243 
245  virtual void setFactors( const std::map<size_t, Factor>& facs, bool backup = false ) {
246  for( std::map<size_t, Factor>::const_iterator fac = facs.begin(); fac != facs.end(); fac++ ) {
247  if( backup )
248  backupFactor( fac->first );
249  setFactor( fac->first, fac->second );
250  }
251  }
252 
254 
256  void backupFactor( size_t I );
257 
259 
261  void restoreFactor( size_t I );
262 
264 
266  virtual void backupFactors( const std::set<size_t>& facs );
267 
269  virtual void restoreFactors();
270 
272 
274  void backupFactors( const VarSet& ns );
275 
277  void restoreFactors( const VarSet& ns );
279 
281 
282 
283  FactorGraph maximalFactors() const;
284 
286 
289  FactorGraph clamped( size_t i, size_t x ) const;
291 
293 
294 
295 
297  virtual void clamp( size_t i, size_t x, bool backup = false );
298 
300 
302  void clampVar( size_t i, const std::vector<size_t>& xis, bool backup = false );
303 
305 
307  void clampFactor( size_t I, const std::vector<size_t>& xIs, bool backup = false );
308 
310 
312  virtual void makeCavity( size_t i, bool backup = false );
314 
316 
317 
318 
322  virtual void ReadFromFile( const char *filename );
323 
325 
328  virtual void WriteToFile( const char *filename, size_t precision=15 ) const;
329 
331 
333  friend std::ostream& operator<< (std::ostream& os, const FactorGraph& fg );
334 
336 
339  friend std::istream& operator>> (std::istream& is, FactorGraph& fg );
340 
342  virtual void printDot( std::ostream& os ) const;
344 
345  private:
347  void constructGraph( size_t nrEdges );
348 };
349 
350 
351 template<typename FactorInputIterator, typename VarInputIterator>
352 FactorGraph::FactorGraph(FactorInputIterator facBegin, FactorInputIterator facEnd, VarInputIterator varBegin, VarInputIterator varEnd, size_t nrFacHint, size_t nrVarHint ) : _G(), _backup() {
353  // add factors
354  size_t nrEdges = 0;
355  _factors.reserve( nrFacHint );
356  for( FactorInputIterator p2 = facBegin; p2 != facEnd; ++p2 ) {
357  _factors.push_back( *p2 );
358  nrEdges += p2->vars().size();
359  }
360 
361  // add variables
362  _vars.reserve( nrVarHint );
363  for( VarInputIterator p1 = varBegin; p1 != varEnd; ++p1 )
364  _vars.push_back( *p1 );
365 
366  // create graph structure
367  constructGraph( nrEdges );
368 }
369 
370 
377 } // end of namespace dai
378 
379 
380 #endif