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