diff core/magnatagatune/metric_fulfills_ranking.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/magnatagatune/metric_fulfills_ranking.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,90 @@
+function [out, equal, singles, valid] = metric_fulfills_ranking(met, Y, clips)
+%  out = sim_fulfills_ranking(met, Y, ids)
+%
+% outputs (0-1) percentage of ranking constraints 
+% completely fulfilled by the given distance measure
+
+% ---
+% for each valid query, check if the ranking is fulfilled
+% we also count eeventswhere the distance is equal
+% ---
+valid = ~(cellfun(@isempty, Y(:,1)) | cellfun(@isempty, Y(:,2)));
+
+equal = 0; 
+singles = false(size(Y,1),1);
+for i = 1:size(Y,1)
+    
+    if valid(i)
+        
+        if numel(Y{i,1}) == 1 && numel(Y{i,2}) == 1 
+        % ---
+        % Efficient singular ranking comparison
+        % using met.distance(clipa,clipb)
+        % ---
+        % NOTE: by using the < here, we loose half of the 
+        % examples which have been same distance and 
+        % randomly positioned in earlier runs :(
+        % ---
+            distgood = met.distance(clips(i), clips(Y{i,1}));
+            distbad = met.distance(clips(i), clips(Y{i,2}));
+            
+            singles(i) = distgood < distbad;
+            if distgood == distbad
+                equal = equal + 1;
+            end
+        else
+            % ---
+            % NOTE: Only reactivated for testing of 
+            % outdated similarity data
+            % ---
+            
+            warning 'code only for outdated similarity data\n';
+
+            % ---
+            % NOTE: this code is analogous to the above
+            % ---
+             singles(i) = 1;
+             for j=1:numel(Y{i,1})
+                 for k = 1:numel(Y{i,2})
+                     
+                    % ---
+                    % All the entries in Y(i,1) have to come before
+                    % the ones in Y(i,2)
+                    % ---
+                    distgood = met.distance(clips(i), clips(Y{i,1}(j)));
+                    distbad = met.distance(clips(i), clips(Y{i,2}(k)));
+                    singles(i) = singles(i) && (distgood < distbad);
+                    
+                    % count equalities
+                    if distgood == distbad
+                        equal = equal + 1;
+                    end
+                    if ~singles(i)
+                        break;
+                    end
+                 end
+             end
+             
+             
+        end
+    else
+    end
+end
+
+
+out(1) = mean(singles(valid));
+if size(Y,2) == 3
+    % ---
+    % weighted sum of singles: count satisfied votes
+    % ---
+    weights = cell2mat( Y( valid, 3));
+    out(2) = sum(weights(singles(valid))) / sum(weights);
+else
+    out(2) = -1;
+end
+out = out';
+
+% markup invalid rankings
+% singles(~valid) = -1;
+
+