Fix Matlab tests and add saveGraph method to GaussianBayesNet
parent
ad9e8536e7
commit
faf004347b
|
@ -1791,6 +1791,8 @@ virtual class GaussianBayesNet {
|
||||||
gtsam::KeySet keys() const;
|
gtsam::KeySet keys() const;
|
||||||
bool exists(size_t idx) const;
|
bool exists(size_t idx) const;
|
||||||
|
|
||||||
|
void saveGraph(const string& s) const;
|
||||||
|
|
||||||
gtsam::GaussianConditional* front() const;
|
gtsam::GaussianConditional* front() const;
|
||||||
gtsam::GaussianConditional* back() const;
|
gtsam::GaussianConditional* back() const;
|
||||||
void push_back(gtsam::GaussianConditional* conditional);
|
void push_back(gtsam::GaussianConditional* conditional);
|
||||||
|
|
|
@ -12,15 +12,16 @@
|
||||||
/**
|
/**
|
||||||
* @file GaussianBayesNet.cpp
|
* @file GaussianBayesNet.cpp
|
||||||
* @brief Chordal Bayes Net, the result of eliminating a factor graph
|
* @brief Chordal Bayes Net, the result of eliminating a factor graph
|
||||||
* @author Frank Dellaert
|
* @author Frank Dellaert, Varun Agrawal
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <gtsam/base/timing.h>
|
||||||
|
#include <gtsam/inference/FactorGraph-inst.h>
|
||||||
#include <gtsam/linear/GaussianBayesNet.h>
|
#include <gtsam/linear/GaussianBayesNet.h>
|
||||||
#include <gtsam/linear/GaussianFactorGraph.h>
|
#include <gtsam/linear/GaussianFactorGraph.h>
|
||||||
#include <gtsam/inference/FactorGraph-inst.h>
|
|
||||||
#include <gtsam/base/timing.h>
|
|
||||||
|
|
||||||
#include <boost/range/adaptor/reversed.hpp>
|
#include <boost/range/adaptor/reversed.hpp>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace gtsam;
|
using namespace gtsam;
|
||||||
|
@ -204,5 +205,23 @@ namespace gtsam {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
void GaussianBayesNet::saveGraph(const std::string& s,
|
||||||
|
const KeyFormatter& keyFormatter) const {
|
||||||
|
std::ofstream of(s.c_str());
|
||||||
|
of << "digraph G{\n";
|
||||||
|
|
||||||
|
for (auto conditional : boost::adaptors::reverse(*this)) {
|
||||||
|
typename GaussianConditional::Frontals frontals = conditional->frontals();
|
||||||
|
Key me = frontals.front();
|
||||||
|
typename GaussianConditional::Parents parents = conditional->parents();
|
||||||
|
for (Key p : parents)
|
||||||
|
of << keyFormatter(p) << "->" << keyFormatter(me) << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
of << "}";
|
||||||
|
of.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
|
||||||
} // namespace gtsam
|
} // namespace gtsam
|
||||||
|
|
|
@ -177,6 +177,16 @@ namespace gtsam {
|
||||||
*/
|
*/
|
||||||
VectorValues backSubstituteTranspose(const VectorValues& gx) const;
|
VectorValues backSubstituteTranspose(const VectorValues& gx) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Save the GaussianBayesNet as an image. Requires `dot` to be
|
||||||
|
* installed.
|
||||||
|
*
|
||||||
|
* @param s The name of the figure.
|
||||||
|
* @param keyFormatter Formatter to use for styling keys in the graph.
|
||||||
|
*/
|
||||||
|
void saveGraph(const std::string& s, const KeyFormatter& keyFormatter =
|
||||||
|
DefaultKeyFormatter) const;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -5,4 +5,6 @@ function plotBayesNet(bayesNet)
|
||||||
bayesNet.saveGraph('/tmp/bayesNet.dot')
|
bayesNet.saveGraph('/tmp/bayesNet.dot')
|
||||||
!dot -Tpng -o /tmp/dotImage.png /tmp/bayesNet.dot
|
!dot -Tpng -o /tmp/dotImage.png /tmp/bayesNet.dot
|
||||||
dotImage=imread('/tmp/dotImage.png');
|
dotImage=imread('/tmp/dotImage.png');
|
||||||
imshow(dotImage)
|
imshow(dotImage)
|
||||||
|
|
||||||
|
end
|
|
@ -5,4 +5,6 @@ function plotBayesTree(bayesTree)
|
||||||
bayesTree.saveGraph('/tmp/bayesTree.dot')
|
bayesTree.saveGraph('/tmp/bayesTree.dot')
|
||||||
!dot -Tpng -o /tmp/dotImage.png /tmp/bayesTree.dot
|
!dot -Tpng -o /tmp/dotImage.png /tmp/bayesTree.dot
|
||||||
dotImage=imread('/tmp/dotImage.png');
|
dotImage=imread('/tmp/dotImage.png');
|
||||||
imshow(dotImage)
|
imshow(dotImage)
|
||||||
|
|
||||||
|
end
|
|
@ -20,4 +20,4 @@
|
||||||
%% Run the tests
|
%% Run the tests
|
||||||
import gtsam.*
|
import gtsam.*
|
||||||
bayesTree = thinBayesTree(3,2);
|
bayesTree = thinBayesTree(3,2);
|
||||||
EQUALITY('7 = bayesTree.size', 7, bayesTree.size);
|
EQUALITY('7 = bayesTree.size', 4, bayesTree.size);
|
|
@ -44,15 +44,15 @@ optimize = true;
|
||||||
rank_tol = 1e-9;
|
rank_tol = 1e-9;
|
||||||
|
|
||||||
triangulated_landmark = triangulatePoint3(poses,sharedCal, measurements, rank_tol, optimize);
|
triangulated_landmark = triangulatePoint3(poses,sharedCal, measurements, rank_tol, optimize);
|
||||||
CHECK('triangulated_landmark',landmark.equals(triangulated_landmark,1e-9));
|
CHECK('triangulated_landmark', abs(landmark - triangulated_landmark) < 1e-9);
|
||||||
|
|
||||||
%% 2. Add some noise and try again: result should be ~ (4.995, 0.499167, 1.19814)
|
%% 2. Add some noise and try again: result should be ~ (4.995, 0.499167, 1.19814)
|
||||||
measurements = Point2Vector;
|
measurements = Point2Vector;
|
||||||
measurements.push_back(z1.retract([0.1;0.5]));
|
measurements.push_back(z1 + [0.1;0.5]);
|
||||||
measurements.push_back(z2.retract([-0.2;0.3]));
|
measurements.push_back(z2 + [-0.2;0.3]);
|
||||||
|
|
||||||
triangulated_landmark = triangulatePoint3(poses,sharedCal, measurements, rank_tol, optimize);
|
triangulated_landmark = triangulatePoint3(poses,sharedCal, measurements, rank_tol, optimize);
|
||||||
CHECK('triangulated_landmark',landmark.equals(triangulated_landmark,1e-2));
|
CHECK('triangulated_landmark', abs(landmark - triangulated_landmark) < 1e-2);
|
||||||
|
|
||||||
%% two Poses with Bundler Calibration
|
%% two Poses with Bundler Calibration
|
||||||
bundlerCal = Cal3Bundler(1500, 0, 0, 640, 480);
|
bundlerCal = Cal3Bundler(1500, 0, 0, 640, 480);
|
||||||
|
@ -67,4 +67,4 @@ measurements.push_back(z1);
|
||||||
measurements.push_back(z2);
|
measurements.push_back(z2);
|
||||||
|
|
||||||
triangulated_landmark = triangulatePoint3(poses,bundlerCal, measurements, rank_tol, optimize);
|
triangulated_landmark = triangulatePoint3(poses,bundlerCal, measurements, rank_tol, optimize);
|
||||||
CHECK('triangulated_landmark',landmark.equals(triangulated_landmark,1e-9));
|
CHECK('triangulated_landmark', abs(landmark - triangulated_landmark) < 1e-9);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
function bayesTree = thinBayesTree(depth, width)
|
function bayesTree = thinBayesTree(depth, width)
|
||||||
import gtsam.*
|
import gtsam.*
|
||||||
bayesNet = thinTreeBayesNet(depth, width);
|
bayesNet = thinTreeBayesNet(depth, width);
|
||||||
bayesTree = GaussianBayesTree(bayesNet);
|
fg = GaussianFactorGraph(bayesNet);
|
||||||
|
bayesTree = fg.eliminateMultifrontal();
|
||||||
end
|
end
|
|
@ -6,8 +6,9 @@ bayesNet = GaussianBayesNet;
|
||||||
tree = thinTree(depth,width);
|
tree = thinTree(depth,width);
|
||||||
|
|
||||||
% Add root to the Bayes net
|
% Add root to the Bayes net
|
||||||
gc = gtsam.GaussianConditional(1, 5*rand(1), 5*rand(1), 3*rand(1));
|
model = noiseModel.Isotropic.Sigma(1, 3*rand(1));
|
||||||
bayesNet.push_front(gc);
|
gc = gtsam.GaussianConditional(1, 5*rand(1), 5*rand(1), model);
|
||||||
|
bayesNet.push_back(gc);
|
||||||
|
|
||||||
n=tree.getNumberOfElements();
|
n=tree.getNumberOfElements();
|
||||||
for i=2:n
|
for i=2:n
|
||||||
|
@ -17,13 +18,15 @@ for i=2:n
|
||||||
% Create and link the corresponding GaussianConditionals
|
% Create and link the corresponding GaussianConditionals
|
||||||
if tree.getW == 1 || di == 2
|
if tree.getW == 1 || di == 2
|
||||||
% Creation of single-parent GaussianConditional
|
% Creation of single-parent GaussianConditional
|
||||||
gc = gtsam.GaussianConditional(n-i, 5*rand(1), 5*rand(1), n-parents(1), 5*rand(1), 5*rand(1));
|
model = noiseModel.Isotropic.Sigma(1, 5*rand(1));
|
||||||
|
gc = gtsam.GaussianConditional(n-i, 5*rand(1), 5*rand(1), n-parents(1), 5*rand(1), model);
|
||||||
elseif tree.getW == 2 || di == 3
|
elseif tree.getW == 2 || di == 3
|
||||||
% GaussianConditionalj associated with the second parent
|
% GaussianConditionalj associated with the second parent
|
||||||
gc = gtsam.GaussianConditional(n-i, 5*rand(1), 5*rand(1), n-parents(1), 5*rand(1), n-parents(2), 5*rand(1), 5*rand(1));
|
model = noiseModel.Isotropic.Sigma(1, 5*rand(1));
|
||||||
|
gc = gtsam.GaussianConditional(n-i, 5*rand(1), 5*rand(1), n-parents(1), 5*rand(1), n-parents(2), 5*rand(1), model);
|
||||||
end
|
end
|
||||||
% Add conditional to the Bayes net
|
% Add conditional to the Bayes net
|
||||||
bayesNet.push_front(gc);
|
bayesNet.push_back(gc);
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
Loading…
Reference in New Issue