update HybridGaussianConditional to use single discrete parent

release/4.3a0
Varun Agrawal 2024-09-18 15:08:09 -04:00
parent c1ebdb200c
commit fa353840b3
7 changed files with 19 additions and 29 deletions

View File

@ -58,11 +58,11 @@ HybridGaussianConditional::conditionals() const {
/* *******************************************************************************/ /* *******************************************************************************/
HybridGaussianConditional::HybridGaussianConditional( HybridGaussianConditional::HybridGaussianConditional(
const KeyVector &continuousFrontals, const KeyVector &continuousParents, const KeyVector &continuousFrontals, const KeyVector &continuousParents,
const DiscreteKeys &discreteParents, const DiscreteKey &discreteParent,
const std::vector<GaussianConditional::shared_ptr> &conditionals) const std::vector<GaussianConditional::shared_ptr> &conditionals)
: HybridGaussianConditional(continuousFrontals, continuousParents, : HybridGaussianConditional(continuousFrontals, continuousParents,
discreteParents, DiscreteKeys{discreteParent},
Conditionals(discreteParents, conditionals)) {} Conditionals({discreteParent}, conditionals)) {}
/* *******************************************************************************/ /* *******************************************************************************/
// TODO(dellaert): This is copy/paste: HybridGaussianConditional should be // TODO(dellaert): This is copy/paste: HybridGaussianConditional should be

View File

@ -112,12 +112,13 @@ class GTSAM_EXPORT HybridGaussianConditional
* *
* @param continuousFrontals The continuous frontal variables * @param continuousFrontals The continuous frontal variables
* @param continuousParents The continuous parent variables * @param continuousParents The continuous parent variables
* @param discreteParents Discrete parents variables * @param discreteParent Single discrete parent variable
* @param conditionals Vector of conditionals * @param conditionals Vector of conditionals with the same size as the
* cardinality of the discrete parent.
*/ */
HybridGaussianConditional( HybridGaussianConditional(
const KeyVector &continuousFrontals, const KeyVector &continuousParents, const KeyVector &continuousFrontals, const KeyVector &continuousParents,
const DiscreteKeys &discreteParents, const DiscreteKey &discreteParent,
const std::vector<GaussianConditional::shared_ptr> &conditionals); const std::vector<GaussianConditional::shared_ptr> &conditionals);
/// @} /// @}

View File

@ -95,7 +95,7 @@ class HybridGaussianConditional : gtsam::HybridFactor {
HybridGaussianConditional( HybridGaussianConditional(
const gtsam::KeyVector& continuousFrontals, const gtsam::KeyVector& continuousFrontals,
const gtsam::KeyVector& continuousParents, const gtsam::KeyVector& continuousParents,
const gtsam::DiscreteKeys& discreteParents, const gtsam::DiscreteKey& discreteParent,
const std::vector<gtsam::GaussianConditional::shared_ptr>& conditionals); const std::vector<gtsam::GaussianConditional::shared_ptr>& conditionals);
gtsam::HybridGaussianFactor* likelihood( gtsam::HybridGaussianFactor* likelihood(

View File

@ -43,13 +43,11 @@ inline HybridBayesNet createHybridBayesNet(size_t num_measurements = 1,
// Create Gaussian mixture z_i = x0 + noise for each measurement. // Create Gaussian mixture z_i = x0 + noise for each measurement.
for (size_t i = 0; i < num_measurements; i++) { for (size_t i = 0; i < num_measurements; i++) {
const auto mode_i = manyModes ? DiscreteKey{M(i), 2} : mode; const auto mode_i = manyModes ? DiscreteKey{M(i), 2} : mode;
DiscreteKeys modes{mode_i};
std::vector<GaussianConditional::shared_ptr> conditionals{ std::vector<GaussianConditional::shared_ptr> conditionals{
GaussianConditional::sharedMeanAndStddev(Z(i), I_1x1, X(0), Z_1x1, 0.5), GaussianConditional::sharedMeanAndStddev(Z(i), I_1x1, X(0), Z_1x1, 0.5),
GaussianConditional::sharedMeanAndStddev(Z(i), I_1x1, X(0), Z_1x1, 3)}; GaussianConditional::sharedMeanAndStddev(Z(i), I_1x1, X(0), Z_1x1, 3)};
bayesNet.emplace_shared<HybridGaussianConditional>( bayesNet.emplace_shared<HybridGaussianConditional>(
KeyVector{Z(i)}, KeyVector{X(0)}, DiscreteKeys{mode_i}, KeyVector{Z(i)}, KeyVector{X(0)}, mode_i, conditionals);
HybridGaussianConditional::Conditionals(modes, conditionals));
} }
// Create prior on X(0). // Create prior on X(0).

View File

@ -107,11 +107,9 @@ TEST(HybridBayesNet, evaluateHybrid) {
// Create hybrid Bayes net. // Create hybrid Bayes net.
HybridBayesNet bayesNet; HybridBayesNet bayesNet;
bayesNet.push_back(continuousConditional); bayesNet.push_back(continuousConditional);
DiscreteKeys discreteParents{Asia};
bayesNet.emplace_shared<HybridGaussianConditional>( bayesNet.emplace_shared<HybridGaussianConditional>(
KeyVector{X(1)}, KeyVector{}, discreteParents, KeyVector{X(1)}, KeyVector{}, Asia,
HybridGaussianConditional::Conditionals( std::vector{conditional0, conditional1});
discreteParents, std::vector{conditional0, conditional1}));
bayesNet.emplace_shared<DiscreteConditional>(Asia, "99/1"); bayesNet.emplace_shared<DiscreteConditional>(Asia, "99/1");
// Create values at which to evaluate. // Create values at which to evaluate.
@ -170,11 +168,9 @@ TEST(HybridBayesNet, Error) {
conditional1 = std::make_shared<GaussianConditional>( conditional1 = std::make_shared<GaussianConditional>(
X(1), Vector1::Constant(2), I_1x1, model1); X(1), Vector1::Constant(2), I_1x1, model1);
DiscreteKeys discreteParents{Asia};
auto gm = std::make_shared<HybridGaussianConditional>( auto gm = std::make_shared<HybridGaussianConditional>(
KeyVector{X(1)}, KeyVector{}, discreteParents, KeyVector{X(1)}, KeyVector{}, Asia,
HybridGaussianConditional::Conditionals( std::vector{conditional0, conditional1});
discreteParents, std::vector{conditional0, conditional1}));
// Create hybrid Bayes net. // Create hybrid Bayes net.
HybridBayesNet bayesNet; HybridBayesNet bayesNet;
bayesNet.push_back(continuousConditional); bayesNet.push_back(continuousConditional);
@ -393,11 +389,10 @@ TEST(HybridBayesNet, Sampling) {
std::make_shared<BetweenFactor<double>>(X(0), X(1), 0, noise_model); std::make_shared<BetweenFactor<double>>(X(0), X(1), 0, noise_model);
auto one_motion = auto one_motion =
std::make_shared<BetweenFactor<double>>(X(0), X(1), 1, noise_model); std::make_shared<BetweenFactor<double>>(X(0), X(1), 1, noise_model);
DiscreteKeys discreteKeys{DiscreteKey(M(0), 2)}; nfg.emplace_shared<HybridNonlinearFactor>(
HybridNonlinearFactor::Factors factors( KeyVector{X(0), X(1)}, DiscreteKey(M(0), 2),
discreteKeys, {{zero_motion, 0.0}, {one_motion, 0.0}}); std::vector<NonlinearFactorValuePair>{{zero_motion, 0.0},
nfg.emplace_shared<HybridNonlinearFactor>(KeyVector{X(0), X(1)}, discreteKeys, {one_motion, 0.0}});
factors);
DiscreteKey mode(M(0), 2); DiscreteKey mode(M(0), 2);
nfg.emplace_shared<DiscreteDistribution>(mode, "1/1"); nfg.emplace_shared<DiscreteDistribution>(mode, "1/1");

View File

@ -43,14 +43,12 @@ class TestHybridBayesNet(GtsamTestCase):
# Create the conditionals # Create the conditionals
conditional0 = GaussianConditional(X(1), [5], I_1x1, model0) conditional0 = GaussianConditional(X(1), [5], I_1x1, model0)
conditional1 = GaussianConditional(X(1), [2], I_1x1, model1) conditional1 = GaussianConditional(X(1), [2], I_1x1, model1)
discrete_keys = DiscreteKeys()
discrete_keys.push_back(Asia)
# Create hybrid Bayes net. # Create hybrid Bayes net.
bayesNet = HybridBayesNet() bayesNet = HybridBayesNet()
bayesNet.push_back(conditional) bayesNet.push_back(conditional)
bayesNet.push_back( bayesNet.push_back(
HybridGaussianConditional([X(1)], [], discrete_keys, HybridGaussianConditional([X(1)], [], Asia,
[conditional0, conditional1])) [conditional0, conditional1]))
bayesNet.push_back(DiscreteConditional(Asia, "99/1")) bayesNet.push_back(DiscreteConditional(Asia, "99/1"))

View File

@ -101,10 +101,8 @@ class TestHybridGaussianFactorGraph(GtsamTestCase):
I_1x1, I_1x1,
X(0), [0], X(0), [0],
sigma=3) sigma=3)
discreteParents = DiscreteKeys()
discreteParents.push_back(mode)
bayesNet.push_back( bayesNet.push_back(
HybridGaussianConditional([Z(i)], [X(0)], discreteParents, HybridGaussianConditional([Z(i)], [X(0)], mode,
[conditional0, conditional1])) [conditional0, conditional1]))
# Create prior on X(0). # Create prior on X(0).