[Work Log] Work Log

December 19, 2013
Project Tulips
Subproject Data Association v3
Working path projects/​tulips/​trunk/​src/​matlab/​data_association_3
SVN Revision 15864
Unless otherwise noted, all filesystem paths are relative to the "Working path" named above.

Troubleshooting Jacobians of z and mu.

Analytical and numerical versions of z's Jacobian differ significantly in some entries. To troubleshoot, stepping backward through the derivations of J_z outlined in the reference post.

I will refer to the final equation from that post and count backward from the final line, describing the result of implementing each line. E.g. line 0 is the final result, the one used to compute z_ana; line 1 is the one labelled "(3D version)" .


Track = detach(trash_Tracks_11(end), params_test);
K = get_K(Track); 
S = Track.ll_S;
U = speye(size(K)) + S * K * S';
Ui = inv(U);
kern = get_model_kernel_derivative(params_test);
ind = get_curve_indices(Track);
views = Track.ll_views_flat;
Delta = eval_kernel(kern, ind, ind, views, views);
Delta3 = one_d_to_three_d(Delta);

i = 1;   
i3 = 3*(i-1)+1;
I = i3:i3+2;

delta_i = Delta(i,:)';
delta_i3 = one_d_to_three_d(delta_i);

dK = zeros(size(K));
dK(I,:) = dK(I,:) + Delta3(I,:);
dK(:,I) = dK(:,I) + Delta3(I,:)';

A = A = S' * Ui * S;
z = z = A * y;
N = length(K);

Implementing line 1:

line_1 = -A(:,I) *delta_i3' * z - A * delta_i3 * z(i3:i3+2);

It actually looks pretty good. So why is line_0 wrong?

Let's isolate the first term.

line_1_a = -A(:,I) *delta_i3' * z;
line_0_a = -sum_1xN(A .* repmat((Delta3 * z)', N,1), 3);
plot(xx, line_1_a - line_0_a(:,i))

Error within 1e-12. Great! Error must be in the second term...

line_1_b = A * delta_i3 * z(i3:i3+2);
line_0_b =  - A * (Delta3(1:3:end, :)' .* repmat(reshape(z,3,[]), N/3, 1));
plot(xx, line_1_b - line_0_b(:,i))

Yep. it's a mess.


Found the bug. Was incorrectly trying to implement Delta{1x3} by taking Delta{3x3}(1:3:end, :), which is totally wrong. Also, was mis-associating the matrix multiplication and elementwise multiplication. That is, I was taking (A * Delta_1x3) . XXX instead of A * (Delta_1x3 . XXX).

Those two fixes, and the dZ test now passes.

Still getting bad results for dmu.


Same bug as for dZ.

Developed new constant-width energy function, and derived its gradient. Writeup is here.


Posted by Kyle Simek
blog comments powered by Disqus