VectorConfig/Config confusion resolved; planarSLAM integrated
							parent
							
								
									eb3e0067ef
								
							
						
					
					
						commit
						18414b1286
					
				|  | @ -11,7 +11,9 @@ using namespace gtsam; | |||
| 
 | ||||
| // Explicitly instantiate so we don't have to include everywhere
 | ||||
| #include "ISAM2-inl.h" | ||||
| 
 | ||||
| //template class ISAM2<GaussianConditional, VectorConfig>;
 | ||||
| //template class ISAM2<GaussianConditional, planarSLAM::Config>;
 | ||||
| 
 | ||||
| namespace gtsam { | ||||
| 
 | ||||
|  | @ -25,8 +27,6 @@ void optimize2(const GaussianISAM2::sharedClique& clique, VectorConfig& result) | |||
|     result.insert(cg->key(), x);   // store result in partial solution
 | ||||
|   } | ||||
| 	BOOST_FOREACH(GaussianISAM2::sharedClique child, clique->children_) { | ||||
| //	list<GaussianISAM2::Clique::shared_ptr>::const_iterator child;
 | ||||
| //	for (child = clique->children_.begin(); child != clique->children_.end(); child++) {
 | ||||
| 		optimize2(child, result); | ||||
| 	} | ||||
| } | ||||
|  | @ -39,4 +39,27 @@ VectorConfig optimize2(const GaussianISAM2& bayesTree) { | |||
| 	return result; | ||||
| } | ||||
| 
 | ||||
| #if 0 | ||||
| /* ************************************************************************* */ | ||||
| void optimize2(const GaussianISAM2_P::sharedClique& clique, VectorConfig& result) { | ||||
| 	// parents are assumed to already be solved and available in result
 | ||||
| 	GaussianISAM2_P::Clique::const_reverse_iterator it; | ||||
| 	for (it = clique->rbegin(); it!=clique->rend(); it++) { | ||||
| 		GaussianConditional::shared_ptr cg = *it; | ||||
|     result.insert(cg->key(), cg->solve(result));   // store result in partial solution
 | ||||
|   } | ||||
| 	BOOST_FOREACH(GaussianISAM2_P::sharedClique child, clique->children_) { | ||||
| 		optimize2(child, result); | ||||
| 	} | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| VectorConfig optimize2(const GaussianISAM2_P& bayesTree) { | ||||
| 	VectorConfig result; | ||||
| 	// starting from the root, call optimize on each conditional
 | ||||
| 	optimize2(bayesTree.root(), result); | ||||
| 	return result; | ||||
| } | ||||
| 
 | ||||
| } /// namespace gtsam
 | ||||
|  |  | |||
|  | @ -11,6 +11,7 @@ | |||
| #include "ISAM2.h" | ||||
| #include "GaussianConditional.h" | ||||
| #include "GaussianFactor.h" | ||||
| #include "planarSLAM.h" | ||||
| 
 | ||||
| namespace gtsam { | ||||
| 
 | ||||
|  | @ -22,4 +23,15 @@ namespace gtsam { | |||
| 	// optimize the BayesTree, starting from the root
 | ||||
| 	VectorConfig optimize2(const GaussianISAM2& bayesTree); | ||||
| 
 | ||||
| 
 | ||||
| 	// todo: copy'n'paste to avoid template hell
 | ||||
| 
 | ||||
| 	typedef ISAM2<GaussianConditional, planarSLAM::Config> GaussianISAM2_P; | ||||
| 
 | ||||
| 	// recursively optimize this conditional and all subtrees
 | ||||
| //	void optimize2(const GaussianISAM2_P::sharedClique& clique, VectorConfig& result);
 | ||||
| 
 | ||||
| 	// optimize the BayesTree, starting from the root
 | ||||
| 	VectorConfig optimize2(const GaussianISAM2_P& bayesTree); | ||||
| 
 | ||||
| }/// namespace gtsam
 | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ namespace gtsam { | |||
| 	using namespace std; | ||||
| 
 | ||||
| 	// from inference-inl.h - need to additionally return the newly created factor for caching
 | ||||
| 	boost::shared_ptr<GaussianConditional> _eliminateOne(FactorGraph<GaussianFactor>& graph, cachedFactors& cached, const Symbol& key) { | ||||
| 	boost::shared_ptr<GaussianConditional> _eliminateOne(FactorGraph<GaussianFactor>& graph, CachedFactors& cached, const Symbol& key) { | ||||
| 
 | ||||
| 		// combine the factors of all nodes connected to the variable to be eliminated
 | ||||
| 		// if no factors are connected to key, returns an empty factor
 | ||||
|  | @ -45,7 +45,7 @@ namespace gtsam { | |||
| 	} | ||||
| 
 | ||||
| 	// from GaussianFactorGraph.cpp, see _eliminateOne above
 | ||||
| 	GaussianBayesNet _eliminate(FactorGraph<GaussianFactor>& graph, cachedFactors& cached, const Ordering& ordering) { | ||||
| 	GaussianBayesNet _eliminate(FactorGraph<GaussianFactor>& graph, CachedFactors& cached, const Ordering& ordering) { | ||||
| 		GaussianBayesNet chordalBayesNet; // empty
 | ||||
| 		BOOST_FOREACH(const Symbol& key, ordering) { | ||||
| 			GaussianConditional::shared_ptr cg = _eliminateOne(graph, cached, key); | ||||
|  | @ -54,7 +54,7 @@ namespace gtsam { | |||
| 		return chordalBayesNet; | ||||
| 	} | ||||
| 
 | ||||
| 	GaussianBayesNet _eliminate_const(const FactorGraph<GaussianFactor>& graph, cachedFactors& cached, const Ordering& ordering) { | ||||
| 	GaussianBayesNet _eliminate_const(const FactorGraph<GaussianFactor>& graph, CachedFactors& cached, const Ordering& ordering) { | ||||
| 		// make a copy that can be modified locally
 | ||||
| 		FactorGraph<GaussianFactor> graph_ignored = graph; | ||||
| 		return _eliminate(graph_ignored, cached, ordering); | ||||
|  | @ -67,9 +67,9 @@ namespace gtsam { | |||
| 	/** Create a Bayes Tree from a nonlinear factor graph */ | ||||
| 	template<class Conditional, class Config> | ||||
| 	ISAM2<Conditional, Config>::ISAM2(const NonlinearFactorGraph<Config>& nlfg, const Ordering& ordering, const Config& config) | ||||
| 	: BayesTree<Conditional>(nlfg.linearize(config).eliminate(ordering)), nonlinearFactors_(nlfg), linPoint_(config), estimate_(config) { | ||||
| 	: BayesTree<Conditional>(nlfg.linearize(config).eliminate(ordering)), nonlinearFactors_(nlfg), linPoint_(config) { | ||||
| 		// todo: repeats calculation above, just to set "cached"
 | ||||
| 		_eliminate_const(nlfg.linearize(config), cached, ordering); | ||||
| 		_eliminate_const(nlfg.linearize(config), cached_, ordering); | ||||
| 	} | ||||
| 
 | ||||
| 	/* ************************************************************************* */ | ||||
|  | @ -108,7 +108,7 @@ namespace gtsam { | |||
| 			it--; | ||||
| 			const Symbol& key = *it; | ||||
| 			// retrieve the cached factor and add to boundary
 | ||||
| 			cachedBoundary.push_back(cached[key]); | ||||
| 			cachedBoundary.push_back(cached_[key]); | ||||
| 		} | ||||
| 
 | ||||
| 		return cachedBoundary; | ||||
|  | @ -119,13 +119,16 @@ namespace gtsam { | |||
| 	void ISAM2<Conditional, Config>::update_internal(const NonlinearFactorGraph<Config>& newFactors, | ||||
| 			const Config& config, Cliques& orphans) { | ||||
| 
 | ||||
| #if 0 // todo - temporarily disabled --------------------------------------------------------------------------------------------------
 | ||||
| 		// copy variables into config_, but don't overwrite existing entries (current linearization point!)
 | ||||
| 		for (typename Config::const_iterator it = config.begin(); it!=config.end(); it++) { | ||||
| 			if (!linPoint_.contains(it->first)) { | ||||
| 				linPoint_.insert(it->first, it->second); | ||||
| 				estimate_.insert(it->first, it->second); | ||||
| 			} | ||||
| 		} | ||||
| #else | ||||
| 		linPoint_ = config; | ||||
| #endif | ||||
| 
 | ||||
| 		FactorGraph<GaussianFactor> newFactorsLinearized = newFactors.linearize(linPoint_); | ||||
| 
 | ||||
|  | @ -155,7 +158,7 @@ namespace gtsam { | |||
| 		} | ||||
| 
 | ||||
| 		// eliminate into a Bayes net
 | ||||
| 		BayesNet<Conditional> bayesNet = _eliminate(factors, cached, ordering); | ||||
| 		BayesNet<Conditional> bayesNet = _eliminate(factors, cached_, ordering); | ||||
| 
 | ||||
| 		// remember the new factors for later relinearization
 | ||||
| 		nonlinearFactors_.push_back(newFactors); | ||||
|  | @ -176,9 +179,7 @@ namespace gtsam { | |||
| 		} | ||||
| 
 | ||||
| 		// update solution - todo: potentially expensive
 | ||||
| 		VectorConfig delta = optimize2(*this); | ||||
| //		delta.print();
 | ||||
| 		estimate_ += delta; | ||||
| 		delta_ = optimize2(*this); | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										10
									
								
								cpp/ISAM2.h
								
								
								
								
							
							
						
						
									
										10
									
								
								cpp/ISAM2.h
								
								
								
								
							|  | @ -24,7 +24,7 @@ | |||
| 
 | ||||
| namespace gtsam { | ||||
| 
 | ||||
| 	typedef std::map<Symbol, GaussianFactor::shared_ptr> cachedFactors; | ||||
| 	typedef std::map<Symbol, GaussianFactor::shared_ptr> CachedFactors; | ||||
| 
 | ||||
| 	template<class Conditional, class Config> | ||||
| 	class ISAM2: public BayesTree<Conditional> { | ||||
|  | @ -34,14 +34,14 @@ namespace gtsam { | |||
| 		// current linearization point
 | ||||
| 		Config linPoint_; | ||||
| 
 | ||||
| 		// most recent estimate
 | ||||
| 		Config estimate_; | ||||
| 		// most recent solution
 | ||||
| 		VectorConfig delta_; | ||||
| 
 | ||||
| 		// for keeping all original nonlinear factors
 | ||||
| 		NonlinearFactorGraph<Config> nonlinearFactors_; | ||||
| 
 | ||||
| 		// cached intermediate results for restarting computation in the middle
 | ||||
| 		cachedFactors cached; | ||||
| 		CachedFactors cached_; | ||||
| 
 | ||||
| 	public: | ||||
| 
 | ||||
|  | @ -65,7 +65,7 @@ namespace gtsam { | |||
| 		void update_internal(const NonlinearFactorGraph<Config>& newFactors, const Config& config, Cliques& orphans); | ||||
| 		void update(const NonlinearFactorGraph<Config>& newFactors, const Config& config); | ||||
| 
 | ||||
| 		const Config estimate() {return estimate_;} | ||||
| 		const Config estimate() {return expmap(linPoint_, delta_);} | ||||
| 
 | ||||
| 	private: | ||||
| 		FactorGraph<GaussianFactor> relinearizeAffectedFactors(const std::list<Symbol>& affectedKeys); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue