Daniel@0: function [Gs, op, nodes] = mk_nbrs_of_digraph2(G0) Daniel@0: % MK_NBRS_OF_DIGRAPH Make all digraphs that differ from G0 by a single edge deletion, addition or reversal Daniel@0: % [Gs, op, nodes] = mk_nbrs_of_digraph(G0) Daniel@0: % op{i} = 'add', 'del', or 'rev' is the operation used to create the i'th neighbor. Daniel@0: % nodes(i,1:2) are the head and tail of the operated-on arc. Daniel@0: Daniel@0: [I,J] = find(G0); Daniel@0: G0bar = setdiag(~G0, 0); % exclude self loops in graph complement Daniel@0: [Ibar,Jbar] = find(G0bar); Daniel@0: nnbrs = 2*length(I) + length(Ibar); Daniel@0: Gs = cell(1, nnbrs); Daniel@0: op = cell(1, nnbrs); Daniel@0: nodes = zeros(nnbrs, 2); Daniel@0: Daniel@0: nbr = 1; Daniel@0: % all single edge deletions Daniel@0: for e=1:length(I) Daniel@0: i = I(e); j = J(e); Daniel@0: G = G0; Daniel@0: G(i,j) = 0; Daniel@0: Gs{nbr} = G; Daniel@0: op{nbr} = 'del'; Daniel@0: nodes(nbr, :) = [i j]; Daniel@0: nbr = nbr + 1; Daniel@0: end Daniel@0: Daniel@0: % all single edge reversals Daniel@0: for e=1:length(I) Daniel@0: i = I(e); j = J(e); Daniel@0: G = G0; Daniel@0: G(i,j) = 0; Daniel@0: G(j,i) = 1; Daniel@0: Gs{nbr} = G; Daniel@0: op{nbr} = 'rev'; Daniel@0: nodes(nbr, :) = [i j]; Daniel@0: nbr = nbr + 1; Daniel@0: end Daniel@0: Daniel@0: [I,J] = find(~G0); Daniel@0: % all single edge additions Daniel@0: for e=1:length(I) Daniel@0: i = I(e); j = J(e); Daniel@0: G = G0; Daniel@0: if i ~= j % don't add self loops Daniel@0: G(i,j) = 1; Daniel@0: Gs{nbr} = G; Daniel@0: op{nbr} = 'add'; Daniel@0: nodes(nbr, :) = [i j]; Daniel@0: nbr = nbr + 1; Daniel@0: end Daniel@0: end Daniel@0: Daniel@0: assert(nnbrs == nbr-1);