/* ************************************************************************* */ void NonlinearISAM::update(const NonlinearFactorGraph& newFactors, const Values& initialValues) { if(newFactors.size() > 0) { // Reorder and relinearize every reorderInterval updates if(reorderInterval_ > 0 && ++reorderCounter_ >= reorderInterval_) { reorder_relinearize(); reorderCounter_ = 0; } factors_.push_back(newFactors); // Linearize new factors and insert them // TODO: optimize for whole config? linPoint_.insert(initialValues); // Augment ordering // TODO: allow for ordering constraints within the new variables // FIXME: should just loop over new values BOOST_FOREACH(const NonlinearFactorGraph::sharedFactor& factor, newFactors) BOOST_FOREACH(Key key, factor->keys()) ordering_.tryInsert(key, ordering_.nVars()); // will do nothing if already present boost::shared_ptr<GaussianFactorGraph> linearizedNewFactors = newFactors.linearize(linPoint_, ordering_); // Update ISAM isam_.update(*linearizedNewFactors); } }
/* ************************************************************************* */ void NonlinearISAM::update(const NonlinearFactorGraph& newFactors, const Values& initialValues) { if(newFactors.size() > 0) { // Reorder and relinearize every reorderInterval updates if(reorderInterval_ > 0 && ++reorderCounter_ >= reorderInterval_) { reorder_relinearize(); reorderCounter_ = 0; } factors_.push_back(newFactors); // Linearize new factors and insert them // TODO: optimize for whole config? linPoint_.insert(initialValues); boost::shared_ptr<GaussianFactorGraph> linearizedNewFactors = newFactors.linearize(linPoint_); // Update ISAM isam_.update(*linearizedNewFactors, eliminationFunction_); } }