function [ SimilarityMatrix ] = similarity_neighbor_grid_further( x, side, types, dist)
%similarity_neighbor_grid_further Summary of this function goes here

    % this assumes that the patch is laid out with first column, then second
    % column, ... final column (column major)

%     dist = 2;
    SimilarityMatrix = eye(side*side);

    % types - 1 - horizontal, 2 - vertical, 3 - diagonal (bl-tr), 4 -
    % diagonal (br - tl)
    for t=1:numel(types)

        if(types(t) == 1)
            
            % for horizontal we want to link both neighbours 
            % (which are offset from the points by height)
            i = 1:(side*side-side*dist);
            % create the neighboring links for i
            SimilarityMatrix(sub2ind([side^2, side^2], i, i+side*dist)) = 1;
            SimilarityMatrix(sub2ind([side^2, side^2], i+side*dist, i)) = 1;            
                        
        end        
        if(types(t) == 2)
            
            % for vertical we want to link both neighbours except at edge
            % cases which are mod(y_loc,side) = 0 as they are at the edges
            i = 1:side*side;
            i_to_rem =[];
            for s=1:dist
                i_to_rem = union(i_to_rem, i(mod(i+s-1, side) == 0));
            end
            i_both = setdiff(i, i_to_rem);
            % create the neighboring links for i
            SimilarityMatrix(sub2ind([side^2, side^2], i_both+dist, i_both)) = 1;
            SimilarityMatrix(sub2ind([side^2, side^2], i_both, i_both+dist)) = 1;
                        
        end        
        if(types(t) == 3)
            
            % for diagonal to top right, and bottom left don't use right most column
            i = 1:(side^2)-dist * side;
            i_to_rem = [];
            for s=1:dist
                i_to_rem = union(i_to_rem,i(mod(i-s, side) == 0));
            end
            i_both = setdiff(i, i_to_rem);
            % create the neighboring links for i
            SimilarityMatrix(sub2ind([side^2, side^2], i_both+dist*side-dist, i_both)) = 1;
            SimilarityMatrix(sub2ind([side^2, side^2], i_both, i_both+dist*side-dist)) = 1;                                    
        end
        if(types(t) == 4)
            
            % for diagonal to top left, and bottom right don't use right most column
            i = 1:(side^2)-dist*side;
            i_to_rem = [];
            for s=1:dist
                i_to_rem = union(i_to_rem, i(mod(i+s-1, side) == 0));
            end
            i_both = setdiff(i, i_to_rem);
            % create the neighboring links for i
            SimilarityMatrix(sub2ind([side^2, side^2], i_both+dist*side+dist, i_both)) = 1;
            SimilarityMatrix(sub2ind([side^2, side^2], i_both, i_both+dist*side+ dist)) = 1;                   
                        
        end
        
    end        
    assert(isequal(SimilarityMatrix, SimilarityMatrix'));
end