/** * @file NonlinearFactorGraph-inl.h * @brief Factor Graph Consisting of non-linear factors * @author Frank Dellaert * @author Carlos Nieto * @author Christian Potthast */ #pragma once #include #include "GaussianFactorGraph.h" #include "NonlinearFactorGraph.h" #include "FactorGraph-inl.h" #define INSTANTIATE_NONLINEAR_FACTOR_GRAPH(C) \ INSTANTIATE_FACTOR_GRAPH(NonlinearFactor); \ template class NonlinearFactorGraph; using namespace std; namespace gtsam { /* ************************************************************************* */ template Vector NonlinearFactorGraph::unwhitenedError(const Config& c) const { list errors; BOOST_FOREACH(typename NonlinearFactorGraph::sharedFactor factor, this->factors_) errors.push_back(factor->unwhitenedError(c)); return concatVectors(errors); } /* ************************************************************************* */ template double NonlinearFactorGraph::error(const Config& c) const { double total_error = 0.; // iterate over all the factors_ to accumulate the log probabilities BOOST_FOREACH(typename NonlinearFactorGraph::sharedFactor factor, this->factors_) total_error += factor->error(c); return total_error; } /* ************************************************************************* */ template boost::shared_ptr NonlinearFactorGraph::linearize_( const Config& config) const{ // create an empty linear FG boost::shared_ptr linearFG(new GaussianFactorGraph); // linearize all factors BOOST_FOREACH(typename NonlinearFactorGraph::sharedFactor factor, this->factors_) { boost::shared_ptr lf = factor->linearize(config); linearFG->push_back(lf); } return linearFG; } /* ************************************************************************* */ template GaussianFactorGraph NonlinearFactorGraph::linearize( const Config& config) const { return *linearize_(config); } } // namespace gtsam