77 lines
2.0 KiB
Matlab
77 lines
2.0 KiB
Matlab
% This script tests the math of correcting joint marginals with root
|
|
% shortcuts, using only simple matrix math and avoiding any GTSAM calls.
|
|
% It turns out that it is not possible to correct root shortcuts for
|
|
% joinoint marginals, thus actual_ij_1_2__ will not equal
|
|
% expected_ij_1_2__.
|
|
|
|
%% Check that we get the BayesTree structure we are expecting
|
|
fg = gtsam.SymbolicFactorGraph;
|
|
fg.push_factor(1,3,7,10);
|
|
fg.push_factor(2,5,7,10);
|
|
fg.push_factor(3,4,7,8);
|
|
fg.push_factor(5,6,7,8);
|
|
fg.push_factor(7,8,9,10);
|
|
fg.push_factor(10,11);
|
|
fg.push_factor(11);
|
|
fg.push_factor(7,8,9);
|
|
fg.push_factor(7,8);
|
|
fg.push_factor(5,6);
|
|
fg.push_factor(3,4);
|
|
|
|
bt = gtsam.SymbolicMultifrontalSolver(fg).eliminate;
|
|
bt
|
|
|
|
%%
|
|
% P( 10 11)
|
|
% P( 7 8 9 | 10)
|
|
% P( 5 6 | 7 8 10)
|
|
% P( 2 | 5 7 10)
|
|
% P( 3 4 | 7 8 10)
|
|
% P( 1 | 3 7 10)
|
|
A = [ ...
|
|
% 1 2 3 4 5 6 7 8 9 10 11 b
|
|
1 0 2 0 0 0 3 0 0 4 0 5
|
|
0 6 0 0 7 0 8 0 0 9 0 10
|
|
0 0 11 12 0 0 13 14 0 15 0 16
|
|
0 0 0 0 17 18 19 20 0 21 0 22
|
|
0 0 0 0 0 0 23 24 25 26 0 27
|
|
0 0 0 0 0 0 0 0 0 28 29 30
|
|
0 0 0 0 0 0 0 0 0 0 31 32
|
|
0 0 0 0 0 0 33 34 35 0 0 36
|
|
0 0 0 0 0 0 37 38 0 0 0 39
|
|
0 0 0 0 40 41 0 0 0 0 0 42
|
|
0 0 43 44 0 0 0 0 0 0 0 45
|
|
%0 0 0 0 46 0 0 0 0 0 0 47
|
|
%0 0 48 0 0 0 0 0 0 0 0 49
|
|
];
|
|
|
|
% Compute shortcuts
|
|
shortcut3_7__10_11 = shortcut(A, [3,7], [10,11]);
|
|
shortcut5_7__10_11 = shortcut(A, [5,7], [10,11]);
|
|
|
|
% Factor into pieces
|
|
% Factor p(5,7|10,11) into p(5|7,10,11) p(7|10,11)
|
|
[ si_si__sij_R, si_sij__R ] = eliminate(shortcut3_7__10_11, [3]);
|
|
[ sj_sj__sij_R, sj_sij__R ] = eliminate(shortcut5_7__10_11, [5]);
|
|
|
|
% Get root marginal
|
|
R__ = A([6,7], :);
|
|
|
|
% Get clique conditionals
|
|
i_1__3_7_10 = A(1, :);
|
|
j_2__5_7_10 = A(2, :);
|
|
|
|
% Check
|
|
expected_ij_1_2__ = shortcut(A, [1,2], [])
|
|
|
|
% Compute joint
|
|
ij_1_2_3_5_7_10_11 = [
|
|
i_1__3_7_10
|
|
j_2__5_7_10
|
|
si_si__sij_R
|
|
sj_sj__sij_R
|
|
si_sij__R
|
|
R__
|
|
];
|
|
actual_ij_1_2__ = shortcut(ij_1_2_3_5_7_10_11, [1,2], [])
|