Alternative ISAM2::update() signature, easier to extend.
The old update() method still exists and calls the new one. The idea is that by using a struct, it is easier (i.e. API/ABI compatibility) to add the new parameters that we will need to add next.release/4.3a0
							parent
							
								
									ef174aabb8
								
							
						
					
					
						commit
						17edca2426
					
				| 
						 | 
				
			
			@ -544,6 +544,22 @@ ISAM2Result ISAM2::update(
 | 
			
		|||
    const boost::optional<FastList<Key> >& noRelinKeys,
 | 
			
		||||
    const boost::optional<FastList<Key> >& extraReelimKeys,
 | 
			
		||||
    bool force_relinearize) {
 | 
			
		||||
 | 
			
		||||
  ISAM2UpdateParams params;
 | 
			
		||||
  params.constrainedKeys = constrainedKeys;
 | 
			
		||||
  params.extraReelimKeys = extraReelimKeys;
 | 
			
		||||
  params.force_relinearize = force_relinearize;
 | 
			
		||||
  params.noRelinKeys = noRelinKeys;
 | 
			
		||||
  params.removeFactorIndices = removeFactorIndices;
 | 
			
		||||
 | 
			
		||||
  return update(newFactors, newTheta, params);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
ISAM2Result ISAM2::update(
 | 
			
		||||
    const NonlinearFactorGraph& newFactors,
 | 
			
		||||
    const Values& newTheta,
 | 
			
		||||
    const ISAM2UpdateParams& up) {
 | 
			
		||||
  const bool debug = ISDEBUG("ISAM2 update");
 | 
			
		||||
  const bool verbose = ISDEBUG("ISAM2 update verbose");
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -561,7 +577,7 @@ ISAM2Result ISAM2::update(
 | 
			
		|||
  if (params_.enableDetailedResults)
 | 
			
		||||
    result.detail = ISAM2Result::DetailedResults();
 | 
			
		||||
  const bool relinearizeThisStep =
 | 
			
		||||
      force_relinearize || (params_.enableRelinearization &&
 | 
			
		||||
      up.force_relinearize || (params_.enableRelinearization &&
 | 
			
		||||
                            update_count_ % params_.relinearizeSkip == 0);
 | 
			
		||||
 | 
			
		||||
  if (verbose) {
 | 
			
		||||
| 
						 | 
				
			
			@ -585,8 +601,8 @@ ISAM2Result ISAM2::update(
 | 
			
		|||
 | 
			
		||||
  // Remove the removed factors
 | 
			
		||||
  NonlinearFactorGraph removeFactors;
 | 
			
		||||
  removeFactors.reserve(removeFactorIndices.size());
 | 
			
		||||
  for (const auto index : removeFactorIndices) {
 | 
			
		||||
  removeFactors.reserve(up.removeFactorIndices.size());
 | 
			
		||||
  for (const auto index : up.removeFactorIndices) {
 | 
			
		||||
    removeFactors.push_back(nonlinearFactors_[index]);
 | 
			
		||||
    nonlinearFactors_.remove(index);
 | 
			
		||||
    if (params_.cacheLinearizedFactors) linearFactors_.remove(index);
 | 
			
		||||
| 
						 | 
				
			
			@ -594,7 +610,8 @@ ISAM2Result ISAM2::update(
 | 
			
		|||
 | 
			
		||||
  // Remove removed factors from the variable index so we do not attempt to
 | 
			
		||||
  // relinearize them
 | 
			
		||||
  variableIndex_.remove(removeFactorIndices.begin(), removeFactorIndices.end(),
 | 
			
		||||
  variableIndex_.remove(up.removeFactorIndices.begin(),
 | 
			
		||||
                        up.removeFactorIndices.end(),
 | 
			
		||||
                        removeFactors);
 | 
			
		||||
 | 
			
		||||
  // Compute unused keys and indices
 | 
			
		||||
| 
						 | 
				
			
			@ -649,8 +666,8 @@ ISAM2Result ISAM2::update(
 | 
			
		|||
        markedRemoveKeys.end());  // Add to the overall set of marked keys
 | 
			
		||||
  }
 | 
			
		||||
  // Also mark any provided extra re-eliminate keys
 | 
			
		||||
  if (extraReelimKeys) {
 | 
			
		||||
    for (Key key : *extraReelimKeys) {
 | 
			
		||||
  if (up.extraReelimKeys) {
 | 
			
		||||
    for (Key key : *up.extraReelimKeys) {
 | 
			
		||||
      markedKeys.insert(key);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -695,8 +712,8 @@ ISAM2Result ISAM2::update(
 | 
			
		|||
    for (Key key : fixedVariables_) {
 | 
			
		||||
      relinKeys.erase(key);
 | 
			
		||||
    }
 | 
			
		||||
    if (noRelinKeys) {
 | 
			
		||||
      for (Key key : *noRelinKeys) {
 | 
			
		||||
    if (up.noRelinKeys) {
 | 
			
		||||
      for (Key key : *up.noRelinKeys) {
 | 
			
		||||
        relinKeys.erase(key);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -780,7 +797,7 @@ ISAM2Result ISAM2::update(
 | 
			
		|||
  boost::shared_ptr<KeySet> replacedKeys;
 | 
			
		||||
  if (!markedKeys.empty() || !observedKeys.empty())
 | 
			
		||||
    replacedKeys = recalculate(markedKeys, relinKeys, observedKeys,
 | 
			
		||||
                               unusedIndices, constrainedKeys, &result);
 | 
			
		||||
                               unusedIndices, up.constrainedKeys, &result);
 | 
			
		||||
 | 
			
		||||
  // Update replaced keys mask (accumulates until back-substitution takes place)
 | 
			
		||||
  if (replacedKeys)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,6 +23,7 @@
 | 
			
		|||
#include <gtsam/nonlinear/ISAM2Params.h>
 | 
			
		||||
#include <gtsam/nonlinear/ISAM2Result.h>
 | 
			
		||||
#include <gtsam/nonlinear/ISAM2Clique.h>
 | 
			
		||||
#include <gtsam/nonlinear/ISAM2UpdateParams.h>
 | 
			
		||||
#include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
			
		||||
#include <gtsam/linear/GaussianBayesTree.h>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -156,6 +157,20 @@ class GTSAM_EXPORT ISAM2 : public BayesTree<ISAM2Clique> {
 | 
			
		|||
      const boost::optional<FastList<Key> >& extraReelimKeys = boost::none,
 | 
			
		||||
      bool force_relinearize = false);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Alternative signature of update() with all additional parameters in one
 | 
			
		||||
   * structure. This form makes easier to keep future API/ABI compatibility if
 | 
			
		||||
   * parameters change.
 | 
			
		||||
   *
 | 
			
		||||
   * @param extraParams Additional parameters to control relinearization,
 | 
			
		||||
   * constrained keys, etc.
 | 
			
		||||
   * @return An ISAM2Result struct containing information about the update
 | 
			
		||||
   * @note No default parameters to avoid ambiguous call errors.
 | 
			
		||||
   */
 | 
			
		||||
  virtual ISAM2Result update(
 | 
			
		||||
      const NonlinearFactorGraph& newFactors, const Values& newTheta,
 | 
			
		||||
      const ISAM2UpdateParams& up);
 | 
			
		||||
 | 
			
		||||
  /** Marginalize out variables listed in leafKeys.  These keys must be leaves
 | 
			
		||||
   * in the BayesTree.  Throws MarginalizeNonleafException if non-leaves are
 | 
			
		||||
   * requested to be marginalized.  Marginalization leaves a linear
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,57 @@
 | 
			
		|||
/* ----------------------------------------------------------------------------
 | 
			
		||||
 * 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    ISAM2UpdateParams.h
 | 
			
		||||
 * @brief   Class that stores extra params for ISAM2::update()
 | 
			
		||||
 * @author  Michael Kaess, Richard Roberts, Frank Dellaert, Jose Luis Blanco
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
// \callgraph
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <boost/optional.hpp>
 | 
			
		||||
#include <gtsam/base/FastList.h>
 | 
			
		||||
#include <gtsam/dllexport.h>             // GTSAM_EXPORT
 | 
			
		||||
#include <gtsam/inference/Key.h>         // Key, KeySet
 | 
			
		||||
#include <gtsam/nonlinear/ISAM2Result.h> //FactorIndices
 | 
			
		||||
 | 
			
		||||
namespace gtsam {
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @addtogroup ISAM2
 | 
			
		||||
 * This struct is used by ISAM2::update() to pass additional parameters to
 | 
			
		||||
 * give the user a fine-grained control on how factors and relinearized, etc.
 | 
			
		||||
 */
 | 
			
		||||
struct GTSAM_EXPORT ISAM2UpdateParams {
 | 
			
		||||
  ISAM2UpdateParams() = default;
 | 
			
		||||
 | 
			
		||||
  /** Indices of factors to remove from system (default: empty) */
 | 
			
		||||
  FactorIndices removeFactorIndices;
 | 
			
		||||
 | 
			
		||||
  /* An optional map of keys to group labels, such that a variable can be
 | 
			
		||||
   * constrained to a particular grouping in the BayesTree */
 | 
			
		||||
  boost::optional<FastMap<Key, int>> constrainedKeys{boost::none};
 | 
			
		||||
 | 
			
		||||
  /* An optional set of nonlinear keys that iSAM2 will hold at a constant
 | 
			
		||||
   * linearization point, regardless of the size of the linear delta */
 | 
			
		||||
  boost::optional<FastList<Key>> noRelinKeys{boost::none};
 | 
			
		||||
 | 
			
		||||
  /* An optional set of nonlinear keys that iSAM2 will re-eliminate, regardless
 | 
			
		||||
   * of the size of the linear delta. This allows the provided keys to be
 | 
			
		||||
   * reordered. */
 | 
			
		||||
  boost::optional<FastList<Key>> extraReelimKeys{boost::none};
 | 
			
		||||
 | 
			
		||||
  /* Relinearize any variables whose delta magnitude is sufficiently large
 | 
			
		||||
   * (Params::relinearizeThreshold), regardless of the relinearization
 | 
			
		||||
   * interval (Params::relinearizeSkip). */
 | 
			
		||||
  bool force_relinearize{false};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace gtsam
 | 
			
		||||
		Loading…
	
		Reference in New Issue