New git HEAD version
[libdai.git] / src / clustergraph.cpp
index 1b2722a..f899c4d 100644 (file)
@@ -1,11 +1,8 @@
 /*  This file is part of libDAI - http://www.libdai.org/
  *
- *  libDAI is licensed under the terms of the GNU General Public License version
- *  2, or (at your option) any later version. libDAI is distributed without any
- *  warranty. See the file COPYING for more details.
+ *  Copyright (c) 2006-2011, The libDAI authors. All rights reserved.
  *
- *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
- *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
+ *  Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
  */
 
 
@@ -25,7 +22,7 @@ using namespace std;
 ClusterGraph::ClusterGraph( const std::vector<VarSet> & cls ) : _G(), _vars(), _clusters() {
     // construct vars, clusters and edge list
     vector<Edge> edges;
-    foreach( const VarSet &cl, cls ) {
+    bforeach( const VarSet &cl, cls ) {
         if( find( clusters().begin(), clusters().end(), cl ) == clusters().end() ) {
             // add cluster
             size_t n2 = nrClusters();
@@ -45,19 +42,28 @@ ClusterGraph::ClusterGraph( const std::vector<VarSet> & cls ) : _G(), _vars(), _
 }
 
 
-ClusterGraph::ClusterGraph( const FactorGraph& fg, bool onlyMaximal ) : _G( fg.bipGraph() ), _vars(), _clusters() {
+ClusterGraph::ClusterGraph( const FactorGraph& fg, bool onlyMaximal ) : _G( fg.nrVars(), 0 ), _vars(), _clusters() {
     // copy variables
     _vars.reserve( fg.nrVars() );
     for( size_t i = 0; i < fg.nrVars(); i++ )
         _vars.push_back( fg.var(i) );
 
-    // copy clusters
-    _clusters.reserve( fg.nrFactors() );
-    for( size_t I = 0; I < fg.nrFactors(); I++ )
-        _clusters.push_back( fg.factor(I).vars() );
-
-    if( onlyMaximal )
-        eraseNonMaximal();
+    if( onlyMaximal ) {
+        for( size_t I = 0; I < fg.nrFactors(); I++ )
+            if( fg.isMaximal( I ) ) {
+                _clusters.push_back( fg.factor(I).vars() );
+                size_t clind = _G.addNode2();
+                bforeach( const Neighbor &i, fg.nbF(I) )
+                    _G.addEdge( i, clind, true );
+            }
+    } else {
+        // copy clusters
+        _clusters.reserve( fg.nrFactors() );
+        for( size_t I = 0; I < fg.nrFactors(); I++ )
+            _clusters.push_back( fg.factor(I).vars() );
+        // copy bipartite graph
+        _G = fg.bipGraph();
+    }
 }