174 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
| /**
 | |
|  * @file    VectorMap.h
 | |
|  * @brief   Factor Graph Configuration
 | |
|  * @author  Carlos Nieto
 | |
|  * @author  Christian Potthast
 | |
|  */
 | |
| 
 | |
| // \callgraph
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <map>
 | |
| #include <boost/serialization/map.hpp>
 | |
| 
 | |
| #include "Testable.h"
 | |
| #include "Vector.h"
 | |
| #include "Key.h"
 | |
| #include "SymbolMap.h"
 | |
| 
 | |
| namespace gtsam {
 | |
| 	
 | |
|   /** Factor Graph Configuration */
 | |
|   class VectorMap : public Testable<VectorMap> {
 | |
| 
 | |
|   protected:
 | |
|     /** Map from string indices to values */
 | |
|     SymbolMap<Vector> values;
 | |
| 
 | |
|   public:
 | |
|     typedef SymbolMap<Vector>::iterator iterator;
 | |
|     typedef SymbolMap<Vector>::const_iterator const_iterator;
 | |
| 
 | |
|     VectorMap() {}
 | |
|     VectorMap(const VectorMap& cfg_in): values(cfg_in.values) {}
 | |
|     VectorMap(const Symbol& j, const Vector& a) { insert(j,a); }
 | |
|     
 | |
|     virtual ~VectorMap() {}
 | |
| 
 | |
|     /** return all the nodes in the graph **/
 | |
|     std::vector<Symbol> get_names() const;
 | |
| 
 | |
|     /** convert into a single large vector */
 | |
|     Vector vector() const;
 | |
| 
 | |
|     /** Insert a value into the configuration with a given index */
 | |
|     VectorMap& insert(const Symbol& name, const Vector& v);
 | |
| 
 | |
| 		/** Insert or add a value with given index */
 | |
|     VectorMap& insertAdd(const Symbol& j, const Vector& v);
 | |
| 
 | |
|     /** Insert a config into another config */
 | |
|     void insert(const VectorMap& config);
 | |
| 
 | |
| 		/** Insert a config into another config, add if key already exists */
 | |
| 		void insertAdd(const VectorMap& config);
 | |
| 
 | |
|     const_iterator begin() const {return values.begin();}
 | |
|     const_iterator end()   const {return values.end();}
 | |
|     iterator begin() {return values.begin();}
 | |
|     iterator end()   {return values.end();}
 | |
| 
 | |
| 		/** Vector access in VectorMap is via a Vector reference */
 | |
| 		Vector& operator[](const Symbol& j);
 | |
| 		const Vector& operator[](const Symbol& j) const;
 | |
| 
 | |
| 		/** [set] and [get] provided for access via MATLAB */
 | |
| 		inline Vector& get(const Symbol& j) { return (*this)[j];}
 | |
| 		void set(const Symbol& j, const Vector& v) { (*this)[j] = v; }
 | |
| 		inline const Vector& get(const Symbol& j) const { return (*this)[j];}
 | |
| 
 | |
| 		bool contains(const Symbol& name) const {
 | |
|       const_iterator it = values.find(name);
 | |
|       return (it!=values.end());
 | |
|     }
 | |
| 
 | |
|     /** Nr of vectors */
 | |
|     size_t size() const { return values.size();}
 | |
| 
 | |
|     /** Total dimensionality */
 | |
|     size_t dim() const;
 | |
| 
 | |
|     /** max of the vectors */
 | |
|     inline double max() const {
 | |
|     	double m = -std::numeric_limits<double>::infinity();
 | |
|     	for(const_iterator it=begin(); it!=end(); it++)
 | |
|     		m = std::max(m, gtsam::max(it->second));
 | |
|     	return m;
 | |
|     }
 | |
| 
 | |
|     /** Scale */
 | |
|     VectorMap scale(double s) const;
 | |
|     VectorMap operator*(double s) const;
 | |
| 
 | |
|     /** Negation */
 | |
|     VectorMap operator-() const;
 | |
| 
 | |
|     /** Add in place */
 | |
|     void operator+=(const VectorMap &b);
 | |
| 
 | |
|     /** Add */
 | |
|     VectorMap operator+(const VectorMap &b) const;
 | |
| 
 | |
|     /** Subtract */
 | |
|     VectorMap operator-(const VectorMap &b) const;
 | |
| 
 | |
|     /** print */
 | |
|     void print(const std::string& name = "") const;
 | |
| 
 | |
|     /** equals, for unit testing */
 | |
|     bool equals(const VectorMap& expected, double tol=1e-9) const;
 | |
| 
 | |
|     void clear() {values.clear();}
 | |
|     
 | |
|     /** Dot product */
 | |
|     double dot(const VectorMap& b) const;
 | |
| 
 | |
| 		/** Set all vectors to zero */
 | |
|     VectorMap& zero();
 | |
| 
 | |
| 		/** Create a clone of x with exactly same structure, except with zero values */
 | |
| 		static VectorMap zero(const VectorMap& x);
 | |
| 
 | |
|     /**
 | |
|      * Add a delta config, needed for use in NonlinearOptimizer
 | |
|      * For VectorMap, this is just addition.
 | |
|      */
 | |
|     friend VectorMap expmap(const VectorMap& original, const VectorMap& delta);
 | |
| 
 | |
|     /**
 | |
|      * Add a delta vector (not a config)
 | |
|      * Will use the ordering that map uses to loop over vectors
 | |
|      */
 | |
|     friend VectorMap expmap(const VectorMap& original, const Vector& delta);
 | |
| 
 | |
|   private:
 | |
|     /** Serialization function */
 | |
|     friend class boost::serialization::access;
 | |
|     template<class Archive>
 | |
|       void serialize(Archive & ar, const unsigned int version)
 | |
|     {
 | |
|       ar & BOOST_SERIALIZATION_NVP(values);
 | |
|     }
 | |
|   }; // VectorMap
 | |
| 
 | |
|   /** scalar product */
 | |
|   inline VectorMap operator*(double s, const VectorMap& x) {return x*s;}
 | |
| 
 | |
|   /** Dot product */
 | |
|   double dot(const VectorMap&, const VectorMap&);
 | |
| 
 | |
|   /**
 | |
|    * BLAS Level 1 scal: x <- alpha*x
 | |
|    */
 | |
|   void scal(double alpha, VectorMap& x);
 | |
| 
 | |
|   /**
 | |
|    * BLAS Level 1 axpy: y <- alpha*x + y
 | |
|    * UNSAFE !!!! Only works if x and y laid out in exactly same shape
 | |
|    * Used in internal loop in iterative for fast conjugate gradients
 | |
|    * Consider using other functions if this is not in hotspot
 | |
|    */
 | |
|   void axpy(double alpha, const VectorMap& x, VectorMap& y);
 | |
| 
 | |
|   /** dim function (for iterative::CGD) */
 | |
|   inline double dim(const VectorMap& x) { return x.dim();}
 | |
| 
 | |
|   /** max of the vectors */
 | |
|   inline double max(const VectorMap& x) { return x.max();}
 | |
| 
 | |
|   /** print with optional string */
 | |
|   void print(const VectorMap& v, const std::string& s = "");
 | |
| 
 | |
| } // gtsam
 |