Fixed ISAM2 doxygen documentation
							parent
							
								
									817bb913ab
								
							
						
					
					
						commit
						ec1e53a60d
					
				|  | @ -17,13 +17,13 @@ | ||||||
| namespace gtsam { | namespace gtsam { | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * @brief The main ISAM2 class that is exposed to gtsam users. |  * @brief The main ISAM2 class that is exposed to gtsam users, see ISAM2 for usage. | ||||||
|  * |  * | ||||||
|  * This is a thin wrapper around an ISAM2 class templated on |  * This is a thin wrapper around an ISAM2 class templated on | ||||||
|  * GaussianConditional, and the values on which that GaussianISAM2 is |  * GaussianConditional, and the values on which that GaussianISAM2 is | ||||||
|  * templated. |  * templated. | ||||||
|  * |  * | ||||||
|  * @tparam VALUES The LieValues or TupleValues\Emph{N} to contain the |  * @tparam VALUES The LieValues or TupleValues\Emph{N} that contains the | ||||||
|  * variables. |  * variables. | ||||||
|  */ |  */ | ||||||
| template <class VALUES> | template <class VALUES> | ||||||
|  |  | ||||||
|  | @ -807,6 +807,7 @@ void ISAM2<Conditional, Values>::update( | ||||||
| 
 | 
 | ||||||
|   tic(8,"recalculate"); |   tic(8,"recalculate"); | ||||||
|   // 8. Redo top of Bayes tree
 |   // 8. Redo top of Bayes tree
 | ||||||
|  |   boost::shared_ptr<FastSet<Index> > replacedKeys; | ||||||
|   if(markedKeys.size() > 0 || newKeys.size() > 0) |   if(markedKeys.size() > 0 || newKeys.size() > 0) | ||||||
|     replacedKeys = recalculate(markedKeys, structuralKeys, newKeys, linearFactors); |     replacedKeys = recalculate(markedKeys, structuralKeys, newKeys, linearFactors); | ||||||
|   toc(8,"recalculate"); |   toc(8,"recalculate"); | ||||||
|  |  | ||||||
|  | @ -29,80 +29,114 @@ | ||||||
| 
 | 
 | ||||||
| namespace gtsam { | namespace gtsam { | ||||||
| 
 | 
 | ||||||
| //typedef std::vector<GaussianFactor::shared_ptr> CachedFactors;
 | /**
 | ||||||
| 
 |  * Implementation of the full ISAM2 algorithm for incremental nonlinear optimization. | ||||||
|  |  * | ||||||
|  |  * The typical cycle of using this class to create an instance using the default | ||||||
|  |  * constructor, then add measurements and variables as they arrive using the update() | ||||||
|  |  * method.  At any time, calculateEstimate() may be called to obtain the current | ||||||
|  |  * estimate of all variables. | ||||||
|  |  */ | ||||||
| template<class CONDITIONAL, class VALUES> | template<class CONDITIONAL, class VALUES> | ||||||
| class ISAM2: public BayesTree<CONDITIONAL> { | class ISAM2: public BayesTree<CONDITIONAL> { | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 
 | 
 | ||||||
|   // current linearization point
 |   /** The current linearization point */ | ||||||
|   VALUES theta_; |   VALUES theta_; | ||||||
| 
 | 
 | ||||||
|   // VariableIndex lets us look up factors by involved variable and keeps track of dimensions
 |   /** VariableIndex lets us look up factors by involved variable and keeps track of dimensions */ | ||||||
|   VariableIndex variableIndex_; |   VariableIndex variableIndex_; | ||||||
| 
 | 
 | ||||||
|   // the linear solution, an update to the estimate in theta
 |   /** The linear delta from the last linear solution, an update to the estimate in theta */ | ||||||
|   VectorValues deltaUnpermuted_; |   VectorValues deltaUnpermuted_; | ||||||
| 
 | 
 | ||||||
|   // The residual permutation through which the deltaUnpermuted_ is
 |   /** @brief The permutation through which the deltaUnpermuted_ is
 | ||||||
|   // referenced.  Permuting the VectorVALUES is slow, so for performance the
 |    * referenced. | ||||||
|   // permutation is applied at access time instead of to the VectorVALUES
 |    * | ||||||
|   // itself.
 |    * Permuting Vector entries would be slow, so for performance we | ||||||
|  |    * instead maintain this permutation through which we access the linear delta | ||||||
|  |    * indirectly | ||||||
|  |    */ | ||||||
|   Permuted<VectorValues> delta_; |   Permuted<VectorValues> delta_; | ||||||
| 
 | 
 | ||||||
|   // for keeping all original nonlinear factors
 |   /** All original nonlinear factors are stored here to use during relinearization */ | ||||||
|   NonlinearFactorGraph<VALUES> nonlinearFactors_; |   NonlinearFactorGraph<VALUES> nonlinearFactors_; | ||||||
| 
 | 
 | ||||||
|   // The "ordering" allows converting Symbols to Index (integer) keys.  We
 |   /** @brief The current elimination ordering Symbols to Index (integer) keys.
 | ||||||
|   // keep it up to date as we add and reorder variables.
 |    * | ||||||
|  |    * We keep it up to date as we add and reorder variables. | ||||||
|  |    */ | ||||||
|   Ordering ordering_; |   Ordering ordering_; | ||||||
| 
 | 
 | ||||||
|   // cached intermediate results for restarting computation in the middle
 | private: | ||||||
|   //	CachedFactors cached_;
 |  | ||||||
| 
 |  | ||||||
| #ifndef NDEBUG | #ifndef NDEBUG | ||||||
|   std::vector<bool> lastRelinVariables_; |   std::vector<bool> lastRelinVariables_; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| public: |  | ||||||
| 
 |  | ||||||
|   typedef BayesTree<CONDITIONAL> Base; |  | ||||||
|   typedef ISAM2<CONDITIONAL, VALUES> This; |  | ||||||
| 
 |  | ||||||
|   /** Create an empty Bayes Tree */ |  | ||||||
|   ISAM2(); |  | ||||||
| 
 |  | ||||||
|   //	/** Create a Bayes Tree from a Bayes Net */
 |  | ||||||
|   //	ISAM2(const NonlinearFactorGraph<VALUES>& fg, const Ordering& ordering, const VALUES& config);
 |  | ||||||
| 
 |  | ||||||
|   /** Destructor */ |  | ||||||
|   virtual ~ISAM2() {} |  | ||||||
| 
 |  | ||||||
|   typedef typename BayesTree<CONDITIONAL>::sharedClique sharedClique; |  | ||||||
|   typedef typename BayesTree<CONDITIONAL>::Cliques Cliques; |  | ||||||
|   typedef JacobianFactor CacheFactor; |   typedef JacobianFactor CacheFactor; | ||||||
| 
 | 
 | ||||||
|  | public: | ||||||
|  | 
 | ||||||
|  |   typedef BayesTree<CONDITIONAL> Base; ///< The BayesTree base class
 | ||||||
|  |   typedef ISAM2<CONDITIONAL, VALUES> This; ///< This class
 | ||||||
|  | 
 | ||||||
|  |   /** Create an empty ISAM2 instance */ | ||||||
|  |   ISAM2(); | ||||||
|  | 
 | ||||||
|  |   typedef typename BayesTree<CONDITIONAL>::sharedClique sharedClique; ///< Shared pointer to a clique
 | ||||||
|  |   typedef typename BayesTree<CONDITIONAL>::Cliques Cliques; ///< List of Clique typedef from base class
 | ||||||
|  | 
 | ||||||
|   /**
 |   /**
 | ||||||
|    * ISAM2. |    * Add new factors, updating the solution and relinearizing as needed. | ||||||
|  |    * | ||||||
|  |    * Add new measurements, and optionally new variables, to the current system. | ||||||
|  |    * This runs a full step of the ISAM2 algorithm, relinearizing and updating | ||||||
|  |    * the solution as needed, according to the wildfire and relinearize | ||||||
|  |    * thresholds. | ||||||
|  |    * | ||||||
|  |    * @param newFactors The new factors to be added to the system | ||||||
|  |    * @param newTheta Initialization points for new variables to be added to the system. | ||||||
|  |    * You must include here all new variables occuring in newFactors (which were not already | ||||||
|  |    * in the system).  There must not be any variables here that do not occur in newFactors, | ||||||
|  |    * and additionally, variables that were already in the system must not be included here. | ||||||
|  |    * @param wildfire_threshold The threshold below which the linear solution delta is not | ||||||
|  |    * updated. | ||||||
|  |    * @param relinearize_threshold The threshold on the linear delta below which a variable | ||||||
|  |    * will not be relinearized. | ||||||
|  |    * @param relinearize | ||||||
|    */ |    */ | ||||||
|   void update(const NonlinearFactorGraph<VALUES>& newFactors, const VALUES& newTheta, |   void update(const NonlinearFactorGraph<VALUES>& newFactors, const VALUES& newTheta, | ||||||
|       double wildfire_threshold = 0., double relinearize_threshold = 0., bool relinearize = true, |       double wildfire_threshold = 0., double relinearize_threshold = 0., bool relinearize = true, | ||||||
|       bool force_relinearize = false); |       bool force_relinearize = false); | ||||||
| 
 | 
 | ||||||
|   // needed to create initial estimates
 |   /** Access the current linearization point
 | ||||||
|   const VALUES& getLinearizationPoint() const {return theta_;} |   const VALUES& getLinearizationPoint() const {return theta_;} | ||||||
| 
 | 
 | ||||||
|   // estimate based on incomplete delta (threshold!)
 |   /** Compute an estimate from the incomplete linear delta computed during the last update.
 | ||||||
|  |    * This delta is incomplete because it was not updated below wildfire_threshold. | ||||||
|  |    */ | ||||||
|   VALUES calculateEstimate() const; |   VALUES calculateEstimate() const; | ||||||
| 
 | 
 | ||||||
|   // estimate based on full delta (note that this is based on the current linearization point)
 |   /// @name Public members for non-typical usage
 | ||||||
|  |   //@{
 | ||||||
|  | 
 | ||||||
|  |   /** Internal implementation functions */ | ||||||
|  |   struct Impl { | ||||||
|  |     static void AddVariables(const VALUES& newTheta, VALUES& theta, Permuted<VectorValues>& delta, Ordering& ordering, typename Base::Nodes& nodes); | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   /** Compute an estimate using a complete delta computed by a full back-substitution.
 | ||||||
|  |    */ | ||||||
|   VALUES calculateBestEstimate() const; |   VALUES calculateBestEstimate() const; | ||||||
| 
 | 
 | ||||||
|  |   /** Access the current delta, computed during the last call to update */ | ||||||
|   const Permuted<VectorValues>& getDelta() const { return delta_; } |   const Permuted<VectorValues>& getDelta() const { return delta_; } | ||||||
| 
 | 
 | ||||||
|  |   /** Access the set of nonlinear factors */ | ||||||
|   const NonlinearFactorGraph<VALUES>& getFactorsUnsafe() const { return nonlinearFactors_; } |   const NonlinearFactorGraph<VALUES>& getFactorsUnsafe() const { return nonlinearFactors_; } | ||||||
| 
 | 
 | ||||||
|  |   /** Access the current ordering */ | ||||||
|   const Ordering& getOrdering() const { return ordering_; } |   const Ordering& getOrdering() const { return ordering_; } | ||||||
| 
 | 
 | ||||||
|   size_t lastAffectedVariableCount; |   size_t lastAffectedVariableCount; | ||||||
|  | @ -112,7 +146,7 @@ public: | ||||||
|   size_t lastBacksubVariableCount; |   size_t lastBacksubVariableCount; | ||||||
|   size_t lastNnzTop; |   size_t lastNnzTop; | ||||||
| 
 | 
 | ||||||
|   boost::shared_ptr<FastSet<Index> > replacedKeys; |   //@}
 | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
| 
 | 
 | ||||||
|  | @ -124,12 +158,6 @@ private: | ||||||
|   //	void linear_update(const GaussianFactorGraph& newFactors);
 |   //	void linear_update(const GaussianFactorGraph& newFactors);
 | ||||||
|   void find_all(sharedClique clique, FastSet<Index>& keys, const std::vector<bool>& marked); // helper function
 |   void find_all(sharedClique clique, FastSet<Index>& keys, const std::vector<bool>& marked); // helper function
 | ||||||
| 
 | 
 | ||||||
| public: |  | ||||||
| 
 |  | ||||||
|   struct Impl { |  | ||||||
|     static void AddVariables(const VALUES& newTheta, VALUES& theta, Permuted<VectorValues>& delta, Ordering& ordering, typename Base::Nodes& nodes); |  | ||||||
|   }; |  | ||||||
| 
 |  | ||||||
| }; // ISAM2
 | }; // ISAM2
 | ||||||
| 
 | 
 | ||||||
| } /// namespace gtsam
 | } /// namespace gtsam
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue