diff --git a/gtsam/hybrid/HybridFactorGraph.cpp b/gtsam/hybrid/HybridFactorGraph.cpp index 098942f106..7fb2801162 100644 --- a/gtsam/hybrid/HybridFactorGraph.cpp +++ b/gtsam/hybrid/HybridFactorGraph.cpp @@ -45,9 +45,10 @@ std::set HybridFactorGraph::discreteKeys() const { /* ************************************************************************* */ KeySet HybridFactorGraph::discreteKeySet() const { KeySet keys; - for (const DiscreteKey& k : discreteKeys()) { - keys.insert(k.first); - } + std::set key_set = discreteKeys(); + std::transform(key_set.begin(), key_set.end(), + std::inserter(keys, keys.begin()), + [](const DiscreteKey& k) { return k.first; }); return keys; } diff --git a/gtsam/hybrid/HybridNonlinearFactorGraph.h b/gtsam/hybrid/HybridNonlinearFactorGraph.h index ebefb52cb6..0cc87d5043 100644 --- a/gtsam/hybrid/HybridNonlinearFactorGraph.h +++ b/gtsam/hybrid/HybridNonlinearFactorGraph.h @@ -74,7 +74,7 @@ class GTSAM_EXPORT HybridNonlinearFactorGraph : public HybridFactorGraph { * @param continuousValues: Dictionary of continuous values. * @return HybridGaussianFactorGraph::shared_ptr */ - HybridGaussianFactorGraph::shared_ptr linearize( + boost::shared_ptr linearize( const Values& continuousValues) const; /// @} }; diff --git a/gtsam/hybrid/MixtureFactor.h b/gtsam/hybrid/MixtureFactor.h index 38905b8a29..220f1bdbf9 100644 --- a/gtsam/hybrid/MixtureFactor.h +++ b/gtsam/hybrid/MixtureFactor.h @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -160,10 +161,14 @@ class MixtureFactor : public HybridFactor { factor, continuousValues); } - /// Error for HybridValues is not provided for nonlinear hybrid factor. + /** + * @brief Compute error of factor given hybrid values. + * + * @param values The continuous Values and the discrete assignment. + * @return double The error of this factor. + */ double error(const HybridValues& values) const override { - throw std::runtime_error( - "MixtureFactor::error(HybridValues) not implemented."); + return error(values.nonlinear(), values.discrete()); } /** diff --git a/gtsam/linear/GaussianConditional.cpp b/gtsam/linear/GaussianConditional.cpp index 7792e119b6..cb8726d7a4 100644 --- a/gtsam/linear/GaussianConditional.cpp +++ b/gtsam/linear/GaussianConditional.cpp @@ -124,7 +124,7 @@ namespace gtsam { cout << formatMatrixIndented(" d = ", getb(), true) << "\n"; if (nrParents() == 0) { const auto mean = solve({}); // solve for mean. - mean.print(" mean"); + mean.print(" mean", formatter); } if (model_) model_->print(" Noise model: ");