gtsam  3.2.1
gtsam
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
linearAlgorithms-inst.h
Go to the documentation of this file.
1 /* ----------------------------------------------------------------------------
2 
3  * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4  * Atlanta, Georgia 30332-0415
5  * All Rights Reserved
6  * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7 
8  * See LICENSE for the license information
9 
10  * -------------------------------------------------------------------------- */
11 
21 
22 #include <boost/optional.hpp>
23 #include <boost/shared_ptr.hpp>
24 
25 namespace gtsam
26 {
27  namespace internal
28  {
29  namespace linearAlgorithms
30  {
31  /* ************************************************************************* */
32  struct OptimizeData {
33  boost::optional<OptimizeData&> parentData;
35  //VectorValues ancestorResults;
36  //VectorValues results;
37  };
38 
39  /* ************************************************************************* */
46  template<class CLIQUE>
48  {
49  VectorValues collectedResult;
50 
51  OptimizeData operator()(
52  const boost::shared_ptr<CLIQUE>& clique,
53  OptimizeData& parentData)
54  {
55  OptimizeData myData;
56  myData.parentData = parentData;
57  // Take any ancestor results we'll need
58  BOOST_FOREACH(Key parent, clique->conditional_->parents())
59  myData.cliqueResults.insert(std::make_pair(parent, myData.parentData->cliqueResults.at(parent)));
60  // Solve and store in our results
61  //collectedResult.insert(clique->conditional()->solve(collectedResult/*myData.ancestorResults*/));
62  {
63  GaussianConditional& c = *clique->conditional();
64  // Solve matrix
65  Vector xS;
66  {
67  // Count dimensions of vector
68  DenseIndex dim = 0;
70  parentPointers.reserve(clique->conditional()->nrParents());
71  BOOST_FOREACH(Key parent, clique->conditional()->parents()) {
72  parentPointers.push_back(myData.cliqueResults.at(parent));
73  dim += parentPointers.back()->second.size();
74  }
75 
76  // Fill parent vector
77  xS.resize(dim);
78  DenseIndex vectorPos = 0;
79  BOOST_FOREACH(const VectorValues::const_iterator& parentPointer, parentPointers) {
80  const Vector& parentVector = parentPointer->second;
81  xS.block(vectorPos,0,parentVector.size(),1) = parentVector.block(0,0,parentVector.size(),1);
82  vectorPos += parentVector.size();
83  }
84  }
85  xS = c.getb() - c.get_S() * xS;
86  Vector soln = c.get_R().triangularView<Eigen::Upper>().solve(xS);
87 
88  // Check for indeterminant solution
89  if(soln.hasNaN()) throw IndeterminantLinearSystemException(c.keys().front());
90 
91  // Insert solution into a VectorValues
92  DenseIndex vectorPosition = 0;
93  for(GaussianConditional::const_iterator frontal = c.beginFrontals(); frontal != c.endFrontals(); ++frontal) {
95  collectedResult.insert(*frontal, soln.segment(vectorPosition, c.getDim(frontal)));
96  myData.cliqueResults.insert(make_pair(r->first, r));
97  vectorPosition += c.getDim(frontal);
98  }
99  }
100  return myData;
101  }
102  };
103 
104  /* ************************************************************************* */
105  //OptimizeData OptimizePreVisitor(const GaussianBayesTreeClique::shared_ptr& clique, OptimizeData& parentData)
106  //{
107  // // Create data - holds a pointer to our parent, a copy of parent solution, and our results
108  // OptimizeData myData;
109  // myData.parentData = parentData;
110  // // Take any ancestor results we'll need
111  // BOOST_FOREACH(Key parent, clique->conditional_->parents())
112  // myData.ancestorResults.insert(parent, myData.parentData->ancestorResults[parent]);
113  // // Solve and store in our results
114  // myData.results.insert(clique->conditional()->solve(myData.ancestorResults));
115  // myData.ancestorResults.insert(myData.results);
116  // return myData;
117  //}
118 
119  /* ************************************************************************* */
120  //void OptimizePostVisitor(const GaussianBayesTreeClique::shared_ptr& clique, OptimizeData& myData)
121  //{
122  // // Conglomerate our results to the parent
123  // myData.parentData->results.insert(myData.results);
124  //}
125 
126  /* ************************************************************************* */
127  template<class BAYESTREE>
128  VectorValues optimizeBayesTree(const BAYESTREE& bayesTree)
129  {
130  gttic(linear_optimizeBayesTree);
131  //internal::OptimizeData rootData; // Will hold final solution
132  //treeTraversal::DepthFirstForest(*this, rootData, internal::OptimizePreVisitor, internal::OptimizePostVisitor);
133  //return rootData.results;
134  OptimizeData rootData;
136  treeTraversal::no_op postVisitor;
137  TbbOpenMPMixedScope threadLimiter; // Limits OpenMP threads since we're mixing TBB and OpenMP
138  treeTraversal::DepthFirstForestParallel(bayesTree, rootData, preVisitor, postVisitor);
139  return preVisitor.collectedResult;
140  }
141  }
142  }
143 }
Definition: FastMap.h:37
constABlock get_R() const
Return a view of the upper-triangular R block of the conditional.
Definition: GaussianConditional.h:97
virtual DenseIndex getDim(const_iterator variable) const
Return the dimension of the variable pointed to by the given key iterator todo: Remove this in favor ...
Definition: JacobianFactor.h:236
void solve(Matrix &A, Matrix &B)
solve AX=B via in-place Lu factorization and backsubstitution After calling, A contains LU...
Definition: Matrix.cpp:283
Definition: linearAlgorithms-inst.h:32
FACTOR::const_iterator endFrontals() const
Iterator pointing past the last frontal key.
Definition: Conditional.h:107
Factor Graph Values.
Conditional Gaussian Base class.
Values::const_iterator const_iterator
Const iterator over vector values.
Definition: VectorValues.h:97
const FastVector< Key > & keys() const
Access the factor's involved variable keys.
Definition: Factor.h:115
Pre-order visitor for back-substitution in a Bayes tree.
Definition: linearAlgorithms-inst.h:47
size_t dim(const Vector &v)
dimensionality == size
Definition: Vector.h:90
FACTOR::const_iterator beginFrontals() const
Iterator pointing to first frontal key.
Definition: Conditional.h:104
void DepthFirstForestParallel(FOREST &forest, DATA &rootData, VISITOR_PRE &visitorPre, VISITOR_POST &visitorPost, int problemSizeThreshold=10)
Traverse a forest depth-first with pre-order and post-order visits.
Definition: treeTraversal-inst.h:152
size_t Key
Integer nonlinear key type.
Definition: types.h:59
Thrown when a linear system is ill-posed.
Definition: linearExceptions.h:95
ptrdiff_t DenseIndex
The index type for Eigen objects.
Definition: types.h:74
This class represents a collection of vector-valued variables associated each with a unique integer i...
Definition: VectorValues.h:89
iterator insert(Key j, const Vector &value)
Insert a vector value with key j.
Definition: VectorValues.h:183
const constBVector getb() const
Get a view of the r.h.s.
Definition: JacobianFactor.h:255
constABlock get_S() const
Get a view of the parent blocks.
Definition: GaussianConditional.h:100
Definition: FastVector.h:38
A conditional Gaussian functions as the node in a Bayes network It has a set of parents y...
Definition: GaussianConditional.h:36
An object whose scope defines a block where TBB and OpenMP parallelism are mixed. ...
Definition: types.h:258
FastVector< Key >::const_iterator const_iterator
Const iterator over keys.
Definition: Factor.h:64