116 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
		
		
			
		
	
	
			116 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
| 
								 | 
							
								/* ----------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 * 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    FixedLagSmoother.cpp
							 | 
						||
| 
								 | 
							
								 * @brief   The base class for different fixed-lag smoother implementations.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @author  Stephen Williams
							 | 
						||
| 
								 | 
							
								 * @date    Feb 27, 2013
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <gtsam_unstable/nonlinear/FixedLagSmoother.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace gtsam {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ************************************************************************* */
							 | 
						||
| 
								 | 
							
								void FixedLagSmoother::print(const std::string& s, const KeyFormatter& keyFormatter) const {
							 | 
						||
| 
								 | 
							
								  std::cout << s;
							 | 
						||
| 
								 | 
							
								  std::cout << "  smoother lag: " << smootherLag_ << std::endl;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ************************************************************************* */
							 | 
						||
| 
								 | 
							
								bool FixedLagSmoother::equals(const FixedLagSmoother& rhs, double tol) const {
							 | 
						||
| 
								 | 
							
								  return std::fabs(smootherLag_ - rhs.smootherLag_) < tol
							 | 
						||
| 
								 | 
							
								      && std::equal(timestampKeyMap_.begin(), timestampKeyMap_.end(), rhs.timestampKeyMap_.begin());
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ************************************************************************* */
							 | 
						||
| 
								 | 
							
								void FixedLagSmoother::updateKeyTimestampMap(const KeyTimestampMap& timestamps) {
							 | 
						||
| 
								 | 
							
								  // Loop through each key and add/update it in the map
							 | 
						||
| 
								 | 
							
								  BOOST_FOREACH(const KeyTimestampMap::value_type& key_timestamp, timestamps) {
							 | 
						||
| 
								 | 
							
								    // Check to see if this key already exists inthe database
							 | 
						||
| 
								 | 
							
								    KeyTimestampMap::iterator keyIter = keyTimestampMap_.find(key_timestamp.first);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // If the key already exists
							 | 
						||
| 
								 | 
							
								    if(keyIter != keyTimestampMap_.end()) {
							 | 
						||
| 
								 | 
							
								      // Find the entry in the Timestamp-Key database
							 | 
						||
| 
								 | 
							
								      std::pair<TimestampKeyMap::iterator,TimestampKeyMap::iterator> range = timestampKeyMap_.equal_range(keyIter->second);
							 | 
						||
| 
								 | 
							
								      TimestampKeyMap::iterator timeIter = range.first;
							 | 
						||
| 
								 | 
							
								      while(timeIter->second != key_timestamp.first) {
							 | 
						||
| 
								 | 
							
								        ++timeIter;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      // remove the entry in the Timestamp-Key database
							 | 
						||
| 
								 | 
							
								      timestampKeyMap_.erase(timeIter);
							 | 
						||
| 
								 | 
							
								      // insert an entry at the new time
							 | 
						||
| 
								 | 
							
								      timestampKeyMap_.insert(TimestampKeyMap::value_type(key_timestamp.second, key_timestamp.first));
							 | 
						||
| 
								 | 
							
								      // update the Key-Timestamp database
							 | 
						||
| 
								 | 
							
								      keyIter->second = key_timestamp.second;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      // Add the Key-Timestamp database
							 | 
						||
| 
								 | 
							
								      keyTimestampMap_.insert(key_timestamp);
							 | 
						||
| 
								 | 
							
								      // Add the key to the Timestamp-Key database
							 | 
						||
| 
								 | 
							
								      timestampKeyMap_.insert(TimestampKeyMap::value_type(key_timestamp.second, key_timestamp.first));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ************************************************************************* */
							 | 
						||
| 
								 | 
							
								void FixedLagSmoother::eraseKeyTimestampMap(const std::set<Key>& keys) {
							 | 
						||
| 
								 | 
							
								  BOOST_FOREACH(Key key, keys) {
							 | 
						||
| 
								 | 
							
								    // Erase the key from the Timestamp->Key map
							 | 
						||
| 
								 | 
							
								    double timestamp = keyTimestampMap_.at(key);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    TimestampKeyMap::iterator iter = timestampKeyMap_.lower_bound(timestamp);
							 | 
						||
| 
								 | 
							
								    while(iter != timestampKeyMap_.end() && iter->first == timestamp) {
							 | 
						||
| 
								 | 
							
								      if(iter->second == key) {
							 | 
						||
| 
								 | 
							
								        timestampKeyMap_.erase(iter++);
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        ++iter;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    // Erase the key from the Key->Timestamp map
							 | 
						||
| 
								 | 
							
								    keyTimestampMap_.erase(key);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ************************************************************************* */
							 | 
						||
| 
								 | 
							
								double FixedLagSmoother::getCurrentTimestamp() const {
							 | 
						||
| 
								 | 
							
								  if(timestampKeyMap_.size() > 0) {
							 | 
						||
| 
								 | 
							
								    return timestampKeyMap_.rbegin()->first;
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    return -std::numeric_limits<double>::max();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ************************************************************************* */
							 | 
						||
| 
								 | 
							
								std::set<Key> FixedLagSmoother::findKeysBefore(double timestamp) const {
							 | 
						||
| 
								 | 
							
								  std::set<Key> keys;
							 | 
						||
| 
								 | 
							
								  TimestampKeyMap::const_iterator end = timestampKeyMap_.lower_bound(timestamp);
							 | 
						||
| 
								 | 
							
								  for(TimestampKeyMap::const_iterator iter = timestampKeyMap_.begin(); iter != end; ++iter) {
							 | 
						||
| 
								 | 
							
								    keys.insert(iter->second);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return keys;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ************************************************************************* */
							 | 
						||
| 
								 | 
							
								std::set<Key> FixedLagSmoother::findKeysAfter(double timestamp) const {
							 | 
						||
| 
								 | 
							
								  std::set<Key> keys;
							 | 
						||
| 
								 | 
							
								  TimestampKeyMap::const_iterator begin = timestampKeyMap_.upper_bound(timestamp);
							 | 
						||
| 
								 | 
							
								  for(TimestampKeyMap::const_iterator iter = begin; iter != timestampKeyMap_.end(); ++iter) {
							 | 
						||
| 
								 | 
							
								    keys.insert(iter->second);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return keys;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ************************************************************************* */
							 | 
						||
| 
								 | 
							
								} /// namespace gtsam
							 |