/* ************************************************************************* */
TEST( SymbolicBayesNet, combine )
{
    SymbolicConditional::shared_ptr
    A(new SymbolicConditional(_A_,_B_,_C_)),
    B(new SymbolicConditional(_B_,_C_)),
    C(new SymbolicConditional(_C_));

    // p(A|BC)
    SymbolicBayesNet p_ABC;
    p_ABC.push_back(A);

    // P(BC)=P(B|C)P(C)
    SymbolicBayesNet p_BC;
    p_BC.push_back(B);
    p_BC.push_back(C);

    // P(ABC) = P(A|BC) P(BC)
    p_ABC.push_back(p_BC);

    SymbolicBayesNet expected;
    expected.push_back(A);
    expected.push_back(B);
    expected.push_back(C);

    CHECK(assert_equal(expected,p_ABC));
}
/* ************************************************************************* */
TEST( SymbolicBayesNet, FromGaussian) {
  SymbolicBayesNet expected;
  expected.push_back(IndexConditional::shared_ptr(new IndexConditional(0, 1)));
  expected.push_back(IndexConditional::shared_ptr(new IndexConditional(1)));

  GaussianBayesNet gbn = createSmallGaussianBayesNet();
  SymbolicBayesNet actual(gbn);

  EXPECT(assert_equal(expected, actual));
}
/* ************************************************************************* */
TEST(SymbolicBayesNet, saveGraph) {
    SymbolicBayesNet bn;
    bn += SymbolicConditional(_A_, _B_);
    std::vector<Key> keys;
    keys.push_back(_B_);
    keys.push_back(_C_);
    keys.push_back(_D_);
    bn += SymbolicConditional::FromKeys(keys,2);
    bn += SymbolicConditional(_D_);

    bn.saveGraph("SymbolicBayesNet.dot");
}
/* ************************************************************************* */
TEST( SymbolicFactorGraph, eliminate )
{
  Ordering o; o += X(2),L(1),X(1);

  // create expected Chordal bayes Net
  IndexConditional::shared_ptr x2(new IndexConditional(o[X(2)], o[L(1)], o[X(1)]));
  IndexConditional::shared_ptr l1(new IndexConditional(o[L(1)], o[X(1)]));
  IndexConditional::shared_ptr x1(new IndexConditional(o[X(1)]));

  SymbolicBayesNet expected;
  expected.push_back(x2);
  expected.push_back(l1);
  expected.push_back(x1);

  // create a test graph
	GaussianFactorGraph factorGraph = example::createGaussianFactorGraph(o);
	SymbolicFactorGraph fg(factorGraph);

	// eliminate it
  SymbolicBayesNet actual = *SymbolicSequentialSolver(fg).eliminate();

  CHECK(assert_equal(expected,actual));
}