hybrid bayes net sample method

release/4.3a0
Varun Agrawal 2022-12-23 23:58:56 +05:30
parent 4fc02a6aa2
commit cdf1c4ec5d
2 changed files with 87 additions and 1 deletions

View File

@ -20,6 +20,9 @@
#include <gtsam/hybrid/HybridBayesNet.h>
#include <gtsam/hybrid/HybridValues.h>
// In Wrappers we have no access to this so have a default ready
static std::mt19937_64 kRandomNumberGenerator(42);
namespace gtsam {
/* ************************************************************************* */
@ -232,6 +235,43 @@ VectorValues HybridBayesNet::optimize(const DiscreteValues &assignment) const {
return gbn.optimize();
}
/* ************************************************************************* */
HybridValues HybridBayesNet::sample(VectorValues given, std::mt19937_64 *rng,
SharedDiagonal model) const {
DiscreteBayesNet dbn;
for (size_t idx = 0; idx < size(); idx++) {
if (factors_.at(idx)->isDiscrete()) {
// If factor at `idx` is discrete-only, we add to the discrete bayes net.
dbn.push_back(this->atDiscrete(idx));
}
}
// Sample a discrete assignment.
DiscreteValues assignment = dbn.sample();
// Select the continuous bayes net corresponding to the assignment.
GaussianBayesNet gbn = this->choose(assignment);
// Sample from the gaussian bayes net.
VectorValues sample = gbn.sample(given, rng, model);
return HybridValues(assignment, sample);
}
/* ************************************************************************* */
HybridValues HybridBayesNet::sample(std::mt19937_64 *rng,
SharedDiagonal model) const {
VectorValues given;
return sample(given, rng, model);
}
/* ************************************************************************* */
HybridValues HybridBayesNet::sample(VectorValues given,
SharedDiagonal model) const {
return sample(given, &kRandomNumberGenerator, model);
}
/* ************************************************************************* */
HybridValues HybridBayesNet::sample(SharedDiagonal model) const {
return sample(&kRandomNumberGenerator, model);
}
/* ************************************************************************* */
double HybridBayesNet::error(const VectorValues &continuousValues,
const DiscreteValues &discreteValues) const {

View File

@ -120,7 +120,53 @@ class GTSAM_EXPORT HybridBayesNet : public BayesNet<HybridConditional> {
*/
DecisionTreeFactor::shared_ptr discreteConditionals() const;
public:
/**
* @brief Sample from an incomplete BayesNet, given missing variables.
*
* Example:
* std::mt19937_64 rng(42);
* VectorValues given = ...;
* auto sample = bn.sample(given, &rng);
*
* @param given Values of missing variables.
* @param rng The pseudo-random number generator.
* @param model Optional diagonal noise model to use in sampling.
* @return HybridValues
*/
HybridValues sample(VectorValues given, std::mt19937_64 *rng,
SharedDiagonal model = nullptr) const;
/**
* @brief Sample using ancestral sampling.
*
* Example:
* std::mt19937_64 rng(42);
* auto sample = bn.sample(&rng);
*
* @param rng The pseudo-random number generator.
* @param model Optional diagonal noise model to use in sampling.
* @return HybridValues
*/
HybridValues sample(std::mt19937_64 *rng,
SharedDiagonal model = nullptr) const;
/**
* @brief Sample from an incomplete BayesNet, use default rng.
*
* @param given Values of missing variables.
* @param model Optional diagonal noise model to use in sampling.
* @return HybridValues
*/
HybridValues sample(VectorValues given, SharedDiagonal model = nullptr) const;
/**
* @brief Sample using ancestral sampling, use default rng.
*
* @param model Optional diagonal noise model to use in sampling.
* @return HybridValues
*/
HybridValues sample(SharedDiagonal model = nullptr) const;
/// Prune the Hybrid Bayes Net such that we have at most maxNrLeaves leaves.
HybridBayesNet prune(size_t maxNrLeaves);