Added determinant function to GaussianBayesNet and added a unit test
parent
b84adc82a7
commit
5016ca4f25
|
@ -202,6 +202,17 @@ VectorValues rhs(const GaussianBayesNet& bn) {
|
||||||
return *result;
|
return *result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
double determinant(const GaussianBayesNet& bayesNet) {
|
||||||
|
double logDet = 0.0;
|
||||||
|
|
||||||
|
BOOST_FOREACH(boost::shared_ptr<const GaussianConditional> cg, bayesNet){
|
||||||
|
logDet += cg->get_R().diagonal().unaryExpr(ptr_fun<double,double>(log)).sum();
|
||||||
|
}
|
||||||
|
|
||||||
|
return exp(logDet);
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
|
||||||
} // namespace gtsam
|
} // namespace gtsam
|
||||||
|
|
|
@ -97,4 +97,15 @@ namespace gtsam {
|
||||||
*/
|
*/
|
||||||
VectorValues rhs(const GaussianBayesNet&);
|
VectorValues rhs(const GaussianBayesNet&);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Computes the determinant of a GassianBayesNet
|
||||||
|
* A GaussianBayesNet is an upper triangular matrix and for an upper triangular matrix
|
||||||
|
* determinant is the product of the diagonal elements. Instead of actually multiplying
|
||||||
|
* we add the logarithms of the diagonal elements and take the exponent at the end
|
||||||
|
* because this is more numerically stable.
|
||||||
|
* @param bayesNet The input GaussianBayesNet
|
||||||
|
* @return The determinant
|
||||||
|
*/
|
||||||
|
double determinant(const GaussianBayesNet& bayesNet);
|
||||||
|
|
||||||
} /// namespace gtsam
|
} /// namespace gtsam
|
||||||
|
|
|
@ -201,6 +201,31 @@ TEST( GaussianBayesNet, backSubstituteTranspose )
|
||||||
EXPECT(assert_equal(y,actual));
|
EXPECT(assert_equal(y,actual));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
// Tests computing Determinant
|
||||||
|
TEST( GaussianBayesNet, DeterminantTest )
|
||||||
|
{
|
||||||
|
GaussianBayesNet cbn;
|
||||||
|
cbn += boost::shared_ptr<GaussianConditional>(new GaussianConditional(
|
||||||
|
0, Vector_( 2, 3.0, 4.0 ), Matrix_(2, 2, 1.0, 3.0, 0.0, 4.0 ),
|
||||||
|
1, Matrix_(2, 2, 2.0, 1.0, 2.0, 3.0),
|
||||||
|
ones(2)));
|
||||||
|
|
||||||
|
cbn += boost::shared_ptr<GaussianConditional>(new GaussianConditional(
|
||||||
|
1, Vector_( 2, 5.0, 6.0 ), Matrix_(2, 2, 1.0, 1.0, 0.0, 3.0 ),
|
||||||
|
2, Matrix_(2, 2, 1.0, 0.0, 5.0, 2.0),
|
||||||
|
ones(2)));
|
||||||
|
|
||||||
|
cbn += boost::shared_ptr<GaussianConditional>(new GaussianConditional(
|
||||||
|
3, Vector_( 2, 7.0, 8.0 ), Matrix_(2, 2, 1.0, 1.0, 0.0, 5.0 ),
|
||||||
|
ones(2)));
|
||||||
|
|
||||||
|
double expectedDeterminant = 60;
|
||||||
|
double actualDeterminant = determinant(cbn);
|
||||||
|
|
||||||
|
EXPECT_DOUBLES_EQUAL( expectedDeterminant, actualDeterminant, 1e-9);
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
int main() { TestResult tr; return TestRegistry::runAllTests(tr);}
|
int main() { TestResult tr; return TestRegistry::runAllTests(tr);}
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
|
Loading…
Reference in New Issue