Mercurial > hg > camir-aes2014
diff core/magnatagatune/ClipSimGraphMulti.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/ClipSimGraphMulti.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,176 @@ +% --- +% class ClipSimGraphMulti +% Directed MultiGraph representing comparative clip similarities. +% EACH pair of vertices has multiple directed edges connecting them +% +% 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 +% +% Each edge thus represent a single (are nearer to each othen than) +% expression +% --- + +classdef ClipSimGraphMulti < ClipSimGraph & handle + + +properties + +end + +% --- +% the methods +% --- +methods + +% constructor of the graph +function G = ClipSimGraphMulti(comparison, comparison_ids) + + if nargin == 0 + % --- + % empty constructor + % --- + + elseif nargin == 1 + % todo: copy graph if same class + + % --- + % this uses an imput grpaph + % to create a new MD graph + % --- + + G = ClipSimGraphMulti(); + + % --- + % Add the input graph to the empty one + % --- + G.add_graph(comparison); + + 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; + + + % --- + % every outlier vote results in two + % dissimilarity equations, favored by + % the people who voted for the outlier + % --- + + % edge 1 + add_edge(G, clips(a), clips(b), clips(c), votes(v+1)); + + % edge 2 + add_edge(G, clips(b), clips(a), clips(c), votes(v+1)); + end + end + + end + end + +% end constructor function +end + +function out = order(G) + + out = sum(G.V); +end + +function out = num_edges_multi(G) + out = sum(sum(G.E)); +end + +function out = num_edges(G) + out = sum(sum(G.E ~= 0)); +end + + + % --- +% NOTE: the weight explains the multiplicity of each +% edge, to correctily describe this, +% we just count the votes +% --- +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 add number to Edge index + G.E(V1, V2) = (G.E(V1, V2) + weight); + + cprint(3, 'edge weight %d %d %d updated \n',a ,b , c) ; + else + + error 'nodes not found'; + end +end + +% --- +% This eliminates any order-2 cycles, +% by substracting opposing edge counts +% --- +function remove_cycles_length2(G) + + G.E = max(0, G.E - G.E'); +end +% --- +% TODO: this back-and forth transform is a workaround +% avoiding some costly other transformation which would +% happen during the direct digraph call +% --- + +function [Gs, s, id] = connected_components(G, varargin) + % --- + % get all connected subgraphs: + % --- + G2 = DiGraph(G); + + [GsDiGraph, s, id] = connected_components@DiGraph(G2, varargin{:}); + + for i = 1:numel(GsDiGraph) + Gs(i) = ClipSimGraphMulti(GsDiGraph(i)); + end +end + + +end + +methods (Hidden) + +end +end