375 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			375 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C++
		
	
	
/**
 | 
						|
 * @file testLinearTools.cpp
 | 
						|
 *
 | 
						|
 * @brief 
 | 
						|
 *
 | 
						|
 * @date Aug 27, 2012
 | 
						|
 * @author Alex Cunningham
 | 
						|
 */
 | 
						|
 | 
						|
#include <CppUnitLite/TestHarness.h>
 | 
						|
 | 
						|
#include <gtsam_unstable/linear/bayesTreeOperations.h>
 | 
						|
#include <gtsam/linear/GaussianMultifrontalSolver.h>
 | 
						|
 | 
						|
#include <tests/smallExample.h>
 | 
						|
 | 
						|
using namespace gtsam;
 | 
						|
 | 
						|
SharedDiagonal model2 = noiseModel::Diagonal::Sigmas(ones(2));
 | 
						|
SharedDiagonal model4 = noiseModel::Diagonal::Sigmas(ones(4));
 | 
						|
SharedDiagonal model6 = noiseModel::Diagonal::Sigmas(ones(6));
 | 
						|
 | 
						|
using namespace std;
 | 
						|
 | 
						|
using symbol_shorthand::X;
 | 
						|
using symbol_shorthand::L;
 | 
						|
 | 
						|
static const double tol = 1e-4;
 | 
						|
 | 
						|
/* ************************************************************************* */
 | 
						|
TEST( testBayesTreeOperations, splitFactor1 ) {
 | 
						|
 | 
						|
  // Build upper-triangular system
 | 
						|
  JacobianFactor initFactor(
 | 
						|
       0,Matrix_(4, 2,
 | 
						|
           1.0, 2.0,
 | 
						|
           0.0, 3.0,
 | 
						|
           0.0, 0.0,
 | 
						|
           0.0, 0.0),
 | 
						|
       1,Matrix_(4, 2,
 | 
						|
           1.0, 2.0,
 | 
						|
           9.0, 3.0,
 | 
						|
           6.0, 8.0,
 | 
						|
           0.0, 7.0),
 | 
						|
       Vector_(4, 0.1, 0.2, 0.3, 0.4),
 | 
						|
       model4);
 | 
						|
 | 
						|
  GaussianFactorGraph actSplit = splitFactor(initFactor.clone());
 | 
						|
  GaussianFactorGraph expSplit;
 | 
						|
 | 
						|
  expSplit.add(
 | 
						|
       0,Matrix_(2, 2,
 | 
						|
           1.0, 2.0,
 | 
						|
           0.0, 3.0),
 | 
						|
       1,Matrix_(2, 2,
 | 
						|
           1.0, 2.0,
 | 
						|
           9.0, 3.0),
 | 
						|
       Vector_(2, 0.1, 0.2),
 | 
						|
       model2);
 | 
						|
  expSplit.add(
 | 
						|
       1,Matrix_(2, 2,
 | 
						|
           6.0, 8.0,
 | 
						|
           0.0, 7.0),
 | 
						|
       Vector_(2, 0.3, 0.4),
 | 
						|
       model2);
 | 
						|
 | 
						|
  EXPECT(assert_equal(expSplit, actSplit));
 | 
						|
}
 | 
						|
 | 
						|
/* ************************************************************************* */
 | 
						|
TEST( testBayesTreeOperations, splitFactor2 ) {
 | 
						|
 | 
						|
  // Build upper-triangular system
 | 
						|
  JacobianFactor initFactor(
 | 
						|
       0,Matrix_(6, 2,
 | 
						|
           1.0, 2.0,
 | 
						|
           0.0, 3.0,
 | 
						|
           0.0, 0.0,
 | 
						|
           0.0, 0.0,
 | 
						|
           0.0, 0.0,
 | 
						|
           0.0, 0.0),
 | 
						|
       1,Matrix_(6, 2,
 | 
						|
           1.0, 2.0,
 | 
						|
           9.0, 3.0,
 | 
						|
           6.0, 8.0,
 | 
						|
           0.0, 7.0,
 | 
						|
           0.0, 0.0,
 | 
						|
           0.0, 0.0),
 | 
						|
       2,Matrix_(6, 2,
 | 
						|
           1.1, 2.2,
 | 
						|
           9.1, 3.2,
 | 
						|
           6.1, 8.2,
 | 
						|
           0.1, 7.2,
 | 
						|
           0.1, 3.2,
 | 
						|
           0.0, 1.2),
 | 
						|
       Vector_(6, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6),
 | 
						|
       model6);
 | 
						|
 | 
						|
  GaussianFactorGraph actSplit = splitFactor(initFactor.clone());
 | 
						|
  GaussianFactorGraph expSplit;
 | 
						|
 | 
						|
  expSplit.add(
 | 
						|
       0,Matrix_(2, 2,
 | 
						|
           1.0, 2.0,
 | 
						|
           0.0, 3.0),
 | 
						|
       1,Matrix_(2, 2,
 | 
						|
           1.0, 2.0,
 | 
						|
           9.0, 3.0),
 | 
						|
       2,Matrix_(2, 2,
 | 
						|
           1.1, 2.2,
 | 
						|
           9.1, 3.2),
 | 
						|
       Vector_(2, 0.1, 0.2),
 | 
						|
       model2);
 | 
						|
  expSplit.add(
 | 
						|
       1,Matrix_(2, 2,
 | 
						|
           6.0, 8.0,
 | 
						|
           0.0, 7.0),
 | 
						|
       2,Matrix_(2, 2,
 | 
						|
           6.1, 8.2,
 | 
						|
           0.1, 7.2),
 | 
						|
       Vector_(2, 0.3, 0.4),
 | 
						|
       model2);
 | 
						|
  expSplit.add(
 | 
						|
      2,Matrix_(2, 2,
 | 
						|
           0.1, 3.2,
 | 
						|
           0.0, 1.2),
 | 
						|
       Vector_(2, 0.5, 0.6),
 | 
						|
       model2);
 | 
						|
 | 
						|
  EXPECT(assert_equal(expSplit, actSplit));
 | 
						|
}
 | 
						|
 | 
						|
/* ************************************************************************* */
 | 
						|
TEST( testBayesTreeOperations, splitFactor3 ) {
 | 
						|
 | 
						|
  // Build upper-triangular system
 | 
						|
  JacobianFactor initFactor(
 | 
						|
       0,Matrix_(4, 2,
 | 
						|
           1.0, 2.0,
 | 
						|
           0.0, 3.0,
 | 
						|
           0.0, 0.0,
 | 
						|
           0.0, 0.0),
 | 
						|
       1,Matrix_(4, 2,
 | 
						|
           1.0, 2.0,
 | 
						|
           9.0, 3.0,
 | 
						|
           6.0, 8.0,
 | 
						|
           0.0, 7.0),
 | 
						|
       2,Matrix_(4, 2,
 | 
						|
           1.1, 2.2,
 | 
						|
           9.1, 3.2,
 | 
						|
           6.1, 8.2,
 | 
						|
           0.1, 7.2),
 | 
						|
       Vector_(4, 0.1, 0.2, 0.3, 0.4),
 | 
						|
       model4);
 | 
						|
 | 
						|
  GaussianFactorGraph actSplit = splitFactor(initFactor.clone());
 | 
						|
  GaussianFactorGraph expSplit;
 | 
						|
 | 
						|
  expSplit.add(
 | 
						|
       0,Matrix_(2, 2,
 | 
						|
           1.0, 2.0,
 | 
						|
           0.0, 3.0),
 | 
						|
       1,Matrix_(2, 2,
 | 
						|
           1.0, 2.0,
 | 
						|
           9.0, 3.0),
 | 
						|
       2,Matrix_(2, 2,
 | 
						|
           1.1, 2.2,
 | 
						|
           9.1, 3.2),
 | 
						|
       Vector_(2, 0.1, 0.2),
 | 
						|
       model2);
 | 
						|
  expSplit.add(
 | 
						|
       1,Matrix_(2, 2,
 | 
						|
           6.0, 8.0,
 | 
						|
           0.0, 7.0),
 | 
						|
       2,Matrix_(2, 2,
 | 
						|
           6.1, 8.2,
 | 
						|
           0.1, 7.2),
 | 
						|
       Vector_(2, 0.3, 0.4),
 | 
						|
       model2);
 | 
						|
 | 
						|
  EXPECT(assert_equal(expSplit, actSplit));
 | 
						|
}
 | 
						|
 | 
						|
/* ************************************************************************* */
 | 
						|
// Some numbers that should be consistent among all smoother tests
 | 
						|
 | 
						|
//static double sigmax1 = 0.786153, /*sigmax2 = 1.0/1.47292,*/ sigmax3 = 0.671512, sigmax4 =
 | 
						|
//    0.669534 /*, sigmax5 = sigmax3, sigmax6 = sigmax2*/, sigmax7 = sigmax1;
 | 
						|
 | 
						|
/* ************************************************************************* */
 | 
						|
TEST( testBayesTreeOperations, liquefy ) {
 | 
						|
  using namespace example;
 | 
						|
 | 
						|
  // Create smoother with 7 nodes
 | 
						|
  Ordering ordering;
 | 
						|
  ordering += X(1),X(3),X(5),X(7),X(2),X(6),X(4);
 | 
						|
  GaussianFactorGraph smoother = createSmoother(7, ordering).first;
 | 
						|
 | 
						|
  // Create the Bayes tree
 | 
						|
  GaussianBayesTree bayesTree = *GaussianMultifrontalSolver(smoother).eliminate();
 | 
						|
//  bayesTree.print("Full tree");
 | 
						|
 | 
						|
  SharedDiagonal unit6 = noiseModel::Diagonal::Sigmas(Vector_(ones(6)));
 | 
						|
  SharedDiagonal unit4 = noiseModel::Diagonal::Sigmas(Vector_(ones(4)));
 | 
						|
  SharedDiagonal unit2 = noiseModel::Diagonal::Sigmas(Vector_(ones(2)));
 | 
						|
 | 
						|
  // Liquefy the tree back into a graph
 | 
						|
  {
 | 
						|
    GaussianFactorGraph actGraph = liquefy(bayesTree, false); // Doesn't split conditionals
 | 
						|
    GaussianFactorGraph expGraph;
 | 
						|
 | 
						|
    Matrix A12 = Matrix_(6, 2,
 | 
						|
        1.73205081,          0.0,
 | 
						|
               0.0,   1.73205081,
 | 
						|
               0.0,          0.0,
 | 
						|
               0.0,          0.0,
 | 
						|
               0.0,          0.0,
 | 
						|
               0.0,          0.0);
 | 
						|
 | 
						|
    Matrix A15 = Matrix_(6, 2,
 | 
						|
       -0.577350269,          0.0,
 | 
						|
                0.0, -0.577350269,
 | 
						|
         1.47196014,          0.0,
 | 
						|
                0.0,   1.47196014,
 | 
						|
                0.0,          0.0,
 | 
						|
                0.0,          0.0);
 | 
						|
 | 
						|
    Matrix A16 = Matrix_(6, 2,
 | 
						|
      -0.577350269,          0.0,
 | 
						|
               0.0, -0.577350269,
 | 
						|
      -0.226455407,          0.0,
 | 
						|
               0.0, -0.226455407,
 | 
						|
        1.49357599,          0.0,
 | 
						|
               0.0,   1.49357599);
 | 
						|
    expGraph.add(2, A12, 5, A15, 6, A16, zeros(6,1), unit6);
 | 
						|
 | 
						|
    Matrix A21 = Matrix_(4, 2,
 | 
						|
        1.73205081,          0.0,
 | 
						|
               0.0,   1.73205081,
 | 
						|
               0.0,          0.0,
 | 
						|
               0.0,          0.0);
 | 
						|
 | 
						|
    Matrix A24 = Matrix_(4, 2,
 | 
						|
      -0.577350269,          0.0,
 | 
						|
               0.0, -0.577350269,
 | 
						|
        1.47196014,          0.0,
 | 
						|
               0.0,   1.47196014);
 | 
						|
 | 
						|
    Matrix A26 = Matrix_(4, 2,
 | 
						|
      -0.577350269,          0.0,
 | 
						|
               0.0, -0.577350269,
 | 
						|
      -0.226455407,          0.0,
 | 
						|
               0.0, -0.226455407);
 | 
						|
 | 
						|
    expGraph.add(1, A21, 4, A24, 6, A26, zeros(4,1), unit4);
 | 
						|
 | 
						|
    Matrix A30 = Matrix_(2, 2,
 | 
						|
        1.41421356,          0.0,
 | 
						|
               0.0,   1.41421356);
 | 
						|
 | 
						|
    Matrix A34 = Matrix_(2, 2,
 | 
						|
      -0.707106781,          0.0,
 | 
						|
               0.0, -0.707106781);
 | 
						|
 | 
						|
    expGraph.add(0, A30, 4, A34, zeros(2,1), unit2);
 | 
						|
 | 
						|
    Matrix A43 = Matrix_(2, 2,
 | 
						|
        1.41421356,          0.0,
 | 
						|
               0.0,   1.41421356);
 | 
						|
    Matrix A45 = Matrix_(2, 2,
 | 
						|
      -0.707106781,          0.0,
 | 
						|
               0.0, -0.707106781);
 | 
						|
 | 
						|
    expGraph.add(3, A43, 5, A45, zeros(2,1), unit2);
 | 
						|
 | 
						|
    EXPECT(assert_equal(expGraph, actGraph, tol));
 | 
						|
  }
 | 
						|
 | 
						|
  // Liquefy the tree back into a graph, splitting factors
 | 
						|
  {
 | 
						|
    GaussianFactorGraph actGraph = liquefy(bayesTree, true);
 | 
						|
    GaussianFactorGraph expGraph;
 | 
						|
 | 
						|
    // Conditional 1
 | 
						|
    {
 | 
						|
      Matrix A12 = Matrix_(2, 2,
 | 
						|
          1.73205081,          0.0,
 | 
						|
                 0.0,   1.73205081);
 | 
						|
 | 
						|
      Matrix A15 = Matrix_(2, 2,
 | 
						|
         -0.577350269,          0.0,
 | 
						|
                  0.0, -0.577350269);
 | 
						|
 | 
						|
      Matrix A16 = Matrix_(2, 2,
 | 
						|
        -0.577350269,          0.0,
 | 
						|
                 0.0, -0.577350269);
 | 
						|
      expGraph.add(2, A12, 5, A15, 6, A16, zeros(2,1), unit2);
 | 
						|
    }
 | 
						|
 | 
						|
    {
 | 
						|
      Matrix A15 = Matrix_(2, 2,
 | 
						|
           1.47196014,          0.0,
 | 
						|
                  0.0,   1.47196014);
 | 
						|
 | 
						|
      Matrix A16 = Matrix_(2, 2,
 | 
						|
        -0.226455407,          0.0,
 | 
						|
                 0.0, -0.226455407);
 | 
						|
      expGraph.add(5, A15, 6, A16, zeros(2,1), unit2);
 | 
						|
    }
 | 
						|
 | 
						|
    {
 | 
						|
      Matrix A16 = Matrix_(2, 2,
 | 
						|
          1.49357599,          0.0,
 | 
						|
                 0.0,   1.49357599);
 | 
						|
      expGraph.add(6, A16, zeros(2,1), unit2);
 | 
						|
    }
 | 
						|
 | 
						|
    // Conditional 2
 | 
						|
    {
 | 
						|
      Matrix A21 = Matrix_(2, 2,
 | 
						|
          1.73205081,          0.0,
 | 
						|
                 0.0,   1.73205081);
 | 
						|
 | 
						|
      Matrix A24 = Matrix_(2, 2,
 | 
						|
        -0.577350269,          0.0,
 | 
						|
                 0.0, -0.577350269);
 | 
						|
 | 
						|
      Matrix A26 = Matrix_(2, 2,
 | 
						|
        -0.577350269,          0.0,
 | 
						|
                 0.0, -0.577350269);
 | 
						|
 | 
						|
      expGraph.add(1, A21, 4, A24, 6, A26, zeros(2,1), unit2);
 | 
						|
    }
 | 
						|
 | 
						|
    {
 | 
						|
      Matrix A24 = Matrix_(2, 2,
 | 
						|
          1.47196014,          0.0,
 | 
						|
                 0.0,   1.47196014);
 | 
						|
 | 
						|
      Matrix A26 = Matrix_(2, 2,
 | 
						|
        -0.226455407,          0.0,
 | 
						|
                 0.0, -0.226455407);
 | 
						|
 | 
						|
      expGraph.add(4, A24, 6, A26, zeros(2,1), unit2);
 | 
						|
    }
 | 
						|
 | 
						|
    // Conditional 3
 | 
						|
    Matrix A30 = Matrix_(2, 2,
 | 
						|
        1.41421356,          0.0,
 | 
						|
               0.0,   1.41421356);
 | 
						|
 | 
						|
    Matrix A34 = Matrix_(2, 2,
 | 
						|
      -0.707106781,          0.0,
 | 
						|
               0.0, -0.707106781);
 | 
						|
 | 
						|
    expGraph.add(0, A30, 4, A34, zeros(2,1), unit2);
 | 
						|
 | 
						|
    // Conditional 4
 | 
						|
    Matrix A43 = Matrix_(2, 2,
 | 
						|
        1.41421356,          0.0,
 | 
						|
               0.0,   1.41421356);
 | 
						|
    Matrix A45 = Matrix_(2, 2,
 | 
						|
      -0.707106781,          0.0,
 | 
						|
               0.0, -0.707106781);
 | 
						|
 | 
						|
    expGraph.add(3, A43, 5, A45, zeros(2,1), unit2);
 | 
						|
 | 
						|
    EXPECT(assert_equal(expGraph, actGraph, tol));
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/* ************************************************************************* */
 | 
						|
int main() { TestResult tr; return TestRegistry::runAllTests(tr); }
 | 
						|
/* ************************************************************************* */
 |