Template arguments capitalized
							parent
							
								
									e5aacb8ba1
								
							
						
					
					
						commit
						82a2f29e48
					
				| 
						 | 
				
			
			@ -31,7 +31,7 @@ namespace gtsam {
 | 
			
		|||
  /**
 | 
			
		||||
   * A linear system solver using factorization
 | 
			
		||||
   */
 | 
			
		||||
  template <class NonlinearGraph, class Values>
 | 
			
		||||
  template <class NONLINEARGRAPH, class VALUES>
 | 
			
		||||
  class Factorization {
 | 
			
		||||
  private:
 | 
			
		||||
  	boost::shared_ptr<Ordering> ordering_;
 | 
			
		||||
| 
						 | 
				
			
			@ -53,7 +53,7 @@ namespace gtsam {
 | 
			
		|||
		/**
 | 
			
		||||
		 * linearize the non-linear graph around the current config
 | 
			
		||||
		 */
 | 
			
		||||
  	boost::shared_ptr<GaussianFactorGraph> linearize(const NonlinearGraph& g, const Values& config) const {
 | 
			
		||||
  	boost::shared_ptr<GaussianFactorGraph> linearize(const NONLINEARGRAPH& g, const VALUES& config) const {
 | 
			
		||||
  		return g.linearize(config, *ordering_);
 | 
			
		||||
  	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -65,7 +65,7 @@ namespace gtsam {
 | 
			
		|||
  	}
 | 
			
		||||
 | 
			
		||||
  	/** expmap the Values given the stored Ordering */
 | 
			
		||||
  	Values expmap(const Values& config, const VectorValues& delta) const {
 | 
			
		||||
  	VALUES expmap(const VALUES& config, const VectorValues& delta) const {
 | 
			
		||||
  	  return config.expmap(delta, *ordering_);
 | 
			
		||||
  	}
 | 
			
		||||
  };
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -100,8 +100,8 @@ public:
 | 
			
		|||
	 * Constructor when matrices are already stored in a combined matrix, allows
 | 
			
		||||
	 * for multiple frontal variables.
 | 
			
		||||
	 */
 | 
			
		||||
	template<typename Iterator, class Matrix>
 | 
			
		||||
	GaussianConditional(Iterator firstKey, Iterator lastKey, size_t nrFrontals, const VerticalBlockView<Matrix>& matrices, const Vector& sigmas);
 | 
			
		||||
	template<typename ITERATOR, class MATRIX>
 | 
			
		||||
	GaussianConditional(ITERATOR firstKey, ITERATOR lastKey, size_t nrFrontals, const VerticalBlockView<MATRIX>& matrices, const Vector& sigmas);
 | 
			
		||||
 | 
			
		||||
	/** print */
 | 
			
		||||
	void print(const std::string& = "GaussianConditional") const;
 | 
			
		||||
| 
						 | 
				
			
			@ -162,9 +162,9 @@ private:
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
	template<typename Iterator, class Matrix>
 | 
			
		||||
	GaussianConditional::GaussianConditional(Iterator firstKey, Iterator lastKey,
 | 
			
		||||
			size_t nrFrontals, const VerticalBlockView<Matrix>& matrices,
 | 
			
		||||
	template<typename ITERATOR, class MATRIX>
 | 
			
		||||
	GaussianConditional::GaussianConditional(ITERATOR firstKey, ITERATOR lastKey,
 | 
			
		||||
			size_t nrFrontals, const VerticalBlockView<MATRIX>& matrices,
 | 
			
		||||
			const Vector& sigmas) :
 | 
			
		||||
		rsd_(matrix_), sigmas_(sigmas) {
 | 
			
		||||
  	nrFrontals_ = nrFrontals;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -593,9 +593,9 @@ struct _RowSource {
 | 
			
		|||
template GaussianFactor::shared_ptr GaussianFactor::Combine(const FactorGraph<GaussianFactor>&, const GaussianVariableIndex<VariableIndexStorage_vector>&, const vector<size_t>&, const vector<Index>&, const std::vector<std::vector<size_t> >&);
 | 
			
		||||
template GaussianFactor::shared_ptr GaussianFactor::Combine(const FactorGraph<GaussianFactor>&, const GaussianVariableIndex<VariableIndexStorage_deque>&, const vector<size_t>&, const vector<Index>&, const std::vector<std::vector<size_t> >&);
 | 
			
		||||
 | 
			
		||||
template<class Storage>
 | 
			
		||||
template<class STORAGE>
 | 
			
		||||
GaussianFactor::shared_ptr GaussianFactor::Combine(const FactorGraph<GaussianFactor>& factorGraph,
 | 
			
		||||
    const GaussianVariableIndex<Storage>& variableIndex, const vector<size_t>& factors,
 | 
			
		||||
    const GaussianVariableIndex<STORAGE>& variableIndex, const vector<size_t>& factors,
 | 
			
		||||
    const vector<Index>& variables, const std::vector<std::vector<size_t> >& variablePositions) {
 | 
			
		||||
 | 
			
		||||
  shared_ptr ret(boost::make_shared<GaussianFactor>());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,7 +49,7 @@
 | 
			
		|||
namespace gtsam {
 | 
			
		||||
 | 
			
		||||
class GaussianFactorGraph;
 | 
			
		||||
template<class VariableIndexStorage=VariableIndexStorage_vector> class GaussianVariableIndex;
 | 
			
		||||
template<class VARIABLEINDEXSTORAGE=VariableIndexStorage_vector> class GaussianVariableIndex;
 | 
			
		||||
 | 
			
		||||
/** A map from key to dimension, useful in various contexts */
 | 
			
		||||
typedef std::map<Index, size_t> Dimensions;
 | 
			
		||||
| 
						 | 
				
			
			@ -149,9 +149,9 @@ public:
 | 
			
		|||
 | 
			
		||||
  /** Named constructor for combining a set of factors with pre-computed set of
 | 
			
		||||
   * variables. */
 | 
			
		||||
  template<class Storage>
 | 
			
		||||
  template<class STORAGE>
 | 
			
		||||
  static shared_ptr Combine(const FactorGraph<GaussianFactor>& factorGraph,
 | 
			
		||||
      const GaussianVariableIndex<Storage>& variableIndex, const std::vector<size_t>& factors,
 | 
			
		||||
      const GaussianVariableIndex<STORAGE>& variableIndex, const std::vector<size_t>& factors,
 | 
			
		||||
      const std::vector<Index>& variables, const std::vector<std::vector<size_t> >& variablePositions);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -157,11 +157,11 @@ namespace gtsam {
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
  /* ************************************************************************* */
 | 
			
		||||
  template<class VariableIndexStorage>
 | 
			
		||||
  class GaussianVariableIndex : public VariableIndex<VariableIndexStorage> {
 | 
			
		||||
  template<class VARIABLEINDEXSTORAGE>
 | 
			
		||||
  class GaussianVariableIndex : public VariableIndex<VARIABLEINDEXSTORAGE> {
 | 
			
		||||
  public:
 | 
			
		||||
    typedef VariableIndex<VariableIndexStorage> Base;
 | 
			
		||||
    typedef typename VariableIndexStorage::template type_factory<size_t>::type storage_type;
 | 
			
		||||
    typedef VariableIndex<VARIABLEINDEXSTORAGE> Base;
 | 
			
		||||
    typedef typename VARIABLEINDEXSTORAGE::template type_factory<size_t>::type storage_type;
 | 
			
		||||
 | 
			
		||||
    storage_type dims_;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -181,13 +181,13 @@ namespace gtsam {
 | 
			
		|||
     * Constructor to "upgrade" from the base class without recomputing the
 | 
			
		||||
     * column index, i.e. just fills the dims_ array.
 | 
			
		||||
     */
 | 
			
		||||
    GaussianVariableIndex(const VariableIndex<VariableIndexStorage>& variableIndex, const GaussianFactorGraph& factorGraph);
 | 
			
		||||
    GaussianVariableIndex(const VariableIndex<VARIABLEINDEXSTORAGE>& variableIndex, const GaussianFactorGraph& factorGraph);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Another constructor to upgrade from the base class using an existing
 | 
			
		||||
     * array of variable dimensions.
 | 
			
		||||
     */
 | 
			
		||||
    GaussianVariableIndex(const VariableIndex<VariableIndexStorage>& variableIndex, const storage_type& dimensions);
 | 
			
		||||
    GaussianVariableIndex(const VariableIndex<VARIABLEINDEXSTORAGE>& variableIndex, const storage_type& dimensions);
 | 
			
		||||
 | 
			
		||||
    const storage_type& dims() const { return dims_; }
 | 
			
		||||
    size_t dim(Index variable) const { Base::checkVar(variable); return dims_[variable]; }
 | 
			
		||||
| 
						 | 
				
			
			@ -205,28 +205,28 @@ namespace gtsam {
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
  /* ************************************************************************* */
 | 
			
		||||
  template<class Storage>
 | 
			
		||||
  GaussianVariableIndex<Storage>::GaussianVariableIndex(const GaussianFactorGraph& factorGraph) :
 | 
			
		||||
  template<class STORAGE>
 | 
			
		||||
  GaussianVariableIndex<STORAGE>::GaussianVariableIndex(const GaussianFactorGraph& factorGraph) :
 | 
			
		||||
  Base(factorGraph), dims_(Base::index_.size()) {
 | 
			
		||||
    fillDims(factorGraph); }
 | 
			
		||||
 | 
			
		||||
  /* ************************************************************************* */
 | 
			
		||||
  template<class Storage>
 | 
			
		||||
  GaussianVariableIndex<Storage>::GaussianVariableIndex(
 | 
			
		||||
      const VariableIndex<Storage>& variableIndex, const GaussianFactorGraph& factorGraph) :
 | 
			
		||||
  template<class STORAGE>
 | 
			
		||||
  GaussianVariableIndex<STORAGE>::GaussianVariableIndex(
 | 
			
		||||
      const VariableIndex<STORAGE>& variableIndex, const GaussianFactorGraph& factorGraph) :
 | 
			
		||||
      Base(variableIndex), dims_(Base::index_.size()) {
 | 
			
		||||
    fillDims(factorGraph); }
 | 
			
		||||
 | 
			
		||||
  /* ************************************************************************* */
 | 
			
		||||
  template<class Storage>
 | 
			
		||||
  GaussianVariableIndex<Storage>::GaussianVariableIndex(
 | 
			
		||||
      const VariableIndex<Storage>& variableIndex, const storage_type& dimensions) :
 | 
			
		||||
  template<class STORAGE>
 | 
			
		||||
  GaussianVariableIndex<STORAGE>::GaussianVariableIndex(
 | 
			
		||||
      const VariableIndex<STORAGE>& variableIndex, const storage_type& dimensions) :
 | 
			
		||||
      Base(variableIndex), dims_(dimensions) {
 | 
			
		||||
    assert(Base::index_.size() == dims_.size()); }
 | 
			
		||||
 | 
			
		||||
  /* ************************************************************************* */
 | 
			
		||||
  template<class Storage>
 | 
			
		||||
  void GaussianVariableIndex<Storage>::fillDims(const GaussianFactorGraph& factorGraph) {
 | 
			
		||||
  template<class STORAGE>
 | 
			
		||||
  void GaussianVariableIndex<STORAGE>::fillDims(const GaussianFactorGraph& factorGraph) {
 | 
			
		||||
    // Store dimensions of each variable
 | 
			
		||||
    assert(dims_.size() == Base::index_.size());
 | 
			
		||||
    for(Index var=0; var<Base::index_.size(); ++var)
 | 
			
		||||
| 
						 | 
				
			
			@ -240,9 +240,9 @@ namespace gtsam {
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  /* ************************************************************************* */
 | 
			
		||||
  template<class Storage>
 | 
			
		||||
  void GaussianVariableIndex<Storage>::permute(const Permutation& permutation) {
 | 
			
		||||
    VariableIndex<Storage>::permute(permutation);
 | 
			
		||||
  template<class STORAGE>
 | 
			
		||||
  void GaussianVariableIndex<STORAGE>::permute(const Permutation& permutation) {
 | 
			
		||||
    VariableIndex<STORAGE>::permute(permutation);
 | 
			
		||||
    storage_type original(this->dims_.size());
 | 
			
		||||
    this->dims_.swap(original);
 | 
			
		||||
    for(Index j=0; j<permutation.size(); ++j)
 | 
			
		||||
| 
						 | 
				
			
			@ -250,8 +250,8 @@ namespace gtsam {
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  /* ************************************************************************* */
 | 
			
		||||
  template<class Storage>
 | 
			
		||||
  void GaussianVariableIndex<Storage>::augment(const GaussianFactorGraph& factorGraph) {
 | 
			
		||||
  template<class STORAGE>
 | 
			
		||||
  void GaussianVariableIndex<STORAGE>::augment(const GaussianFactorGraph& factorGraph) {
 | 
			
		||||
    Base::augment(factorGraph);
 | 
			
		||||
    dims_.resize(Base::index_.size(), 0);
 | 
			
		||||
    BOOST_FOREACH(boost::shared_ptr<const GaussianFactor> factor, factorGraph) {
 | 
			
		||||
| 
						 | 
				
			
			@ -283,9 +283,9 @@ namespace gtsam {
 | 
			
		|||
//	 * @param ordering of variables needed for matrix column order
 | 
			
		||||
//	 * @return the augmented matrix and a noise model
 | 
			
		||||
//	 */
 | 
			
		||||
//	template <class Factors>
 | 
			
		||||
//	template <class FACTORS>
 | 
			
		||||
//	std::pair<Matrix, SharedDiagonal> combineFactorsAndCreateMatrix(
 | 
			
		||||
//			const Factors& factors,
 | 
			
		||||
//			const FACTORS& factors,
 | 
			
		||||
//			const Ordering& order, const Dimensions& dimensions);
 | 
			
		||||
 | 
			
		||||
} // namespace gtsam
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,14 +38,14 @@ public:
 | 
			
		|||
  GaussianISAM(const GaussianBayesNet& bayesNet) : ISAM<GaussianConditional>(bayesNet) {}
 | 
			
		||||
 | 
			
		||||
  /** Override update_internal to also keep track of variable dimensions. */
 | 
			
		||||
  template<class FactorGraph>
 | 
			
		||||
  void update_internal(const FactorGraph& newFactors, Cliques& orphans) {
 | 
			
		||||
  template<class FACTORGRAPH>
 | 
			
		||||
  void update_internal(const FACTORGRAPH& newFactors, Cliques& orphans) {
 | 
			
		||||
 | 
			
		||||
    ISAM<GaussianConditional>::update_internal(newFactors, orphans);
 | 
			
		||||
 | 
			
		||||
    // update dimensions
 | 
			
		||||
    BOOST_FOREACH(const typename FactorGraph::sharedFactor& factor, newFactors) {
 | 
			
		||||
      for(typename FactorGraph::Factor::const_iterator key = factor->begin(); key != factor->end(); ++key) {
 | 
			
		||||
    BOOST_FOREACH(const typename FACTORGRAPH::sharedFactor& factor, newFactors) {
 | 
			
		||||
      for(typename FACTORGRAPH::Factor::const_iterator key = factor->begin(); key != factor->end(); ++key) {
 | 
			
		||||
        if(*key >= dims_.size())
 | 
			
		||||
          dims_.resize(*key + 1);
 | 
			
		||||
        if(dims_[*key] == 0)
 | 
			
		||||
| 
						 | 
				
			
			@ -56,8 +56,8 @@ public:
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template<class FactorGraph>
 | 
			
		||||
  void update(const FactorGraph& newFactors) {
 | 
			
		||||
  template<class FACTORGRAPH>
 | 
			
		||||
  void update(const FACTORGRAPH& newFactors) {
 | 
			
		||||
    Cliques orphans;
 | 
			
		||||
    this->update_internal(newFactors, orphans);
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,21 +30,21 @@ using namespace std;
 | 
			
		|||
namespace gtsam {
 | 
			
		||||
 | 
			
		||||
	/* ************************************************************************* */
 | 
			
		||||
	template<class Graph, class Values>
 | 
			
		||||
	SubgraphSolver<Graph, Values>::SubgraphSolver(const Graph& G, const Values& theta0) {
 | 
			
		||||
	template<class GRAPH, class VALUES>
 | 
			
		||||
	SubgraphSolver<GRAPH, VALUES>::SubgraphSolver(const GRAPH& G, const VALUES& theta0) {
 | 
			
		||||
		initialize(G,theta0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* ************************************************************************* */
 | 
			
		||||
	template<class Graph, class Values>
 | 
			
		||||
	void SubgraphSolver<Graph, Values>::initialize(const Graph& G, const Values& theta0) {
 | 
			
		||||
	template<class GRAPH, class VALUES>
 | 
			
		||||
	void SubgraphSolver<GRAPH, VALUES>::initialize(const GRAPH& G, const VALUES& theta0) {
 | 
			
		||||
 | 
			
		||||
		// generate spanning tree
 | 
			
		||||
		PredecessorMap<Key> tree = gtsam::findMinimumSpanningTree<Graph, Key, Constraint>(G);
 | 
			
		||||
		PredecessorMap<Key> tree = gtsam::findMinimumSpanningTree<GRAPH, Key, Constraint>(G);
 | 
			
		||||
 | 
			
		||||
		// split the graph
 | 
			
		||||
		if (verbose_) cout << "generating spanning tree and split the graph ...";
 | 
			
		||||
		gtsam::split<Graph,Key,Constraint>(G, tree, T_, C_) ;
 | 
			
		||||
		gtsam::split<GRAPH,Key,Constraint>(G, tree, T_, C_) ;
 | 
			
		||||
		if (verbose_) cout << ",with " << T_.size() << " and " << C_.size() << " factors" << endl;
 | 
			
		||||
 | 
			
		||||
		// make the ordering
 | 
			
		||||
| 
						 | 
				
			
			@ -56,12 +56,12 @@ namespace gtsam {
 | 
			
		|||
		T_.addHardConstraint(root, theta0[root]);
 | 
			
		||||
 | 
			
		||||
		// compose the approximate solution
 | 
			
		||||
		theta_bar_ = composePoses<Graph, Constraint, Pose, Values> (T_, tree, theta0[root]);
 | 
			
		||||
		theta_bar_ = composePoses<GRAPH, Constraint, Pose, VALUES> (T_, tree, theta0[root]);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* ************************************************************************* */
 | 
			
		||||
	template<class Graph, class Values>
 | 
			
		||||
	boost::shared_ptr<SubgraphPreconditioner> SubgraphSolver<Graph, Values>::linearize(const Graph& G, const Values& theta_bar) const {
 | 
			
		||||
	template<class GRAPH, class VALUES>
 | 
			
		||||
	boost::shared_ptr<SubgraphPreconditioner> SubgraphSolver<GRAPH, VALUES>::linearize(const GRAPH& G, const VALUES& theta_bar) const {
 | 
			
		||||
		SubgraphPreconditioner::sharedFG Ab1 = T_.linearize(theta_bar, *ordering_);
 | 
			
		||||
		SubgraphPreconditioner::sharedFG Ab2 = C_.linearize(theta_bar, *ordering_);
 | 
			
		||||
#ifdef TIMING
 | 
			
		||||
| 
						 | 
				
			
			@ -78,8 +78,8 @@ namespace gtsam {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/* ************************************************************************* */
 | 
			
		||||
	template<class Graph, class Values>
 | 
			
		||||
	VectorValues SubgraphSolver<Graph, Values>::optimize(SubgraphPreconditioner& system) const {
 | 
			
		||||
	template<class GRAPH, class VALUES>
 | 
			
		||||
	VectorValues SubgraphSolver<GRAPH, VALUES>::optimize(SubgraphPreconditioner& system) const {
 | 
			
		||||
		VectorValues zeros = system.zero();
 | 
			
		||||
 | 
			
		||||
		// Solve the subgraph PCG
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,13 +30,13 @@ namespace gtsam {
 | 
			
		|||
   *   linearize: G * T -> L
 | 
			
		||||
   *   solve : L -> VectorValues
 | 
			
		||||
   */
 | 
			
		||||
	template<class Graph, class Values>
 | 
			
		||||
	template<class GRAPH, class VALUES>
 | 
			
		||||
	class SubgraphSolver {
 | 
			
		||||
 | 
			
		||||
	private:
 | 
			
		||||
		typedef typename Values::Key Key;
 | 
			
		||||
		typedef typename Graph::Constraint Constraint;
 | 
			
		||||
		typedef typename Graph::Pose Pose;
 | 
			
		||||
		typedef typename VALUES::Key Key;
 | 
			
		||||
		typedef typename GRAPH::Constraint Constraint;
 | 
			
		||||
		typedef typename GRAPH::Pose Pose;
 | 
			
		||||
 | 
			
		||||
		// TODO not hardcode
 | 
			
		||||
		static const size_t maxIterations_=100;
 | 
			
		||||
| 
						 | 
				
			
			@ -47,25 +47,25 @@ namespace gtsam {
 | 
			
		|||
		boost::shared_ptr<Ordering> ordering_;
 | 
			
		||||
 | 
			
		||||
		/* the solution computed from the first subgraph */
 | 
			
		||||
		boost::shared_ptr<Values> theta_bar_;
 | 
			
		||||
		boost::shared_ptr<VALUES> theta_bar_;
 | 
			
		||||
 | 
			
		||||
		Graph T_, C_;
 | 
			
		||||
		GRAPH T_, C_;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		SubgraphSolver() {}
 | 
			
		||||
 | 
			
		||||
		SubgraphSolver(const Graph& G, const Values& theta0);
 | 
			
		||||
		SubgraphSolver(const GRAPH& G, const VALUES& theta0);
 | 
			
		||||
 | 
			
		||||
		void initialize(const Graph& G, const Values& theta0);
 | 
			
		||||
		void initialize(const GRAPH& G, const VALUES& theta0);
 | 
			
		||||
 | 
			
		||||
		boost::shared_ptr<Ordering> ordering() const { return ordering_; }
 | 
			
		||||
 | 
			
		||||
		boost::shared_ptr<Values> theta_bar() const { return theta_bar_; }
 | 
			
		||||
		boost::shared_ptr<VALUES> theta_bar() const { return theta_bar_; }
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * linearize the non-linear graph around the current config and build the subgraph preconditioner systme
 | 
			
		||||
		 */
 | 
			
		||||
		boost::shared_ptr<SubgraphPreconditioner> linearize(const Graph& G, const Values& theta_bar) const;
 | 
			
		||||
		boost::shared_ptr<SubgraphPreconditioner> linearize(const GRAPH& G, const VALUES& theta_bar) const;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
| 
						 | 
				
			
			@ -80,14 +80,14 @@ namespace gtsam {
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
	  	/** expmap the Values given the stored Ordering */
 | 
			
		||||
	  	Values expmap(const Values& config, const VectorValues& delta) const {
 | 
			
		||||
	  	VALUES expmap(const VALUES& config, const VectorValues& delta) const {
 | 
			
		||||
	  	  return config.expmap(delta, *ordering_);
 | 
			
		||||
	  	}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	template<class Graph, class Values> const size_t SubgraphSolver<Graph,Values>::maxIterations_;
 | 
			
		||||
	template<class Graph, class Values> const bool SubgraphSolver<Graph,Values>::verbose_;
 | 
			
		||||
	template<class Graph, class Values> const double SubgraphSolver<Graph,Values>::epsilon_;
 | 
			
		||||
	template<class Graph, class Values> const double SubgraphSolver<Graph,Values>::epsilon_abs_;
 | 
			
		||||
	template<class GRAPH, class VALUES> const size_t SubgraphSolver<GRAPH,VALUES>::maxIterations_;
 | 
			
		||||
	template<class GRAPH, class VALUES> const bool SubgraphSolver<GRAPH,VALUES>::verbose_;
 | 
			
		||||
	template<class GRAPH, class VALUES> const double SubgraphSolver<GRAPH,VALUES>::epsilon_;
 | 
			
		||||
	template<class GRAPH, class VALUES> const double SubgraphSolver<GRAPH,VALUES>::epsilon_abs_;
 | 
			
		||||
 | 
			
		||||
} // nsamespace gtsam
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -234,8 +234,8 @@ public:
 | 
			
		|||
	private:
 | 
			
		||||
		/** Serialization function */
 | 
			
		||||
		friend class boost::serialization::access;
 | 
			
		||||
		template<class Archive>
 | 
			
		||||
		void serialize(Archive & ar, const unsigned int version)
 | 
			
		||||
		template<class ARCHIVE>
 | 
			
		||||
		void serialize(ARCHIVE & ar, const unsigned int version)
 | 
			
		||||
		{
 | 
			
		||||
			ar & BOOST_SERIALIZATION_NVP(values);
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -145,8 +145,8 @@ namespace gtsam {
 | 
			
		|||
  private:
 | 
			
		||||
    /** Serialization function */
 | 
			
		||||
    friend class boost::serialization::access;
 | 
			
		||||
    template<class Archive>
 | 
			
		||||
      void serialize(Archive & ar, const unsigned int version)
 | 
			
		||||
    template<class ARCHIVE>
 | 
			
		||||
      void serialize(ARCHIVE & ar, const unsigned int version)
 | 
			
		||||
    {
 | 
			
		||||
      ar & BOOST_SERIALIZATION_NVP(values);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,8 +60,8 @@ public:
 | 
			
		|||
  VectorValues(const VectorValues &V) : values_(V.values_), varStarts_(V.varStarts_) {}
 | 
			
		||||
 | 
			
		||||
  /** Construct from a container of variable dimensions (in variable order). */
 | 
			
		||||
  template<class Container>
 | 
			
		||||
  VectorValues(const Container& dimensions);
 | 
			
		||||
  template<class CONTAINER>
 | 
			
		||||
  VectorValues(const CONTAINER& dimensions);
 | 
			
		||||
 | 
			
		||||
  /** Construct to hold nVars vectors of varDim dimension each. */
 | 
			
		||||
  VectorValues(Index nVars, size_t varDim);
 | 
			
		||||
| 
						 | 
				
			
			@ -213,8 +213,8 @@ public:
 | 
			
		|||
//  values_.resize(varStarts_.back(), false);
 | 
			
		||||
//}
 | 
			
		||||
 | 
			
		||||
template<class Container>
 | 
			
		||||
inline VectorValues::VectorValues(const Container& dimensions) : varStarts_(dimensions.size()+1) {
 | 
			
		||||
template<class CONTAINER>
 | 
			
		||||
inline VectorValues::VectorValues(const CONTAINER& dimensions) : varStarts_(dimensions.size()+1) {
 | 
			
		||||
  varStarts_[0] = 0;
 | 
			
		||||
  size_t varStart = 0;
 | 
			
		||||
  Index var = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -79,8 +79,8 @@ namespace gtsam {
 | 
			
		|||
 | 
			
		||||
		/** Serialization function */
 | 
			
		||||
		friend class boost::serialization::access;
 | 
			
		||||
		template<class Archive>
 | 
			
		||||
		void serialize(Archive & ar, const unsigned int version) {
 | 
			
		||||
		template<class ARCHIVE>
 | 
			
		||||
		void serialize(ARCHIVE & ar, const unsigned int version) {
 | 
			
		||||
			ar & BOOST_SERIALIZATION_NVP(j_);
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
| 
						 | 
				
			
			@ -171,8 +171,8 @@ namespace gtsam {
 | 
			
		|||
 | 
			
		||||
    /** Serialization function */
 | 
			
		||||
    friend class boost::serialization::access;
 | 
			
		||||
    template<class Archive>
 | 
			
		||||
    void serialize(Archive & ar, const unsigned int version) {
 | 
			
		||||
    template<class ARCHIVE>
 | 
			
		||||
    void serialize(ARCHIVE & ar, const unsigned int version) {
 | 
			
		||||
      ar & BOOST_SERIALIZATION_NVP(c_);
 | 
			
		||||
      ar & BOOST_SERIALIZATION_NVP(j_);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -180,13 +180,13 @@ namespace gtsam {
 | 
			
		|||
 | 
			
		||||
	// Conversion utilities
 | 
			
		||||
 | 
			
		||||
	template<class Key> Symbol key2symbol(Key key) {
 | 
			
		||||
	template<class KEY> Symbol key2symbol(KEY key) {
 | 
			
		||||
		return Symbol(key);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	template<class Key> std::list<Symbol> keys2symbols(std::list<Key> keys) {
 | 
			
		||||
	template<class KEY> std::list<Symbol> keys2symbols(std::list<KEY> keys) {
 | 
			
		||||
		std::list<Symbol> symbols;
 | 
			
		||||
		std::transform(keys.begin(), keys.end(), std::back_inserter(symbols), key2symbol<Key> );
 | 
			
		||||
		std::transform(keys.begin(), keys.end(), std::back_inserter(symbols), key2symbol<KEY> );
 | 
			
		||||
		return symbols;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -281,8 +281,8 @@ namespace gtsam {
 | 
			
		|||
 | 
			
		||||
		/** Serialization function */
 | 
			
		||||
		friend class boost::serialization::access;
 | 
			
		||||
		template<class Archive>
 | 
			
		||||
		void serialize(Archive & ar, const unsigned int version) {
 | 
			
		||||
		template<class ARCHIVE>
 | 
			
		||||
		void serialize(ARCHIVE & ar, const unsigned int version) {
 | 
			
		||||
			typedef TypedSymbol<T,C> Base;
 | 
			
		||||
			ar & boost::serialization::make_nvp("TypedLabeledSymbol",
 | 
			
		||||
					boost::serialization::base_object<Base>(*this));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -72,8 +72,8 @@ namespace gtsam {
 | 
			
		|||
    LieValues() {}
 | 
			
		||||
    LieValues(const LieValues& config) :
 | 
			
		||||
      values_(config.values_) {}
 | 
			
		||||
    template<class J_alt>
 | 
			
		||||
    LieValues(const LieValues<J_alt>& other) {} // do nothing when initializing with wrong type
 | 
			
		||||
    template<class J_ALT>
 | 
			
		||||
    LieValues(const LieValues<J_ALT>& other) {} // do nothing when initializing with wrong type
 | 
			
		||||
    virtual ~LieValues() {}
 | 
			
		||||
 | 
			
		||||
    /** print */
 | 
			
		||||
| 
						 | 
				
			
			@ -197,8 +197,8 @@ namespace gtsam {
 | 
			
		|||
  private:
 | 
			
		||||
  	/** Serialization function */
 | 
			
		||||
  	friend class boost::serialization::access;
 | 
			
		||||
  	template<class Archive>
 | 
			
		||||
  	void serialize(Archive & ar, const unsigned int version) {
 | 
			
		||||
  	template<class ARCHIVE>
 | 
			
		||||
  	void serialize(ARCHIVE & ar, const unsigned int version) {
 | 
			
		||||
  		ar & BOOST_SERIALIZATION_NVP(values_);
 | 
			
		||||
  	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,11 +41,11 @@ namespace gtsam {
 | 
			
		|||
	 *   - ALLLOW_ERROR : if we allow that there can be nonzero error, does not throw, and uses gain
 | 
			
		||||
	 *   - ONLY_EXACT   : throws error at linearization if not at exact feasible point, and infinite error
 | 
			
		||||
	 */
 | 
			
		||||
	template<class Values, class Key>
 | 
			
		||||
	class NonlinearEquality: public NonlinearFactor1<Values, Key> {
 | 
			
		||||
	template<class VALUES, class KEY>
 | 
			
		||||
	class NonlinearEquality: public NonlinearFactor1<VALUES, KEY> {
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
		typedef typename Key::Value T;
 | 
			
		||||
		typedef typename KEY::Value T;
 | 
			
		||||
 | 
			
		||||
	private:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -65,12 +65,12 @@ namespace gtsam {
 | 
			
		|||
		 */
 | 
			
		||||
		bool (*compare_)(const T& a, const T& b);
 | 
			
		||||
 | 
			
		||||
		typedef NonlinearFactor1<Values, Key> Base;
 | 
			
		||||
		typedef NonlinearFactor1<VALUES, KEY> Base;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * Constructor - forces exact evaluation
 | 
			
		||||
		 */
 | 
			
		||||
		NonlinearEquality(const Key& j, const T& feasible, bool (*compare)(const T&, const T&) = compare<T>) :
 | 
			
		||||
		NonlinearEquality(const KEY& j, const T& feasible, bool (*compare)(const T&, const T&) = compare<T>) :
 | 
			
		||||
			Base(noiseModel::Constrained::All(feasible.dim()), j), feasible_(feasible),
 | 
			
		||||
			allow_error_(false), error_gain_(std::numeric_limits<double>::infinity()),
 | 
			
		||||
			compare_(compare) {
 | 
			
		||||
| 
						 | 
				
			
			@ -79,7 +79,7 @@ namespace gtsam {
 | 
			
		|||
		/**
 | 
			
		||||
		 * Constructor - allows inexact evaluation
 | 
			
		||||
		 */
 | 
			
		||||
		NonlinearEquality(const Key& j, const T& feasible, double error_gain, bool (*compare)(const T&, const T&) = compare<T>) :
 | 
			
		||||
		NonlinearEquality(const KEY& j, const T& feasible, double error_gain, bool (*compare)(const T&, const T&) = compare<T>) :
 | 
			
		||||
			Base(noiseModel::Constrained::All(feasible.dim()), j), feasible_(feasible),
 | 
			
		||||
			allow_error_(true), error_gain_(error_gain),
 | 
			
		||||
			compare_(compare) {
 | 
			
		||||
| 
						 | 
				
			
			@ -92,13 +92,13 @@ namespace gtsam {
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		/** Check if two factors are equal */
 | 
			
		||||
		bool equals(const NonlinearEquality<Values,Key>& f, double tol = 1e-9) const {
 | 
			
		||||
		bool equals(const NonlinearEquality<VALUES,KEY>& f, double tol = 1e-9) const {
 | 
			
		||||
			if (!Base::equals(f)) return false;
 | 
			
		||||
			return compare_(feasible_, f.feasible_);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/** actual error function calculation */
 | 
			
		||||
		virtual double error(const Values& c) const {
 | 
			
		||||
		virtual double error(const VALUES& c) const {
 | 
			
		||||
			const T& xj = c[this->key_];
 | 
			
		||||
			Vector e = this->unwhitenedError(c);
 | 
			
		||||
			if (allow_error_ || !compare_(xj, feasible_)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -125,7 +125,7 @@ namespace gtsam {
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		// Linearize is over-written, because base linearization tries to whiten
 | 
			
		||||
		virtual boost::shared_ptr<GaussianFactor> linearize(const Values& x, const Ordering& ordering) const {
 | 
			
		||||
		virtual boost::shared_ptr<GaussianFactor> linearize(const VALUES& x, const Ordering& ordering) const {
 | 
			
		||||
			const T& xj = x[this->key_];
 | 
			
		||||
			Matrix A;
 | 
			
		||||
			Vector b = evaluateError(xj, A);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,19 +51,19 @@ namespace gtsam {
 | 
			
		|||
	 * more general than just vectors, e.g., Rot3 or Pose3,
 | 
			
		||||
	 * which are objects in non-linear manifolds (Lie groups).
 | 
			
		||||
	 */
 | 
			
		||||
	template<class Values>
 | 
			
		||||
	class NonlinearFactor: public Testable<NonlinearFactor<Values> > {
 | 
			
		||||
	template<class VALUES>
 | 
			
		||||
	class NonlinearFactor: public Testable<NonlinearFactor<VALUES> > {
 | 
			
		||||
 | 
			
		||||
	protected:
 | 
			
		||||
 | 
			
		||||
		typedef NonlinearFactor<Values> This;
 | 
			
		||||
		typedef NonlinearFactor<VALUES> This;
 | 
			
		||||
 | 
			
		||||
		SharedGaussian noiseModel_; /** Noise model */
 | 
			
		||||
		std::list<Symbol> keys_; /** cached keys */
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
 | 
			
		||||
		typedef boost::shared_ptr<NonlinearFactor<Values> > shared_ptr;
 | 
			
		||||
		typedef boost::shared_ptr<NonlinearFactor<VALUES> > shared_ptr;
 | 
			
		||||
 | 
			
		||||
		/** Default constructor for I/O only */
 | 
			
		||||
		NonlinearFactor() {
 | 
			
		||||
| 
						 | 
				
			
			@ -84,7 +84,7 @@ namespace gtsam {
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		/** Check if two NonlinearFactor objects are equal */
 | 
			
		||||
		bool equals(const NonlinearFactor<Values>& f, double tol = 1e-9) const {
 | 
			
		||||
		bool equals(const NonlinearFactor<VALUES>& f, double tol = 1e-9) const {
 | 
			
		||||
			return noiseModel_->equals(*f.noiseModel_, tol);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -92,7 +92,7 @@ namespace gtsam {
 | 
			
		|||
		 * calculate the error of the factor
 | 
			
		||||
		 * Override for systems with unusual noise models
 | 
			
		||||
		 */
 | 
			
		||||
		virtual double error(const Values& c) const {
 | 
			
		||||
		virtual double error(const VALUES& c) const {
 | 
			
		||||
			return 0.5 * noiseModel_->Mahalanobis(unwhitenedError(c));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -123,16 +123,16 @@ namespace gtsam {
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		/** Vector of errors, unwhitened ! */
 | 
			
		||||
		virtual Vector unwhitenedError(const Values& c) const = 0;
 | 
			
		||||
		virtual Vector unwhitenedError(const VALUES& c) const = 0;
 | 
			
		||||
 | 
			
		||||
		/** Vector of errors, whitened ! */
 | 
			
		||||
		Vector whitenedError(const Values& c) const {
 | 
			
		||||
		Vector whitenedError(const VALUES& c) const {
 | 
			
		||||
			return noiseModel_->whiten(unwhitenedError(c));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/** linearize to a GaussianFactor */
 | 
			
		||||
		virtual boost::shared_ptr<GaussianFactor>
 | 
			
		||||
		linearize(const Values& c, const Ordering& ordering) const = 0;
 | 
			
		||||
		linearize(const VALUES& c, const Ordering& ordering) const = 0;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * Create a symbolic factor using the given ordering to determine the
 | 
			
		||||
| 
						 | 
				
			
			@ -144,8 +144,8 @@ namespace gtsam {
 | 
			
		|||
 | 
			
		||||
		/** Serialization function */
 | 
			
		||||
		friend class boost::serialization::access;
 | 
			
		||||
		template<class Archive>
 | 
			
		||||
		void serialize(Archive & ar, const unsigned int version) {
 | 
			
		||||
		template<class ARCHIVE>
 | 
			
		||||
		void serialize(ARCHIVE & ar, const unsigned int version) {
 | 
			
		||||
			// TODO NoiseModel
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -160,21 +160,21 @@ namespace gtsam {
 | 
			
		|||
	 * the derived class implements error_vector(c) = h(x)-z \approx Ax-b
 | 
			
		||||
	 * This allows a graph to have factors with measurements of mixed type.
 | 
			
		||||
	 */
 | 
			
		||||
	template<class Values, class Key>
 | 
			
		||||
	class NonlinearFactor1: public NonlinearFactor<Values> {
 | 
			
		||||
	template<class VALUES, class KEY>
 | 
			
		||||
	class NonlinearFactor1: public NonlinearFactor<VALUES> {
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
 | 
			
		||||
		// typedefs for value types pulled from keys
 | 
			
		||||
		typedef typename Key::Value X;
 | 
			
		||||
		typedef typename KEY::Value X;
 | 
			
		||||
 | 
			
		||||
	protected:
 | 
			
		||||
 | 
			
		||||
		// The value of the key. Not const to allow serialization
 | 
			
		||||
		Key key_;
 | 
			
		||||
		KEY key_;
 | 
			
		||||
 | 
			
		||||
		typedef NonlinearFactor<Values> Base;
 | 
			
		||||
		typedef NonlinearFactor1<Values, Key> This;
 | 
			
		||||
		typedef NonlinearFactor<VALUES> Base;
 | 
			
		||||
		typedef NonlinearFactor1<VALUES, KEY> This;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -182,7 +182,7 @@ namespace gtsam {
 | 
			
		|||
		NonlinearFactor1() {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		inline const Key& key() const {
 | 
			
		||||
		inline const KEY& key() const {
 | 
			
		||||
			return key_;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -192,7 +192,7 @@ namespace gtsam {
 | 
			
		|||
		 *  @param key by which to look up X value in Values
 | 
			
		||||
		 */
 | 
			
		||||
		NonlinearFactor1(const SharedGaussian& noiseModel,
 | 
			
		||||
				const Key& key1) :
 | 
			
		||||
				const KEY& key1) :
 | 
			
		||||
			Base(noiseModel), key_(key1) {
 | 
			
		||||
			this->keys_.push_back(key_);
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -205,13 +205,13 @@ namespace gtsam {
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		/** Check if two factors are equal. Note type is IndexFactor and needs cast. */
 | 
			
		||||
		bool equals(const NonlinearFactor1<Values,Key>& f, double tol = 1e-9) const {
 | 
			
		||||
		bool equals(const NonlinearFactor1<VALUES,KEY>& f, double tol = 1e-9) const {
 | 
			
		||||
			return Base::noiseModel_->equals(*f.noiseModel_, tol) && (key_ == f.key_);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/** error function h(x)-z, unwhitened !!! */
 | 
			
		||||
		inline Vector unwhitenedError(const Values& x) const {
 | 
			
		||||
			const Key& j = key_;
 | 
			
		||||
		inline Vector unwhitenedError(const VALUES& x) const {
 | 
			
		||||
			const KEY& j = key_;
 | 
			
		||||
			const X& xj = x[j];
 | 
			
		||||
			return evaluateError(xj);
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -221,7 +221,7 @@ namespace gtsam {
 | 
			
		|||
		 * Ax-b \approx h(x0+dx)-z = h(x0) + A*dx - z
 | 
			
		||||
		 * Hence b = z - h(x0) = - error_vector(x)
 | 
			
		||||
		 */
 | 
			
		||||
		virtual boost::shared_ptr<GaussianFactor> linearize(const Values& x, const Ordering& ordering) const {
 | 
			
		||||
		virtual boost::shared_ptr<GaussianFactor> linearize(const VALUES& x, const Ordering& ordering) const {
 | 
			
		||||
			const X& xj = x[key_];
 | 
			
		||||
			Matrix A;
 | 
			
		||||
			Vector b = - evaluateError(xj, A);
 | 
			
		||||
| 
						 | 
				
			
			@ -258,8 +258,8 @@ namespace gtsam {
 | 
			
		|||
 | 
			
		||||
		/** Serialization function */
 | 
			
		||||
		friend class boost::serialization::access;
 | 
			
		||||
		template<class Archive>
 | 
			
		||||
		void serialize(Archive & ar, const unsigned int version) {
 | 
			
		||||
		template<class ARCHIVE>
 | 
			
		||||
		void serialize(ARCHIVE & ar, const unsigned int version) {
 | 
			
		||||
			ar & boost::serialization::make_nvp("NonlinearFactor",
 | 
			
		||||
					boost::serialization::base_object<NonlinearFactor>(*this));
 | 
			
		||||
			ar & BOOST_SERIALIZATION_NVP(key_);
 | 
			
		||||
| 
						 | 
				
			
			@ -270,23 +270,23 @@ namespace gtsam {
 | 
			
		|||
	/**
 | 
			
		||||
	 * A Gaussian nonlinear factor that takes 2 parameters
 | 
			
		||||
	 */
 | 
			
		||||
	template<class Values, class Key1, class Key2>
 | 
			
		||||
	class NonlinearFactor2: public NonlinearFactor<Values> {
 | 
			
		||||
	template<class VALUES, class KEY1, class KEY2>
 | 
			
		||||
	class NonlinearFactor2: public NonlinearFactor<VALUES> {
 | 
			
		||||
 | 
			
		||||
	  public:
 | 
			
		||||
 | 
			
		||||
		// typedefs for value types pulled from keys
 | 
			
		||||
		typedef typename Key1::Value X1;
 | 
			
		||||
		typedef typename Key2::Value X2;
 | 
			
		||||
		typedef typename KEY1::Value X1;
 | 
			
		||||
		typedef typename KEY2::Value X2;
 | 
			
		||||
 | 
			
		||||
	protected:
 | 
			
		||||
 | 
			
		||||
		// The values of the keys. Not const to allow serialization
 | 
			
		||||
		Key1 key1_;
 | 
			
		||||
		Key2 key2_;
 | 
			
		||||
		KEY1 key1_;
 | 
			
		||||
		KEY2 key2_;
 | 
			
		||||
 | 
			
		||||
		typedef NonlinearFactor<Values> Base;
 | 
			
		||||
		typedef NonlinearFactor2<Values, Key1, Key2> This;
 | 
			
		||||
		typedef NonlinearFactor<VALUES> Base;
 | 
			
		||||
		typedef NonlinearFactor2<VALUES, KEY1, KEY2> This;
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -301,8 +301,8 @@ namespace gtsam {
 | 
			
		|||
		 * @param j1 key of the first variable
 | 
			
		||||
		 * @param j2 key of the second variable
 | 
			
		||||
		 */
 | 
			
		||||
		NonlinearFactor2(const SharedGaussian& noiseModel, Key1 j1,
 | 
			
		||||
				Key2 j2) :
 | 
			
		||||
		NonlinearFactor2(const SharedGaussian& noiseModel, KEY1 j1,
 | 
			
		||||
				KEY2 j2) :
 | 
			
		||||
			Base(noiseModel), key1_(j1), key2_(j2) {
 | 
			
		||||
			this->keys_.push_back(key1_);
 | 
			
		||||
			this->keys_.push_back(key2_);
 | 
			
		||||
| 
						 | 
				
			
			@ -317,13 +317,13 @@ namespace gtsam {
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		/** Check if two factors are equal */
 | 
			
		||||
		bool equals(const NonlinearFactor2<Values,Key1,Key2>& f, double tol = 1e-9) const {
 | 
			
		||||
		bool equals(const NonlinearFactor2<VALUES,KEY1,KEY2>& f, double tol = 1e-9) const {
 | 
			
		||||
			return Base::noiseModel_->equals(*f.noiseModel_, tol) && (key1_ == f.key1_)
 | 
			
		||||
					&& (key2_ == f.key2_);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/** error function z-h(x1,x2) */
 | 
			
		||||
		inline Vector unwhitenedError(const Values& x) const {
 | 
			
		||||
		inline Vector unwhitenedError(const VALUES& x) const {
 | 
			
		||||
			const X1& x1 = x[key1_];
 | 
			
		||||
			const X2& x2 = x[key2_];
 | 
			
		||||
			return evaluateError(x1, x2);
 | 
			
		||||
| 
						 | 
				
			
			@ -334,7 +334,7 @@ namespace gtsam {
 | 
			
		|||
		 * Ax-b \approx h(x1+dx1,x2+dx2)-z = h(x1,x2) + A2*dx1 + A2*dx2 - z
 | 
			
		||||
		 * Hence b = z - h(x1,x2) = - error_vector(x)
 | 
			
		||||
		 */
 | 
			
		||||
		boost::shared_ptr<GaussianFactor> linearize(const Values& c, const Ordering& ordering) const {
 | 
			
		||||
		boost::shared_ptr<GaussianFactor> linearize(const VALUES& c, const Ordering& ordering) const {
 | 
			
		||||
			const X1& x1 = c[key1_];
 | 
			
		||||
			const X2& x2 = c[key2_];
 | 
			
		||||
			Matrix A1, A2;
 | 
			
		||||
| 
						 | 
				
			
			@ -371,10 +371,10 @@ namespace gtsam {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
		/** methods to retrieve both keys */
 | 
			
		||||
		inline const Key1& key1() const {
 | 
			
		||||
		inline const KEY1& key1() const {
 | 
			
		||||
			return key1_;
 | 
			
		||||
		}
 | 
			
		||||
		inline const Key2& key2() const {
 | 
			
		||||
		inline const KEY2& key2() const {
 | 
			
		||||
			return key2_;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -391,8 +391,8 @@ namespace gtsam {
 | 
			
		|||
 | 
			
		||||
		/** Serialization function */
 | 
			
		||||
		friend class boost::serialization::access;
 | 
			
		||||
		template<class Archive>
 | 
			
		||||
		void serialize(Archive & ar, const unsigned int version) {
 | 
			
		||||
		template<class ARCHIVE>
 | 
			
		||||
		void serialize(ARCHIVE & ar, const unsigned int version) {
 | 
			
		||||
			ar & boost::serialization::make_nvp("NonlinearFactor",
 | 
			
		||||
					boost::serialization::base_object<NonlinearFactor>(*this));
 | 
			
		||||
			ar & BOOST_SERIALIZATION_NVP(key1_);
 | 
			
		||||
| 
						 | 
				
			
			@ -406,25 +406,25 @@ namespace gtsam {
 | 
			
		|||
  /**
 | 
			
		||||
   * A Gaussian nonlinear factor that takes 3 parameters
 | 
			
		||||
   */
 | 
			
		||||
  template<class Values, class Key1, class Key2, class Key3>
 | 
			
		||||
  class NonlinearFactor3: public NonlinearFactor<Values> {
 | 
			
		||||
  template<class VALUES, class KEY1, class KEY2, class KEY3>
 | 
			
		||||
  class NonlinearFactor3: public NonlinearFactor<VALUES> {
 | 
			
		||||
 | 
			
		||||
  public:
 | 
			
		||||
 | 
			
		||||
	// typedefs for value types pulled from keys
 | 
			
		||||
	typedef typename Key1::Value X1;
 | 
			
		||||
	typedef typename Key2::Value X2;
 | 
			
		||||
	typedef typename Key3::Value X3;
 | 
			
		||||
	typedef typename KEY1::Value X1;
 | 
			
		||||
	typedef typename KEY2::Value X2;
 | 
			
		||||
	typedef typename KEY3::Value X3;
 | 
			
		||||
 | 
			
		||||
  protected:
 | 
			
		||||
 | 
			
		||||
	// The values of the keys. Not const to allow serialization
 | 
			
		||||
    Key1 key1_;
 | 
			
		||||
    Key2 key2_;
 | 
			
		||||
    Key3 key3_;
 | 
			
		||||
    KEY1 key1_;
 | 
			
		||||
    KEY2 key2_;
 | 
			
		||||
    KEY3 key3_;
 | 
			
		||||
 | 
			
		||||
    typedef NonlinearFactor<Values> Base;
 | 
			
		||||
    typedef NonlinearFactor3<Values, Key1, Key2, Key3> This;
 | 
			
		||||
    typedef NonlinearFactor<VALUES> Base;
 | 
			
		||||
    typedef NonlinearFactor3<VALUES, KEY1, KEY2, KEY3> This;
 | 
			
		||||
 | 
			
		||||
  public:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -440,7 +440,7 @@ namespace gtsam {
 | 
			
		|||
     * @param j2 key of the second variable
 | 
			
		||||
     * @param j3 key of the third variable
 | 
			
		||||
     */
 | 
			
		||||
    NonlinearFactor3(const SharedGaussian& noiseModel, Key1 j1, Key2 j2, Key3 j3) :
 | 
			
		||||
    NonlinearFactor3(const SharedGaussian& noiseModel, KEY1 j1, KEY2 j2, KEY3 j3) :
 | 
			
		||||
      Base(noiseModel), key1_(j1), key2_(j2), key3_(j3) {
 | 
			
		||||
      this->keys_.push_back(key1_);
 | 
			
		||||
      this->keys_.push_back(key2_);
 | 
			
		||||
| 
						 | 
				
			
			@ -457,13 +457,13 @@ namespace gtsam {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    /** Check if two factors are equal */
 | 
			
		||||
    bool equals(const NonlinearFactor3<Values,Key1,Key2,Key3>& f, double tol = 1e-9) const {
 | 
			
		||||
    bool equals(const NonlinearFactor3<VALUES,KEY1,KEY2,KEY3>& f, double tol = 1e-9) const {
 | 
			
		||||
      return Base::noiseModel_->equals(*f.noiseModel_, tol) && (key1_ == f.key1_)
 | 
			
		||||
          && (key2_ == f.key2_) && (key3_ == f.key3_);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** error function z-h(x1,x2) */
 | 
			
		||||
    inline Vector unwhitenedError(const Values& x) const {
 | 
			
		||||
    inline Vector unwhitenedError(const VALUES& x) const {
 | 
			
		||||
      const X1& x1 = x[key1_];
 | 
			
		||||
      const X2& x2 = x[key2_];
 | 
			
		||||
      const X3& x3 = x[key3_];
 | 
			
		||||
| 
						 | 
				
			
			@ -475,7 +475,7 @@ namespace gtsam {
 | 
			
		|||
     * Ax-b \approx h(x1+dx1,x2+dx2,x3+dx3)-z = h(x1,x2,x3) + A2*dx1 + A2*dx2 + A3*dx3 - z
 | 
			
		||||
     * Hence b = z - h(x1,x2,x3) = - error_vector(x)
 | 
			
		||||
     */
 | 
			
		||||
    boost::shared_ptr<GaussianFactor> linearize(const Values& c, const Ordering& ordering) const {
 | 
			
		||||
    boost::shared_ptr<GaussianFactor> linearize(const VALUES& c, const Ordering& ordering) const {
 | 
			
		||||
      const X1& x1 = c[key1_];
 | 
			
		||||
      const X2& x2 = c[key2_];
 | 
			
		||||
      const X3& x3 = c[key3_];
 | 
			
		||||
| 
						 | 
				
			
			@ -538,13 +538,13 @@ namespace gtsam {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    /** methods to retrieve keys */
 | 
			
		||||
    inline const Key1& key1() const {
 | 
			
		||||
    inline const KEY1& key1() const {
 | 
			
		||||
      return key1_;
 | 
			
		||||
    }
 | 
			
		||||
    inline const Key2& key2() const {
 | 
			
		||||
    inline const KEY2& key2() const {
 | 
			
		||||
      return key2_;
 | 
			
		||||
    }
 | 
			
		||||
    inline const Key3& key3() const {
 | 
			
		||||
    inline const KEY3& key3() const {
 | 
			
		||||
      return key3_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -563,8 +563,8 @@ namespace gtsam {
 | 
			
		|||
 | 
			
		||||
    /** Serialization function */
 | 
			
		||||
    friend class boost::serialization::access;
 | 
			
		||||
    template<class Archive>
 | 
			
		||||
    void serialize(Archive & ar, const unsigned int version) {
 | 
			
		||||
    template<class ARCHIVE>
 | 
			
		||||
    void serialize(ARCHIVE & ar, const unsigned int version) {
 | 
			
		||||
      ar & boost::serialization::make_nvp("NonlinearFactor",
 | 
			
		||||
          boost::serialization::base_object<NonlinearFactor>(*this));
 | 
			
		||||
      ar & BOOST_SERIALIZATION_NVP(key1_);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,14 +34,14 @@ using namespace std;
 | 
			
		|||
namespace gtsam {
 | 
			
		||||
 | 
			
		||||
/* ************************************************************************* */
 | 
			
		||||
template<class Values>
 | 
			
		||||
void NonlinearFactorGraph<Values>::print(const std::string& str) const {
 | 
			
		||||
template<class VALUES>
 | 
			
		||||
void NonlinearFactorGraph<VALUES>::print(const std::string& str) const {
 | 
			
		||||
  Base::print(str);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	/* ************************************************************************* */
 | 
			
		||||
	template<class Values>
 | 
			
		||||
	Vector NonlinearFactorGraph<Values>::unwhitenedError(const Values& c) const {
 | 
			
		||||
	template<class VALUES>
 | 
			
		||||
	Vector NonlinearFactorGraph<VALUES>::unwhitenedError(const VALUES& c) const {
 | 
			
		||||
		list<Vector> errors;
 | 
			
		||||
		BOOST_FOREACH(const sharedFactor& factor, this->factors_)
 | 
			
		||||
			errors.push_back(factor->unwhitenedError(c));
 | 
			
		||||
| 
						 | 
				
			
			@ -49,8 +49,8 @@ void NonlinearFactorGraph<Values>::print(const std::string& str) const {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/* ************************************************************************* */
 | 
			
		||||
	template<class Values>
 | 
			
		||||
	double NonlinearFactorGraph<Values>::error(const Values& c) const {
 | 
			
		||||
	template<class VALUES>
 | 
			
		||||
	double NonlinearFactorGraph<VALUES>::error(const VALUES& c) const {
 | 
			
		||||
		double total_error = 0.;
 | 
			
		||||
		// iterate over all the factors_ to accumulate the log probabilities
 | 
			
		||||
		BOOST_FOREACH(const sharedFactor& factor, this->factors_)
 | 
			
		||||
| 
						 | 
				
			
			@ -59,8 +59,8 @@ void NonlinearFactorGraph<Values>::print(const std::string& str) const {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
  /* ************************************************************************* */
 | 
			
		||||
  template<class Values>
 | 
			
		||||
	Ordering::shared_ptr NonlinearFactorGraph<Values>::orderingCOLAMD(const Values& config) const {
 | 
			
		||||
  template<class VALUES>
 | 
			
		||||
	Ordering::shared_ptr NonlinearFactorGraph<VALUES>::orderingCOLAMD(const VALUES& config) const {
 | 
			
		||||
 | 
			
		||||
    // Create symbolic graph and initial (iterator) ordering
 | 
			
		||||
	  SymbolicFactorGraph::shared_ptr symbolic;
 | 
			
		||||
| 
						 | 
				
			
			@ -84,9 +84,9 @@ void NonlinearFactorGraph<Values>::print(const std::string& str) const {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
  /* ************************************************************************* */
 | 
			
		||||
  template<class Values>
 | 
			
		||||
  SymbolicFactorGraph::shared_ptr NonlinearFactorGraph<Values>::symbolic(
 | 
			
		||||
      const Values& config, const Ordering& ordering) const {
 | 
			
		||||
  template<class VALUES>
 | 
			
		||||
  SymbolicFactorGraph::shared_ptr NonlinearFactorGraph<VALUES>::symbolic(
 | 
			
		||||
      const VALUES& config, const Ordering& ordering) const {
 | 
			
		||||
    // Generate the symbolic factor graph
 | 
			
		||||
    SymbolicFactorGraph::shared_ptr symbolicfg(new SymbolicFactorGraph);
 | 
			
		||||
    symbolicfg->reserve(this->size());
 | 
			
		||||
| 
						 | 
				
			
			@ -97,18 +97,18 @@ void NonlinearFactorGraph<Values>::print(const std::string& str) const {
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  /* ************************************************************************* */
 | 
			
		||||
	template<class Values>
 | 
			
		||||
	template<class VALUES>
 | 
			
		||||
	pair<SymbolicFactorGraph::shared_ptr, Ordering::shared_ptr>
 | 
			
		||||
	NonlinearFactorGraph<Values>::symbolic(const Values& config) const {
 | 
			
		||||
	NonlinearFactorGraph<VALUES>::symbolic(const VALUES& config) const {
 | 
			
		||||
	  // Generate an initial key ordering in iterator order
 | 
			
		||||
    Ordering::shared_ptr ordering(config.orderingArbitrary());
 | 
			
		||||
    return make_pair(symbolic(config, *ordering), ordering);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* ************************************************************************* */
 | 
			
		||||
	template<class Values>
 | 
			
		||||
	boost::shared_ptr<GaussianFactorGraph> NonlinearFactorGraph<Values>::linearize(
 | 
			
		||||
			const Values& config, const Ordering& ordering) const {
 | 
			
		||||
	template<class VALUES>
 | 
			
		||||
	boost::shared_ptr<GaussianFactorGraph> NonlinearFactorGraph<VALUES>::linearize(
 | 
			
		||||
			const VALUES& config, const Ordering& ordering) const {
 | 
			
		||||
 | 
			
		||||
		// create an empty linear FG
 | 
			
		||||
		GaussianFactorGraph::shared_ptr linearFG(new GaussianFactorGraph);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,25 +38,25 @@ namespace gtsam {
 | 
			
		|||
	 * tangent vector space at the linearization point. Because the tangent space is a true
 | 
			
		||||
	 * vector space, the config type will be an VectorValues in that linearized factor graph.
 | 
			
		||||
	 */
 | 
			
		||||
	template<class Values>
 | 
			
		||||
	class NonlinearFactorGraph: public FactorGraph<NonlinearFactor<Values> > {
 | 
			
		||||
	template<class VALUES>
 | 
			
		||||
	class NonlinearFactorGraph: public FactorGraph<NonlinearFactor<VALUES> > {
 | 
			
		||||
 | 
			
		||||
	public:
 | 
			
		||||
 | 
			
		||||
	  typedef FactorGraph<NonlinearFactor<Values> > Base;
 | 
			
		||||
		typedef typename boost::shared_ptr<NonlinearFactor<Values> > sharedFactor;
 | 
			
		||||
	  typedef FactorGraph<NonlinearFactor<VALUES> > Base;
 | 
			
		||||
		typedef typename boost::shared_ptr<NonlinearFactor<VALUES> > sharedFactor;
 | 
			
		||||
 | 
			
		||||
    /** print just calls base class */
 | 
			
		||||
    void print(const std::string& str = "NonlinearFactorGraph: ") const;
 | 
			
		||||
 | 
			
		||||
		/** unnormalized error */
 | 
			
		||||
		double error(const Values& c) const;
 | 
			
		||||
		double error(const VALUES& c) const;
 | 
			
		||||
 | 
			
		||||
		/** all individual errors */
 | 
			
		||||
		Vector unwhitenedError(const Values& c) const;
 | 
			
		||||
		Vector unwhitenedError(const VALUES& c) const;
 | 
			
		||||
 | 
			
		||||
		/** Unnormalized probability. O(n) */
 | 
			
		||||
		double probPrime(const Values& c) const {
 | 
			
		||||
		double probPrime(const VALUES& c) const {
 | 
			
		||||
			return exp(-0.5 * error(c));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ namespace gtsam {
 | 
			
		|||
		/**
 | 
			
		||||
		 * Create a symbolic factor graph using an existing ordering
 | 
			
		||||
		 */
 | 
			
		||||
		SymbolicFactorGraph::shared_ptr symbolic(const Values& config, const Ordering& ordering) const;
 | 
			
		||||
		SymbolicFactorGraph::shared_ptr symbolic(const VALUES& config, const Ordering& ordering) const;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * Create a symbolic factor graph and initial variable ordering that can
 | 
			
		||||
| 
						 | 
				
			
			@ -77,20 +77,20 @@ namespace gtsam {
 | 
			
		|||
		 * ordering is found.
 | 
			
		||||
		 */
 | 
			
		||||
		std::pair<SymbolicFactorGraph::shared_ptr, Ordering::shared_ptr>
 | 
			
		||||
		symbolic(const Values& config) const;
 | 
			
		||||
		symbolic(const VALUES& config) const;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Compute a fill-reducing ordering using COLAMD.  This returns the
 | 
			
		||||
     * ordering and a VariableIndex, which can later be re-used to save
 | 
			
		||||
     * computation.
 | 
			
		||||
     */
 | 
			
		||||
		Ordering::shared_ptr orderingCOLAMD(const Values& config) const;
 | 
			
		||||
		Ordering::shared_ptr orderingCOLAMD(const VALUES& config) const;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * linearize a nonlinear factor graph
 | 
			
		||||
		 */
 | 
			
		||||
		boost::shared_ptr<GaussianFactorGraph>
 | 
			
		||||
				linearize(const Values& config, const Ordering& ordering) const;
 | 
			
		||||
				linearize(const VALUES& config, const Ordering& ordering) const;
 | 
			
		||||
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue