diff --git a/cpp/BayesNet.h b/cpp/BayesNet.h index 92f776f50..ea965ac69 100644 --- a/cpp/BayesNet.h +++ b/cpp/BayesNet.h @@ -64,6 +64,12 @@ namespace gtsam { conditionals_.push_front(conditional); } + /** + * pop_front: remove node at the bottom, used in marginalization + * For example P(ABC)=P(A|BC)P(B|C)P(C) becomes P(BC)=P(B|C)P(C) + */ + inline void pop_front() {conditionals_.pop_front();} + /** size is the number of nodes */ inline size_t size() const { return conditionals_.size(); diff --git a/cpp/testSymbolicBayesNet.cpp b/cpp/testSymbolicBayesNet.cpp index 10b423237..6f9bac8b1 100644 --- a/cpp/testSymbolicBayesNet.cpp +++ b/cpp/testSymbolicBayesNet.cpp @@ -43,6 +43,29 @@ TEST( SymbolicBayesNet, constructor ) CHECK(assert_equal(expected, *actual)); } +/* ************************************************************************* */ +TEST( SymbolicBayesNet, pop_front ) +{ + SymbolicConditional::shared_ptr + A(new SymbolicConditional("A","B","C")), + B(new SymbolicConditional("B","C")), + C(new SymbolicConditional("C")); + + // Expected after pop_front + SymbolicBayesNet expected; + expected.push_back(B); + expected.push_back(C); + + // Actual + SymbolicBayesNet actual; + actual.push_back(A); + actual.push_back(B); + actual.push_back(C); + actual.pop_front(); + + CHECK(assert_equal(expected,actual)); +} + /* ************************************************************************* */ int main() { TestResult tr;