proto code for likelihood
parent
364417e4aa
commit
611f61c7f4
|
|
@ -135,19 +135,12 @@ TEST(GaussianMixture, Error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
// Create a likelihood factor for a Gaussian mixture, return a Mixture factor on
|
|
||||||
// the parents.
|
|
||||||
GaussianMixtureFactor::shared_ptr likelihood(const HybridValues& values) {
|
|
||||||
GaussianMixtureFactor::shared_ptr factor;
|
|
||||||
return factor;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Check that likelihood returns a mixture factor on the parents.
|
|
||||||
TEST(GaussianMixture, Likelihood) {
|
|
||||||
// Create mode key: 0 is low-noise, 1 is high-noise.
|
// Create mode key: 0 is low-noise, 1 is high-noise.
|
||||||
Key modeKey = M(0);
|
static const Key modeKey = M(0);
|
||||||
DiscreteKey mode(modeKey, 2);
|
static const DiscreteKey mode(modeKey, 2);
|
||||||
|
|
||||||
|
// Create a simple GaussianMixture
|
||||||
|
static GaussianMixture createSimpleGaussianMixture() {
|
||||||
// Create Gaussian mixture Z(0) = X(0) + noise.
|
// Create Gaussian mixture Z(0) = X(0) + noise.
|
||||||
// TODO(dellaert): making copies below is not ideal !
|
// TODO(dellaert): making copies below is not ideal !
|
||||||
Matrix1 I = Matrix1::Identity();
|
Matrix1 I = Matrix1::Identity();
|
||||||
|
|
@ -157,15 +150,77 @@ TEST(GaussianMixture, Likelihood) {
|
||||||
GaussianConditional::FromMeanAndStddev(Z(0), I, X(0), Vector1(0), 3));
|
GaussianConditional::FromMeanAndStddev(Z(0), I, X(0), Vector1(0), 3));
|
||||||
const auto gm = GaussianMixture::FromConditionals(
|
const auto gm = GaussianMixture::FromConditionals(
|
||||||
{Z(0)}, {X(0)}, {mode}, {conditional0, conditional1});
|
{Z(0)}, {X(0)}, {mode}, {conditional0, conditional1});
|
||||||
|
return gm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
std::set<DiscreteKey> DiscreteKeysAsSet(const DiscreteKeys& dkeys) {
|
||||||
|
std::set<DiscreteKey> s;
|
||||||
|
s.insert(dkeys.begin(), dkeys.end());
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get only the continuous parent keys as a KeyVector:
|
||||||
|
KeyVector continuousParents(const GaussianMixture& gm) {
|
||||||
|
// Get all parent keys:
|
||||||
|
const auto range = gm.parents();
|
||||||
|
KeyVector continuousParentKeys(range.begin(), range.end());
|
||||||
|
// Loop over all discrete keys:
|
||||||
|
for (const auto& discreteKey : gm.discreteKeys()) {
|
||||||
|
const Key key = discreteKey.first;
|
||||||
|
// remove that key from continuousParentKeys:
|
||||||
|
continuousParentKeys.erase(std::remove(continuousParentKeys.begin(),
|
||||||
|
continuousParentKeys.end(), key),
|
||||||
|
continuousParentKeys.end());
|
||||||
|
}
|
||||||
|
return continuousParentKeys;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a test for continuousParents.
|
||||||
|
TEST(GaussianMixture, ContinuousParents) {
|
||||||
|
const GaussianMixture gm = createSimpleGaussianMixture();
|
||||||
|
const KeyVector continuousParentKeys = continuousParents(gm);
|
||||||
|
// Check that the continuous parent keys are correct:
|
||||||
|
EXPECT(continuousParentKeys.size() == 1);
|
||||||
|
EXPECT(continuousParentKeys[0] == X(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
// Create a likelihood factor for a Gaussian mixture, return a Mixture factor.
|
||||||
|
GaussianMixtureFactor::shared_ptr likelihood(const GaussianMixture& gm,
|
||||||
|
const VectorValues& frontals) {
|
||||||
|
// TODO(dellaert): check that values has all frontals
|
||||||
|
const DiscreteKeys discreteParentKeys = gm.discreteKeys();
|
||||||
|
const KeyVector continuousParentKeys = continuousParents(gm);
|
||||||
|
const GaussianMixtureFactor::Factors likelihoods(
|
||||||
|
gm.conditionals(),
|
||||||
|
[&](const GaussianConditional::shared_ptr& conditional) {
|
||||||
|
return conditional->likelihood(frontals);
|
||||||
|
});
|
||||||
|
return boost::make_shared<GaussianMixtureFactor>(
|
||||||
|
continuousParentKeys, discreteParentKeys, likelihoods);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Check that likelihood returns a mixture factor on the parents.
|
||||||
|
TEST(GaussianMixture, Likelihood) {
|
||||||
|
const GaussianMixture gm = createSimpleGaussianMixture();
|
||||||
|
|
||||||
// Call the likelihood function:
|
// Call the likelihood function:
|
||||||
VectorValues measurements;
|
VectorValues measurements;
|
||||||
measurements.insert(Z(0), Vector1(0));
|
measurements.insert(Z(0), Vector1(0));
|
||||||
HybridValues values(DiscreteValues(), measurements);
|
const auto factor = likelihood(gm, measurements);
|
||||||
const auto factor = likelihood(values);
|
|
||||||
|
|
||||||
// Check that the factor is a mixture factor on the parents.
|
// Check that the factor is a mixture factor on the parents.
|
||||||
const GaussianMixtureFactor expected = GaussianMixtureFactor();
|
// Loop over all discrete assignments over the discrete parents:
|
||||||
|
const DiscreteKeys discreteParentKeys = gm.discreteKeys();
|
||||||
|
|
||||||
|
// Apply the likelihood function to all conditionals:
|
||||||
|
const GaussianMixtureFactor::Factors factors(
|
||||||
|
gm.conditionals(),
|
||||||
|
[measurements](const GaussianConditional::shared_ptr& conditional) {
|
||||||
|
return conditional->likelihood(measurements);
|
||||||
|
});
|
||||||
|
const GaussianMixtureFactor expected({X(0)}, {mode}, factors);
|
||||||
EXPECT(assert_equal(*factor, expected));
|
EXPECT(assert_equal(*factor, expected));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue