22 #include <gtsam/linear/IterativeSolver.h>
23 #include <gtsam/linear/Preconditioner.h>
25 #include <boost/shared_ptr.hpp>
30 class GaussianBayesNet;
31 class GaussianFactorGraph;
39 SubgraphEdge(
const size_t index,
const double weight = 1.0): index_(index), weight_(weight) {}
40 inline size_t index()
const {
return index_; }
41 inline double weight()
const {
return weight_; }
42 inline bool isUnitWeight()
const {
return (weight_ == 1.0); }
43 friend std::ostream &operator<<(std::ostream &os,
const SubgraphEdge &edge);
45 friend class boost::serialization::access;
46 template<
class Archive>
47 void serialize(Archive & ar,
const unsigned int version) {
48 ar & BOOST_SERIALIZATION_NVP(index_);
49 ar & BOOST_SERIALIZATION_NVP(weight_);
56 typedef boost::shared_ptr<Subgraph> shared_ptr;
57 typedef std::vector<shared_ptr> vector_shared_ptr;
58 typedef std::vector<SubgraphEdge> Edges;
59 typedef std::vector<size_t> EdgeIndices;
60 typedef Edges::iterator iterator;
61 typedef Edges::const_iterator const_iterator;
69 Subgraph(
const Edges &edges) : edges_(edges) {}
70 Subgraph(
const std::vector<size_t> &indices) ;
72 inline const Edges& edges()
const {
return edges_; }
73 inline const size_t size()
const {
return edges_.size(); }
74 EdgeIndices edgeIndices()
const;
76 iterator begin() {
return edges_.begin(); }
77 const_iterator begin()
const {
return edges_.begin(); }
78 iterator end() {
return edges_.end(); }
79 const_iterator end()
const {
return edges_.end(); }
81 void save(
const std::string &fn)
const;
82 static shared_ptr load(
const std::string &fn);
83 friend std::ostream &operator<<(std::ostream &os,
const Subgraph &subgraph);
86 friend class boost::serialization::access;
87 template<
class Archive>
88 void serialize(Archive & ar,
const unsigned int version) {
89 ar & BOOST_SERIALIZATION_NVP(edges_);
96 typedef boost::shared_ptr<SubgraphBuilderParameters> shared_ptr;
105 enum SkeletonWeight {
112 enum AugmentationWeight {
116 } augmentationWeight_ ;
121 : skeleton_(KRUSKAL), skeletonWeight_(RANDOM), augmentationWeight_(SKELETON), complexity_(1.0) {}
126 virtual void print(std::ostream &os)
const ;
129 static Skeleton skeletonTranslator(
const std::string &s);
130 static std::string skeletonTranslator(Skeleton w);
131 static SkeletonWeight skeletonWeightTranslator(
const std::string &s);
132 static std::string skeletonWeightTranslator(SkeletonWeight w);
133 static AugmentationWeight augmentationWeightTranslator(
const std::string &s);
134 static std::string augmentationWeightTranslator(AugmentationWeight w);
142 typedef boost::shared_ptr<SubgraphBuilder> shared_ptr;
143 typedef std::vector<double> Weights;
156 std::vector<size_t> sample(
const std::vector<double> &weights,
const size_t t)
const ;
165 typedef boost::shared_ptr<SubgraphPreconditionerParameters> shared_ptr;
167 :
Base(), builderParams_(p) {}
182 typedef boost::shared_ptr<SubgraphPreconditioner> shared_ptr;
183 typedef boost::shared_ptr<const GaussianBayesNet> sharedBayesNet;
184 typedef boost::shared_ptr<const GaussianFactorGraph> sharedFG;
185 typedef boost::shared_ptr<const VectorValues> sharedValues;
186 typedef boost::shared_ptr<const Errors> sharedErrors;
213 void print(
const std::string& s =
"SubgraphPreconditioner")
const;
216 const sharedFG&
Ab2()
const {
return Ab2_; }
219 const sharedBayesNet&
Rc1()
const {
return Rc1_; }
222 const sharedErrors
b2bar()
const {
return b2bar_; }
243 void transposeMultiplyAdd2(
double alpha, Errors::const_iterator begin,
244 Errors::const_iterator end, VectorValues& y)
const;
247 double error(
const VectorValues& y)
const;
250 VectorValues gradient(
const VectorValues& y)
const;
253 Errors
operator*(
const VectorValues& y)
const;
256 void multiplyInPlace(
const VectorValues& y, Errors& e)
const;
259 VectorValues
operator^(
const Errors& e)
const;
271 virtual void solve(
const Vector& y, Vector &x)
const;
272 virtual void transposeSolve(
const Vector& y, Vector& x)
const ;
275 const GaussianFactorGraph &gfg,
277 const std::map<Key,Vector> &lambda
283 Vector getSubvector(
const Vector &src,
const KeyInfo &keyInfo,
const FastVector<Key> &keys);
286 void setSubvector(
const Vector &src,
const KeyInfo &keyInfo,
const FastVector<Key> &keys, Vector &dst);
290 boost::shared_ptr<GaussianFactorGraph>
291 buildFactorSubgraph(
const GaussianFactorGraph &gfg,
const Subgraph &subgraph,
const bool clone);
295 template <
typename Container>
296 std::vector<size_t> sort_idx(
const Container &src)
298 typedef typename Container::value_type T;
299 const size_t n = src.size() ;
300 std::vector<std::pair<size_t,T> > tmp;
302 for (
size_t i = 0 ; i < n ; i++ )
303 tmp.push_back(std::make_pair(i, src[i]));
306 std::stable_sort(tmp.begin(), tmp.end()) ;
309 std::vector<size_t> idx; idx.reserve(n);
310 for (
size_t i = 0 ; i < n ; i++ ) {
311 idx.push_back(tmp[i].first) ;
void transposeMultiplyAdd(double alpha, const Matrix &A, const Vector &e, Vector &x)
BLAS Level-2 style x <- x + alpha*A'*e.
Definition: Matrix.cpp:168
const sharedBayesNet & Rc1() const
Access Rc1.
Definition: SubgraphPreconditioner.h:219
Definition: SubgraphPreconditioner.h:34
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
void save(const Matrix &A, const string &s, const string &filename)
save a matrix to file, which can be loaded by matlab
Definition: Matrix.cpp:202
Definition: SubgraphPreconditioner.h:163
Included from all GTSAM files.
Point2 operator*(double s, const Point2 &p)
multiply with scalar
Definition: Point2.h:249
Definition: SubgraphPreconditioner.h:94
bool zero(const Vector &v)
check if all zero
Definition: Vector.cpp:39
const sharedFG & Ab2() const
Access Ab2.
Definition: SubgraphPreconditioner.h:216
void print(const Matrix &A, const string &s, ostream &stream)
print a matrix
Definition: Matrix.cpp:183
static VectorValues Zero(const VectorValues &other)
Create a VectorValues with the same structure as other, but filled with zeros.
Definition: VectorValues.cpp:61
Definition: Preconditioner.h:23
Definition: IterativeSolver.h:115
Definition: SubgraphPreconditioner.h:138
Subgraph conditioner class, as explained in the RSS 2010 submission.
Definition: SubgraphPreconditioner.h:179
This class represents a collection of vector-valued variables associated each with a unique integer i...
Definition: VectorValues.h:89
Vector operator^(const Matrix &A, const Vector &v)
overload ^ for trans(A)*v We transpose the vectors for speed.
Definition: Matrix.cpp:158
A Linear Factor Graph is a factor graph where all factors are Gaussian, i.e.
Definition: GaussianFactorGraph.h:65
const sharedErrors b2bar() const
Access b2bar.
Definition: SubgraphPreconditioner.h:222
Definition: Preconditioner.h:62
Definition: SubgraphPreconditioner.h:54