2022-03-12 04:52:28 +08:00
|
|
|
/* ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
* 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>
|
2022-03-12 04:52:28 +08:00
|
|
|
#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>
|
2022-03-12 04:52:28 +08:00
|
|
|
#include <string>
|
2022-03-24 08:16:05 +08:00
|
|
|
#include <typeinfo>
|
2022-03-12 04:52:28 +08:00
|
|
|
#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>
|
2022-03-12 04:52:28 +08:00
|
|
|
|
|
|
|
namespace gtsam {
|
|
|
|
|
2022-03-24 08:16:05 +08:00
|
|
|
class HybridFactorGraph;
|
|
|
|
|
2022-03-12 04:52:28 +08:00
|
|
|
/**
|
|
|
|
* Hybrid Conditional Density
|
|
|
|
*
|
|
|
|
* As a type-erased variant of:
|
|
|
|
* - DiscreteConditional
|
|
|
|
* - GaussianConditional
|
2022-03-23 03:37:28 +08:00
|
|
|
* - GaussianMixture
|
2022-03-12 04:52:28 +08:00
|
|
|
*/
|
|
|
|
class GTSAM_EXPORT HybridConditional
|
2022-03-16 00:50:31 +08:00
|
|
|
: public HybridFactor,
|
|
|
|
public Conditional<HybridFactor, HybridConditional> {
|
|
|
|
public:
|
2022-03-14 08:09:53 +08:00
|
|
|
// typedefs needed to play nice with gtsam
|
2022-03-16 00:50:31 +08:00
|
|
|
typedef HybridConditional This; ///< Typedef to this class
|
2022-03-14 08:09:53 +08:00
|
|
|
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-12 04:52:28 +08:00
|
|
|
|
2022-03-24 08:16:05 +08:00
|
|
|
protected:
|
2022-03-14 08:09:53 +08:00
|
|
|
// Type-erased pointer to the inner type
|
2022-03-24 08:16:05 +08:00
|
|
|
boost::shared_ptr<Factor> inner;
|
2022-03-12 04:52:28 +08:00
|
|
|
|
2022-03-16 00:50:31 +08:00
|
|
|
public:
|
|
|
|
/// @name Standard Constructors
|
|
|
|
/// @{
|
2022-03-12 04:52:28 +08:00
|
|
|
|
2022-03-14 08:09:53 +08:00
|
|
|
/// 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-14 08:09:53 +08:00
|
|
|
|
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-12 04:52:28 +08:00
|
|
|
|
2022-03-16 00:50:31 +08:00
|
|
|
/// @}
|
|
|
|
/// @name Testable
|
|
|
|
/// @{
|
2022-03-12 04:52:28 +08:00
|
|
|
|
2022-03-14 08:09:53 +08:00
|
|
|
/// GTSAM-style print
|
|
|
|
void print(
|
|
|
|
const std::string& s = "Hybrid Conditional: ",
|
|
|
|
const KeyFormatter& formatter = DefaultKeyFormatter) const override;
|
2022-03-12 04:52:28 +08:00
|
|
|
|
2022-03-14 08:09:53 +08:00
|
|
|
/// GTSAM-style equals
|
|
|
|
bool equals(const HybridFactor& other, double tol = 1e-9) const override;
|
2022-03-12 04:52:28 +08:00
|
|
|
|
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);
|
2022-03-12 04:52:28 +08:00
|
|
|
};
|
|
|
|
// DiscreteConditional
|
|
|
|
|
|
|
|
// traits
|
|
|
|
template <>
|
|
|
|
struct traits<HybridConditional> : public Testable<DiscreteConditional> {};
|
|
|
|
|
|
|
|
} // namespace gtsam
|