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], []) |