1function [CSH_ann,numUniqueResultsPerPixel,sortedErrors] = TransitiveKNN_part2(A,B,k,width,overSafeResults,errorMat)
 2
 3[hA,wA,dA] = size(A);
 4[hB,wB,dB] = size(B);
 5
 6% sort by errors and then take the k mappings of the k smallest [unique!] errors
 7br_boundary_to_ignore = width-1;
 8numUniqueResultsPerPixel = zeros(hA-br_boundary_to_ignore,wA-br_boundary_to_ignore);
 9CSH_ann = zeros(k,hA,wA,2);
10sortedErrors = zeros(hA,wA,k);
11% CSH_errors = zeros(hA,wA,k);
12for i = 1 : hA-br_boundary_to_ignore
13    for j = 1 : wA-br_boundary_to_ignore
14        [sErrors,sInds] = sort(squeeze(errorMat(i,j,:)));
15        OSR = squeeze(overSafeResults(i,j,:));
16        sOSR = OSR(sInds);
17        uOSRinds = find(diff(sOSR)~=0); % giving up (possibly) on the last index (diff gives a 1-shorter vector)
18        kActual = length(uOSRinds);
19        uOSRFinalinds = zeros(k,1);
20        numUniqueResultsPerPixel(i,j) = min(k,kActual);
21        if kActual >= k
22            uOSRFinalinds = uOSRinds(1:k);
23        else
24            uOSRFinalinds(1:kActual) = uOSRinds;
25            uOSRFinalinds(kActual+1:k) = uOSRinds(end); % returning duplicate copies in this case
26        end
27        % NN results:
28        [CSH_ann(:,i,j,2),CSH_ann(:,i,j,1)] = ind2sub([hB,wB],sOSR(uOSRFinalinds));
29        % sorted errors:
30        sortedErrors(i,j,:) = sErrors(uOSRFinalinds);
31    end
32end
33
34CSH_ann = permute(CSH_ann,[2,3,4,1]);