gtsam/gtsam/hybrid/HybridConditional.h

115 lines
3.3 KiB
C
Raw Normal View History

/* ----------------------------------------------------------------------------
* 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 HybridConditional.h
* @date Mar 11, 2022
* @author Fan Jiang
*/
#pragma once
#include <gtsam/discrete/DiscreteConditional.h>
2022-03-16 00:50:31 +08:00
#include <gtsam/hybrid/HybridFactor.h>
#include <gtsam/inference/Conditional.h>
#include <boost/make_shared.hpp>
#include <boost/shared_ptr.hpp>
2022-03-24 08:16:05 +08:00
#include <stdexcept>
#include <string>
2022-03-24 08:16:05 +08:00
#include <typeinfo>
#include <vector>
2022-03-24 08:16:05 +08:00
#include "gtsam/hybrid/GaussianMixture.h"
#include <gtsam/hybrid/HybridFactorGraph.h>
#include <gtsam/inference/Key.h>
#include <gtsam/linear/GaussianConditional.h>
namespace gtsam {
2022-03-24 08:16:05 +08:00
class HybridFactorGraph;
/**
* Hybrid Conditional Density
*
* As a type-erased variant of:
* - DiscreteConditional
* - GaussianConditional
2022-03-23 03:37:28 +08:00
* - GaussianMixture
*/
class GTSAM_EXPORT HybridConditional
2022-03-16 00:50:31 +08:00
: public HybridFactor,
public Conditional<HybridFactor, HybridConditional> {
public:
// typedefs needed to play nice with gtsam
2022-03-16 00:50:31 +08:00
typedef HybridConditional This; ///< Typedef to this class
typedef boost::shared_ptr<This> shared_ptr; ///< shared_ptr to this class
typedef HybridFactor BaseFactor; ///< Typedef to our factor base class
typedef Conditional<BaseFactor, This>
BaseConditional; ///< Typedef to our conditional base class
2022-03-24 08:16:05 +08:00
protected:
// Type-erased pointer to the inner type
2022-03-24 08:16:05 +08:00
boost::shared_ptr<Factor> inner;
2022-03-16 00:50:31 +08:00
public:
/// @name Standard Constructors
/// @{
/// Default constructor needed for serialization.
HybridConditional() = default;
2022-03-16 00:50:31 +08:00
HybridConditional(const KeyVector& continuousKeys,
const DiscreteKeys& discreteKeys, size_t nFrontals)
: BaseFactor(continuousKeys, discreteKeys), BaseConditional(nFrontals) {}
2022-03-23 03:37:28 +08:00
HybridConditional(const KeyVector& continuousFrontals,
const DiscreteKeys& discreteFrontals,
const KeyVector& continuousParents,
const DiscreteKeys& discreteParents);
HybridConditional(boost::shared_ptr<GaussianConditional> continuousConditional);
2022-03-24 08:16:05 +08:00
HybridConditional(boost::shared_ptr<DiscreteConditional> discreteConditional);
2022-03-23 03:37:28 +08:00
2022-03-24 08:16:05 +08:00
HybridConditional(boost::shared_ptr<GaussianMixture> gaussianMixture);
GaussianMixture::shared_ptr asMixture() {
if (!isHybrid_) throw std::invalid_argument("Not a mixture");
return boost::static_pointer_cast<GaussianMixture>(inner);
}
2022-03-16 00:50:31 +08:00
/// @}
/// @name Testable
/// @{
/// GTSAM-style print
void print(
const std::string& s = "Hybrid Conditional: ",
const KeyFormatter& formatter = DefaultKeyFormatter) const override;
/// GTSAM-style equals
bool equals(const HybridFactor& other, double tol = 1e-9) const override;
2022-03-16 00:50:31 +08:00
/// @}
2022-03-24 08:16:05 +08:00
friend std::pair<HybridConditional::shared_ptr, HybridFactor::shared_ptr> //
EliminateHybrid(const HybridFactorGraph& factors,
const Ordering& frontalKeys);
};
// DiscreteConditional
// traits
template <>
struct traits<HybridConditional> : public Testable<DiscreteConditional> {};
} // namespace gtsam