wolffd@0: function [r, valididx, clip_ids] = ranking_from_comparison_ClipSimGraphMulti(comparison, comparison_ids) wolffd@0: % returns rankings for compared songs. wolffd@0: % rankings are genrerated using a Multigraph analysis of the comparison wolffd@0: % data wolffd@0: % wolffd@0: % r(idx,1) = clip being similar to clip idx wolffd@0: % r(idx,2) = clip being less similar to clip idx wolffd@0: % r(idx,3) = weight of this ranking wolffd@0: % wolffd@0: % the indices in clipids correspond to the indices in comparison_ids wolffd@0: wolffd@0: % create similarity graph wolffd@0: % G = ClipSimGraphMulti(comparison, comparison_ids); wolffd@0: % G.remove_cycles_length2; wolffd@0: % save('comp_SimGraphMulti.mat', 'G'); wolffd@0: cprint(2, 'loading Multigraph for Similarity Constraints') wolffd@0: load('comp_SimGraphMulti.mat', 'G'); wolffd@0: wolffd@0: wolffd@0: wolffd@0: % inverse comparison index wolffd@0: inv_comparison = sparse(comparison_ids,1, 1:numel(comparison_ids)); wolffd@0: wolffd@0: % --- wolffd@0: % derive similarity information: this wolffd@0: % returns the weights of edges meaning sim(a,b) > sim(a,c) wolffd@0: % --- wolffd@0: [weights, a, b, c] = G.similarities(); wolffd@0: % --- wolffd@0: % NOTE: it is yet unclear which index wolffd@0: % (the comparison or the mtt clip index) wolffd@0: % is best to use wolffd@0: % wolffd@0: % The lines below transform the MTT ids from the graph into comparison ids wolffd@0: % --- wolffd@0: a = inv_comparison(a); wolffd@0: b = inv_comparison(b); wolffd@0: c = inv_comparison(c); wolffd@0: wolffd@0: % --- wolffd@0: % reformat into ranking: the first 1019 clips are ordered wolffd@0: % as in comparison_ids. then, clips mentioned more than once wolffd@0: % are attached. wolffd@0: % --- wolffd@0: [a, idx] = sort(a); wolffd@0: b = b(idx); wolffd@0: c = c(idx); wolffd@0: wolffd@0: wolffd@0: clip_ids = zeros(numel(a), 1); wolffd@0: wolffd@0: % --- wolffd@0: % NOTE: r may grow over its allocated size wolffd@0: % --- wolffd@0: r = cell(numel(a),1 ); wolffd@0: wolffd@0: % keep track of constraints which have been attached wolffd@0: visited = zeros(1, numel(a)); wolffd@0: for i = 1:numel(comparison_ids) wolffd@0: wolffd@0: % --- wolffd@0: % get first occurence of this index, wolffd@0: % and save the data into ranking wolffd@0: % --- wolffd@0: tmp_idx = find(a == i, 1, 'first'); wolffd@0: wolffd@0: clip_ids(i) = i; % == a(tmp_idx) wolffd@0: wolffd@0: if ~isempty(tmp_idx) wolffd@0: visited(tmp_idx) = true; wolffd@0: wolffd@0: r{i,1} = b(tmp_idx); wolffd@0: r{i,2} = c(tmp_idx); wolffd@0: r{i,3} = weights(tmp_idx); wolffd@0: wolffd@0: valididx(i) = true; wolffd@0: else wolffd@0: % invalid ranking wolffd@0: valididx(i) = false; wolffd@0: r{i,3} = 0; wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: % --- wolffd@0: % Now we attach the remaining constraints wolffd@0: % --- wolffd@0: remaining = find(~visited); wolffd@0: clip_ids( numel(comparison_ids)+1 : numel(comparison_ids)+numel(remaining)) = a(remaining); wolffd@0: wolffd@0: for i = 1:numel(remaining) wolffd@0: r{ numel(comparison_ids)+i, 1} = b(remaining(i)); wolffd@0: r{ numel(comparison_ids)+i , 2} = c(remaining(i)); wolffd@0: r{ numel(comparison_ids)+i , 3} = weights(remaining(i)); wolffd@0: end wolffd@0: wolffd@0: valididx(numel(comparison_ids)+1 : ... wolffd@0: numel(comparison_ids)+numel(remaining)) = true; wolffd@0: