diff core/tools/Graph.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/tools/Graph.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,154 @@
+% GENERAL GRAPH THEORY CLASS
+%
+% CAVE: Any special application oriented stuff 
+% should be outside here
+
+classdef Graph < DiGraph
+ 
+methods
+
+    % ---
+% Constructor
+% ---
+function G = Graph(V, E)
+     
+    if nargin == 1
+        % ---
+        % this uses an imput grpaph
+        % to create a new graph
+        % ---
+        G = Graph.copy(V);
+        
+    elseif nargin == 2
+        
+        if numel(V) == size(V,2)
+            G.V = V;
+        else
+            G.V = V';
+        end
+
+        G.E = E;
+    end
+end
+function w = edge(G, V1, V2)
+    
+    sm = min([V1, V2]);
+    bg = max([V1, V2]);
+    
+    w = G.E(sm, bg);
+end
+
+% ---      
+% add an edge
+% the undirected case: G.E is triangular
+% ---
+function add_edge(G, V1, V2, weight)
+    
+    G.add_node(V1);
+	G.add_node(V2);
+    
+    sm = min([V1, V2]);
+    bg = max([V1, V2]);
+    
+    if  G.E(sm, bg) == 0
+
+        % save weight
+        G.E(sm, bg) = weight;
+    else
+        
+        join_edge(G, V1, V2, weight);
+    end
+end
+
+% remove an edge
+function remove_edge(G, V1, V2)
+    
+    sm = min([V1, V2]);
+    bg = max([V1, V2]);
+    
+    G.E(sm,bg) = 0;
+end
+
+% ---
+% sets the edge without considering earlier weights
+% ---
+function set_edge(G, V1, V2, weight)
+    
+    sm = min([V1, V2]);
+    bg = max([V1, V2]);
+    
+    G.E(sm, bg) = weight;
+    
+end
+
+% ---
+% Graph-specific functions
+% in the undirected case, these are the same
+% ---
+function c = children(G, Vid)
+
+    c = [find(G.E(Vid,:) > 0) find(G.E(:,Vid) > 0)'];
+end
+
+function p = parents(G, Vid)
+
+    p = [find(G.E(Vid,:) > 0) find(G.E(:,Vid) > 0)'];
+end
+
+% ---
+% Vertex Degree
+% ---
+function out = degree(G, V)
+    
+    out = sum(G.E(V,:) > 0) + sum(G.E(:,V) > 0);
+end
+
+% ---
+% Vertex Degree
+% ---
+function out = degree_in(G, V)
+    
+    out = sum(G.E(V,:) > 0) + sum(G.E(:,V) > 0);
+end
+
+% ---
+% Vertex Degree
+% ---
+function out = degree_out(G, V)
+    
+    out = sum(G.E(:,V) > 0) + sum(G.E(:,V) > 0);
+end
+
+end
+
+
+methods (Static)
+   function G = copy(Gin)
+       
+       if strcmp(class(Gin), 'Graph')
+           
+           G = Graph(Gin.V, Gin.E);
+           G.Vlbl = Gin.Vlbl;
+           
+       else
+           warning ('cannot copy graph, casting instead')
+           G = Graph.cast(Gin);
+       end
+        
+   end
+   
+   function G = cast(Gin)
+       
+        % ---
+        % this uses an imput grpaph
+        % to create a new digraph
+        % ---
+        G = Graph();
+        
+        % ---
+        % Add the input graph to the empty one
+        % ---
+        G.add_graph(Gin);
+   end
+end
+end
\ No newline at end of file