From 9f4ab83cee14db7f5784a0f18930310e491ee715 Mon Sep 17 00:00:00 2001 From: Varun Agrawal Date: Tue, 13 May 2025 22:45:17 -0400 Subject: [PATCH 1/6] separate DiscreteMarginals into .h and .cpp --- gtsam/discrete/DiscreteMarginals.cpp | 58 ++++++++++++++++++++++++++++ gtsam/discrete/DiscreteMarginals.h | 28 +++----------- 2 files changed, 63 insertions(+), 23 deletions(-) create mode 100644 gtsam/discrete/DiscreteMarginals.cpp diff --git a/gtsam/discrete/DiscreteMarginals.cpp b/gtsam/discrete/DiscreteMarginals.cpp new file mode 100644 index 000000000..d7cc79a5c --- /dev/null +++ b/gtsam/discrete/DiscreteMarginals.cpp @@ -0,0 +1,58 @@ +/* ---------------------------------------------------------------------------- + + * GTSAM Copyright 2010, Georgia Tech Research Corporation, + * Atlanta, Georgia 30332-0415 + * All Rights Reserved + * Authors: Frank Dellaert, et al. (see THANKS for the full author list) + + * See LICENSE for the license information + + * -------------------------------------------------------------------------- */ + +/** + * @file DiscreteMarginals.cpp + * @brief A class for computing marginals in a DiscreteFactorGraph + * @author Abhijit Kundu + * @author Richard Roberts + * @author Varun Agrawal + * @author Frank Dellaert + * @date June 4, 2012 + */ + +#pragma once + +#include +#include +#include + +namespace gtsam { + +/* ************************************************************************* */ +DiscreteMarginals::DiscreteMarginals(const DiscreteFactorGraph& graph) { + bayesTree_ = graph.eliminateMultifrontal(); +} + +/* ************************************************************************* */ +DiscreteFactor::shared_ptr DiscreteMarginals::operator()(Key variable) const { + // Compute marginal + DiscreteFactor::shared_ptr marginalFactor = + bayesTree_->marginalFactor(variable, &EliminateDiscrete); + return marginalFactor; +} + +/* ************************************************************************* */ +Vector DiscreteMarginals::marginalProbabilities(const DiscreteKey& key) const { + // Compute marginal + DiscreteFactor::shared_ptr marginalFactor = this->operator()(key.first); + + // Create result + Vector vResult(key.second); + for (size_t state = 0; state < key.second; ++state) { + DiscreteValues values; + values[key.first] = state; + vResult(state) = (*marginalFactor)(values); + } + return vResult; +} + +} /* namespace gtsam */ diff --git a/gtsam/discrete/DiscreteMarginals.h b/gtsam/discrete/DiscreteMarginals.h index 62c80e657..fd6c93fe4 100644 --- a/gtsam/discrete/DiscreteMarginals.h +++ b/gtsam/discrete/DiscreteMarginals.h @@ -14,6 +14,7 @@ * @brief A class for computing marginals in a DiscreteFactorGraph * @author Abhijit Kundu * @author Richard Roberts + * @author Varun Agrawal * @author Frank Dellaert * @date June 4, 2012 */ @@ -38,38 +39,19 @@ class DiscreteMarginals { DiscreteMarginals() {} /** Construct a marginals class. - * @param graph The factor graph defining the full joint + * @param graph The factor graph defining the full joint * distribution on all variables. */ - DiscreteMarginals(const DiscreteFactorGraph& graph) { - bayesTree_ = graph.eliminateMultifrontal(); - } + DiscreteMarginals(const DiscreteFactorGraph& graph); /** Compute the marginal of a single variable */ - DiscreteFactor::shared_ptr operator()(Key variable) const { - // Compute marginal - DiscreteFactor::shared_ptr marginalFactor = - bayesTree_->marginalFactor(variable, &EliminateDiscrete); - return marginalFactor; - } + DiscreteFactor::shared_ptr operator()(Key variable) const; /** Compute the marginal of a single variable * @param key DiscreteKey of the Variable * @return Vector of marginal probabilities */ - Vector marginalProbabilities(const DiscreteKey& key) const { - // Compute marginal - DiscreteFactor::shared_ptr marginalFactor = this->operator()(key.first); - - // Create result - Vector vResult(key.second); - for (size_t state = 0; state < key.second; ++state) { - DiscreteValues values; - values[key.first] = state; - vResult(state) = (*marginalFactor)(values); - } - return vResult; - } + Vector marginalProbabilities(const DiscreteKey& key) const; }; } /* namespace gtsam */ From 27fc6a7a4e3b01cecb65511db36b47fa649a9f79 Mon Sep 17 00:00:00 2001 From: Varun Agrawal Date: Tue, 13 May 2025 22:49:51 -0400 Subject: [PATCH 2/6] add print method to DiscreteMarginals --- gtsam/discrete/DiscreteMarginals.cpp | 8 ++++++++ gtsam/discrete/DiscreteMarginals.h | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/gtsam/discrete/DiscreteMarginals.cpp b/gtsam/discrete/DiscreteMarginals.cpp index d7cc79a5c..74da37e73 100644 --- a/gtsam/discrete/DiscreteMarginals.cpp +++ b/gtsam/discrete/DiscreteMarginals.cpp @@ -55,4 +55,12 @@ Vector DiscreteMarginals::marginalProbabilities(const DiscreteKey& key) const { return vResult; } +/* ************************************************************************* */ +void DiscreteMarginals::print( + const std::string& s = "", + const KeyFormatter formatter = DefaultKeyFormatter) const { + std::cout << (s.empty() ? "Discrete Marginals of:" : s + " ") << std::endl; + bayesTree_.print("", formatter); +} + } /* namespace gtsam */ diff --git a/gtsam/discrete/DiscreteMarginals.h b/gtsam/discrete/DiscreteMarginals.h index fd6c93fe4..be2e17bcb 100644 --- a/gtsam/discrete/DiscreteMarginals.h +++ b/gtsam/discrete/DiscreteMarginals.h @@ -52,6 +52,10 @@ class DiscreteMarginals { * @return Vector of marginal probabilities */ Vector marginalProbabilities(const DiscreteKey& key) const; + + /// Print details + void print(const std::string& s = "", + const KeyFormatter formatter = DefaultKeyFormatter) const; }; } /* namespace gtsam */ From 53333170791b618f146ec87112d25a1b3ed1acea Mon Sep 17 00:00:00 2001 From: Varun Agrawal Date: Tue, 13 May 2025 22:50:30 -0400 Subject: [PATCH 3/6] wrap DiscreteMarginals class --- gtsam/discrete/discrete.i | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/gtsam/discrete/discrete.i b/gtsam/discrete/discrete.i index 2f15de4c6..27f1fdfa1 100644 --- a/gtsam/discrete/discrete.i +++ b/gtsam/discrete/discrete.i @@ -494,4 +494,18 @@ class DiscreteSearch { std::vector run(size_t K = 1) const; }; +#include + +class DiscreteMarginals { + DiscreteMarginals(); + DiscreteMarginals(const gtsam::DiscreteFactorGraph& graph); + + gtsam::DiscreteFactor* operator()(gtsam::Key variable) const; + gtsam::Vector marginalProbabilities(const gtsam::DiscreteKey& key) const; + + void print(const std::string& s = "", + const gtsam::KeyFormatter& keyFormatter = + gtsam::DefaultKeyFormatter) const; +}; + } // namespace gtsam From a01ece4515b7e956415bfdc08f270a440eefa1a7 Mon Sep 17 00:00:00 2001 From: Varun Agrawal Date: Tue, 13 May 2025 22:51:30 -0400 Subject: [PATCH 4/6] fix includes --- gtsam/discrete/DiscreteMarginals.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/gtsam/discrete/DiscreteMarginals.cpp b/gtsam/discrete/DiscreteMarginals.cpp index 74da37e73..1a9a986fd 100644 --- a/gtsam/discrete/DiscreteMarginals.cpp +++ b/gtsam/discrete/DiscreteMarginals.cpp @@ -21,9 +21,7 @@ #pragma once -#include -#include -#include +#include namespace gtsam { From e5c0557dba782d1b56cef29f837de40eacf85a0f Mon Sep 17 00:00:00 2001 From: Varun Agrawal Date: Tue, 13 May 2025 22:52:38 -0400 Subject: [PATCH 5/6] small fixes --- gtsam/discrete/DiscreteMarginals.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/gtsam/discrete/DiscreteMarginals.cpp b/gtsam/discrete/DiscreteMarginals.cpp index 1a9a986fd..60f9ba896 100644 --- a/gtsam/discrete/DiscreteMarginals.cpp +++ b/gtsam/discrete/DiscreteMarginals.cpp @@ -19,8 +19,6 @@ * @date June 4, 2012 */ -#pragma once - #include namespace gtsam { @@ -54,11 +52,10 @@ Vector DiscreteMarginals::marginalProbabilities(const DiscreteKey& key) const { } /* ************************************************************************* */ -void DiscreteMarginals::print( - const std::string& s = "", - const KeyFormatter formatter = DefaultKeyFormatter) const { +void DiscreteMarginals::print(const std::string& s, + const KeyFormatter formatter) const { std::cout << (s.empty() ? "Discrete Marginals of:" : s + " ") << std::endl; - bayesTree_.print("", formatter); + bayesTree_->print("", formatter); } } /* namespace gtsam */ From 1514a0d62e5b1bdb0c6739beea9c4341c153908f Mon Sep 17 00:00:00 2001 From: Varun Agrawal Date: Thu, 15 May 2025 10:29:03 -0400 Subject: [PATCH 6/6] mark DiscreteMarginals with GTSAM_EXPORT --- gtsam/discrete/DiscreteMarginals.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtsam/discrete/DiscreteMarginals.h b/gtsam/discrete/DiscreteMarginals.h index be2e17bcb..91082f491 100644 --- a/gtsam/discrete/DiscreteMarginals.h +++ b/gtsam/discrete/DiscreteMarginals.h @@ -31,7 +31,7 @@ namespace gtsam { * A class for computing marginals of variables in a DiscreteFactorGraph * @ingroup discrete */ -class DiscreteMarginals { +class GTSAM_EXPORT DiscreteMarginals { protected: DiscreteBayesTree::shared_ptr bayesTree_;