Mercurial > hg > camir-aes2014
diff core/magnatagatune/ClipSimGraph.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/ClipSimGraph.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,191 @@ +% --- +% class ClipSimGraph +% Directed graph representing comparative clip similarities. +% +% each node represents a pair of clips, +% an edge (a,b) -> (a,c) is present if there is at least one +% users judging clip a more similar to clip b than to clip c +% +% The Edges thus represent the (are nearer to each othen than) +% expression +% --- + +classdef ClipSimGraph < ClipPairGraph + +% --- +% the methods +% --- +methods + + +% constructor of the graph +function G = ClipSimGraph(comparison, comparison_ids) + + % --- + % handle manual input + % --- + + if nargin == 1 + % --- + % this uses an imput grpaph + % to create a new MD graph + % --- + + G = ClipSimGraph(); + + % --- + % Add the input graph to the empty one + % --- + G.add_graph(comparison); + + % --- + % TODO: Copy Clip Pair Information if neccessary + % this is by now a handle copy + % --- + clas = cat(1, class(comparison), superclasses(comparison)); + if strcellfind(clas, 'ClipPairGraph') + + G.vid_map = comparison.vid_map; + end + + elseif nargin == 2 + + % --- + % handle automatic or manual input + % --- + for i = 1:size(comparison,1) + + % get clips and votes + clips = comparison_ids(comparison(i,1:3)); + votes = comparison(i,4:6); + + % for each triplet position create an edge reflecting the + % absolute and relative voting for this position + + % --- + % NOTE: we index 0 - 2 to ease the mod + % calculaton for the remaining indices + % --- + for v = 0:2 + + % --- + % has at least one user voted this clip out? + % If so, treat it as an outlier and determine score + % --- + if votes(v+1) > 0 + + a = mod(v+1, 3)+1; + b = mod(v+2, 3)+1; + c = v+1; + + % --- + % TODO: how to determine the weight? + % There are two options: relative in the triple + % and counting absolute hits. + % first we go for the relative ones. + % The other is implemented in ClipSimGraphMulti + % --- + + % --- + % add an edge saying sim(a,b) > sim(a,c) + % --- + G.add_edge(clips(a), clips(b), clips(c), votes(c) / (sum(votes))); + + % --- + % every outlier vote results in two + % dissimilarity equations + % --- + + % edge 2 + G.add_edge(clips(b), clips(a), clips(c), votes(c) / (sum(votes))); + + end + + end + end + end + +end + +% end constructor function + + +function [weights, a, b, c] = similarities(G) + % --- + % returns the weights of edges meaning sim(a,b) > sim(a,c) + % --- + % get edge weights + [weights, a, b, c] = edges(G); +end + +% --- +% add an edge saying sim(a,b) > sim(a,c) +% --- +% function add_edge(G, a, b, c, weight) + +function remove_edge(G, a, b, c) + + if nargin == 4 + V1 = add_node(G, a, b); + V2 = add_node(G, a, c); + + elseif nargin == 3 + V1 = a; + V2 = b; + end + + % --- + % call superclass + % --- + remove_edge@DiGraph(G, V1, V2); + end + +function set_edge(G, a, b, c, weight) + if nargin == 5 + V1 = add_node(G, a, b); + V2 = add_node(G, a, c); + + elseif nargin == 4 + V1 = a; + V2 = b; + weight = c; + end + + % --- + % call superclass + % --- + set_edge@DiGraph(G, V1, V2, weight); +end + +% --- +% simple mix of two sets of info about the same +% nodes: mean. +% NOTE: if there's more than two infos, the earlier +% information will loose influence +% --- +function join_edge(G, a, b, c, weight) + + if nargin == 5 + V1 = G.node(a, b); + V2 = G.node(a, c); + elseif nargin == 4 + V1 = a; + V2 = b; + weight = c; + end + + if G.edge(V1, V2) ~= 0 + + % set Edge to weight + G.E(V1, V2) = (G.E(V1, V2) + weight) /2; + + cprint(4, 'edge weight %d %d %d updated \n',a ,b , c) ; + else + + error 'nodes not found'; + end +end +end +end + +