Go to the documentation of this file.
33 using namespace gtsam;
61 return {std::make_shared<JacobianFactor>(
key, I_3x3,
Z_3x1),
62 std::make_shared<JacobianFactor>(
key, I_3x3, Vector3::Ones())};
68 HybridGaussianFactorGraphEliminateFullMultifrontalSimple) {
128 Ordering::ColamdConstrainedLast(hfg, {
M(0),
M(1),
M(2),
M(3)});
180 std::vector<int> naturalX(
N);
181 std::iota(naturalX.begin(), naturalX.end(), 1);
182 std::vector<Key> ordX;
183 std::transform(naturalX.begin(), naturalX.end(), std::back_inserter(ordX),
184 [](
int x) { return X(x); });
187 std::copy(ndX.begin(), ndX.end(), std::back_inserter(
ordering));
190 std::vector<int> naturalC(
N - 1);
191 std::iota(naturalC.begin(), naturalC.end(), 1);
192 std::vector<Key> ordC;
193 std::transform(naturalC.begin(), naturalC.end(), std::back_inserter(ordC),
194 [](
int x) { return M(x); });
197 std::copy(ndC.begin(), ndC.end(), std::back_inserter(
ordering));
200 const auto [hbt, remaining] = hfg->eliminatePartialMultifrontal(
ordering);
227 std::vector<int> naturalX(
N);
228 std::iota(naturalX.begin(), naturalX.end(), 1);
229 std::vector<Key> ordX;
230 std::transform(naturalX.begin(), naturalX.end(), std::back_inserter(ordX),
231 [](
int x) { return X(x); });
234 std::copy(ndX.begin(), ndX.end(), std::back_inserter(
ordering));
237 std::vector<int> naturalC(
N - 1);
238 std::iota(naturalC.begin(), naturalC.end(), 1);
239 std::vector<Key> ordC;
240 std::transform(naturalC.begin(), naturalC.end(), std::back_inserter(ordC),
241 [](
int x) { return M(x); });
245 std::copy(ndC.begin(), ndC.end(), std::back_inserter(
ordering));
248 const auto [hbt, remaining] = hfg->eliminatePartialMultifrontal(
ordering);
269 for (
int t = 1;
t <=
N;
t++) {
276 std::iota(naturalX.begin(), naturalX.end(), 1);
278 for (
size_t i = 1;
i <=
N;
i++) {
279 ordX.emplace_back(
X(
i));
280 ordX.emplace_back(
Y(
i));
283 for (
size_t i = 1;
i <=
N - 1;
i++) {
284 ordX.emplace_back(
M(
i));
286 for (
size_t i = 1;
i <=
N - 1;
i++) {
287 ordX.emplace_back(
D(
i));
313 for (
size_t i = 1;
i <=
N;
i++) {
314 ordering_partial.emplace_back(
X(
i));
315 ordering_partial.emplace_back(
Y(
i));
317 const auto [hbn, remaining] =
318 hfg->eliminatePartialSequential(ordering_partial);
340 s.linearizedFactorGraph().eliminateMultifrontal();
344 expectedValues.
insert(
X(0), -0.999904 * Vector1::Ones());
345 expectedValues.
insert(
X(1), -0.99029 * Vector1::Ones());
346 expectedValues.
insert(
X(2), -1.00971 * Vector1::Ones());
347 expectedValues.
insert(
X(3), -1.0001 * Vector1::Ones());
357 for (
size_t i = 0;
i <
N - 1;
i++) {
360 for (
size_t i = 0;
i <
N;
i++) {
363 for (
size_t i = 0;
i <
N - 1;
i++) {
390 assignment[
M(0)] = 1;
391 assignment[
M(1)] = 1;
392 assignment[
M(2)] = 1;
400 expected_delta.
insert(make_pair(
X(0), -Vector1::Ones()));
401 expected_delta.
insert(make_pair(
X(1), -Vector1::Ones()));
402 expected_delta.
insert(make_pair(
X(2), -Vector1::Ones()));
403 expected_delta.
insert(make_pair(
X(3), -Vector1::Ones()));
410 for (
size_t k = 0; k <
s.K; k++)
ordering.push_back(
X(k));
412 const auto [hybridBayesNet, remainingFactorGraph] =
413 s.linearizedFactorGraph().eliminatePartialSequential(
ordering);
443 for (
size_t k = 0; k <
s.K; k++)
ordering.push_back(
X(k));
445 const auto [hybridBayesNet, remainingFactorGraph] =
446 s.linearizedFactorGraph().eliminatePartialSequential(
ordering);
452 vector<double> probs = {0.012519475, 0.041280228, 0.075018647, 0.081663656,
453 0.037152205, 0.12248971, 0.07349729, 0.08};
457 VectorValues expectedValues = hybridBayesNet->optimize(expectedMPE);
482 assignment[
M(0)] = 1;
483 assignment[
M(1)] = 1;
484 assignment[
M(2)] = 1;
493 auto expected_gbt =
bayesTree->choose(assignment);
std::pair< std::shared_ptr< BayesTreeType >, std::shared_ptr< FactorGraphType > > eliminatePartialMultifrontal(const Ordering &ordering, const Eliminate &function=EliminationTraitsType::DefaultEliminate, OptionalVariableIndex variableIndex={}) const
static int runAllTests(TestResult &result)
void dotPrint(const HybridGaussianFactorGraph::shared_ptr &hfg, const HybridBayesTree::shared_ptr &hbt, const Ordering &ordering)
std::shared_ptr< This > shared_ptr
shared_ptr to This
Incremental Smoothing and Mapping (ISAM) algorithm for hybrid factor graphs.
std::map< char, double > positionHints
Array< double, 1, 3 > e(1./3., 0.5, 2.)
#define EXPECT_LONGS_EQUAL(expected, actual)
#define EXPECT(condition)
static const Eigen::MatrixBase< Vector3 >::ConstantReturnType Z_3x1
iterator insert(const std::pair< Key, Vector > &key_value)
GaussianFactorGraphValuePair Y
static const DiscreteKey m1(M(1), 2)
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
static const DiscreteBayesTree bayesTree
std::pair< KeyVector, std::vector< int > > makeBinaryOrdering(std::vector< Key > &input)
Return the ordering as a binary tree such that all parent nodes are above their children.
static const DiscreteKey m2(M(2), 2)
DiscreteKeys is a set of keys that can be assembled using the & operator.
static const DiscreteKey m0(M(0), 2)
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
TEST(HybridGaussianFactorGraph, EliminateMultifrontal)
static const DiscreteFactorGraph factorGraph(bayesNet)
void update(const NonlinearFactorGraph &newFactors, const Values &initialValues)
std::shared_ptr< BayesTreeType > eliminateMultifrontal(OptionalOrderingType orderingType={}, const Eliminate &function=EliminationTraitsType::DefaultEliminate, OptionalVariableIndex variableIndex={}) const
KeyFormatter DefaultKeyFormatter
Assign default key formatter.
ϕ(X(0)) .. ϕ(X(k),X(k+1)) .. ϕ(X(k);z_k) .. ϕ(M(0)) .. ϕ(M(K-3),M(K-2))
std::vector< GaussianFactor::shared_ptr > components(Key key)
HybridGaussianFactorGraph GetGaussianFactorGraph(size_t N)
NonlinearISAM isam(relinearizeInterval)
VectorValues optimize() const
Hybrid Bayes Tree, the result of eliminating a HybridJunctionTree.
EIGEN_DONT_INLINE void transform(const Transformation &t, Data &data)
HybridGaussianFactorGraph::shared_ptr makeSwitchingChain(size_t K, std::function< Key(int)> x=X, std::function< Key(int)> m=M, const std::string &transitionProbabilityTable="0 1 1 3")
Create a switching system chain. A switching system is a continuous system which depends on a discret...
static const GaussianBayesNet gbn
static enum @1096 ordering
const gtsam::Symbol key('X', 0)
static const DiscreteKey m3(M(3), 2)
IsDerived< DERIVEDFACTOR > push_back(std::shared_ptr< DERIVEDFACTOR > factor)
Add a factor directly using a shared_ptr.
std::pair< Key, size_t > DiscreteKey
Implementation of a discrete-conditioned hybrid factor. Implements a joint discrete-continuous factor...
const HybridGaussianFactorGraph graph1
bool assert_equal(const Matrix &expected, const Matrix &actual, double tol)
const Ordering HybridOrdering(const HybridGaussianFactorGraph &graph)
Return a Colamd constrained ordering where the discrete keys are eliminated after the continuous keys...
DiscreteValues optimize(OptionalOrderingType orderingType={}) const
Find the maximum probable explanation (MPE) by doing max-product.
IsDerived< DERIVEDFACTOR > add(std::shared_ptr< DERIVEDFACTOR > factor)
add is a synonym for push_back.
NonlinearFactorGraph graph
std::uint64_t Key
Integer nonlinear key type.
DotWriter is a helper class for writing graphviz .dot files.
std::shared_ptr< This > shared_ptr
IsDerived< DERIVEDFACTOR > emplace_shared(Args &&... args)
Emplace a shared pointer to factor of given type.
Matrix< RealScalar, Dynamic, Dynamic > M
gtsam
Author(s):
autogenerated on Sun Feb 16 2025 04:06:28