index 28f6b5b..863b694 100644 (file)
@@ -60,6 +60,11 @@ namespace dai {
*
*  Factor graphs explicitly express the factorization structure of the
*  corresponding probability distribution.
+ *
+ *  \todo Alternative implementation of undo factor changes: the only things that have to be
+ *  undone currently are setting a factor to 1 and setting a factor to a Kronecker delta. This
+ *  could also be implemented in the TFactor itself, which could maintain its state
+ *  (ones/delta/full) and act accordingly.
*/
class FactorGraph {
public:
@@ -74,6 +79,13 @@ class FactorGraph {

/// Shorthand for BipartiteGraph::Edge
typedef BipartiteGraph::Edge      Edge;
+
+        /// Iterator over factors
+        typedef std::vector<Factor>::iterator iterator;
+
+        /// Const iterator over factors
+        typedef std::vector<Factor>::const_iterator const_iterator;
+

private:
std::vector<Var>         _vars;
@@ -84,20 +96,6 @@ class FactorGraph {
/// Default constructor
FactorGraph() : G(), _vars(), _factors(), _backup() {}

-        /// Copy constructor
-        FactorGraph(const FactorGraph & x) : G(x.G), _vars(x._vars), _factors(x._factors), _backup(x._backup) {}
-
-        /// Assignment operator
-        FactorGraph & operator=(const FactorGraph & x) {
-            if( this != &x ) {
-                G          = x.G;
-                _vars      = x._vars;
-                _factors   = x._factors;
-                _backup    = x._backup;
-            }
-            return *this;
-        }
-
/// Constructs a FactorGraph from a vector of factors
FactorGraph(const std::vector<Factor> &P);

@@ -128,6 +126,14 @@ class FactorGraph {
const Factor & factor(size_t I) const { return _factors[I]; }
/// Returns const reference to all factors
const std::vector<Factor> & factors() const { return _factors; }
+        /// Returns iterator pointing to first factor
+        iterator begin() { return _factors.begin(); }
+        /// Returns const iterator pointing to first factor
+        const_iterator begin() const { return _factors.begin(); }
+        /// Returns iterator pointing beyond last factor
+        iterator end() { return _factors.end(); }
+        /// Returns const iterator pointing beyond last factor
+        const_iterator end() const { return _factors.end(); }

/// Returns number of variables
size_t nrVars() const { return vars().size(); }
@@ -209,10 +215,21 @@ class FactorGraph {
}
}

-        /// Clamp variable n to value i (i.e. multiply with a Kronecker delta \f$\delta_{x_n, i}\f$);
-        /// If backup == true, make a backup of all factors that are changed
+        /// Clamp variable n to value i (i.e. multiply with a Kronecker delta \f$\delta_{x_n, i}\f$)
+        /** If backup == true, make a backup of all factors that are changed
+         */
virtual void clamp( const Var & n, size_t i, bool backup = false );

+        /// Clamp a variable in a factor graph to have one out of a list of values
+        /** If backup == true, make a backup of all factors that are changed
+         */
+        void clampVar( size_t i, const std::vector<size_t> &xis, bool backup = false );
+
+        /// Clamp a factor in a factor graph to have one out of a list of values
+        /** If backup == true, make a backup of all factors that are changed
+         */
+        void clampFactor( size_t I, const std::vector<size_t> &xIs, bool backup = false );
+
/// Set all factors interacting with the i'th variable 1
virtual void makeCavity( unsigned i, bool backup = false );

@@ -270,6 +287,15 @@ class FactorGraph {
friend std::ostream& operator << (std::ostream& os, const FactorGraph& fg);
friend std::istream& operator >> (std::istream& is, FactorGraph& fg);

+        /// @name Backwards compatibility layer (to be removed soon)
+        //@{
+        size_t VV2E(size_t n1, size_t n2) const { return G.VV2E(n1,n2); }
+        const Edge& edge(size_t e) const { return G.edge(e); }
+        void indexEdges() { G.indexEdges(); }
+        size_t nr_edges() const { return G.nr_edges(); }
+        const std::vector<Edge>& edges() const { return G.edges(); }
+        //}@
+
private:
/// Part of constructors (creates edges, neighbors and adjacency matrix)
void constructGraph( size_t nrEdges );