
edu.uci.ics.jung.algorithms.metrics.Metrics Maven / Gradle / Ivy
/**
* Copyright (c) 2008, the JUNG Project and the Regents of the University
* of California
* All rights reserved.
*
* This software is open-source under the BSD license; see either
* "license.txt" or
* http://jung.sourceforge.net/license.txt for a description.
* Created on Jun 7, 2008
*
*/
package edu.uci.ics.jung.algorithms.metrics;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import edu.uci.ics.jung.graph.Graph;
/**
* A class consisting of static methods for calculating graph metrics.
*/
public class Metrics
{
/**
* Returns a Map
of vertices to their clustering coefficients.
* The clustering coefficient cc(v) of a vertex v is defined as follows:
*
* degree(v) == {0,1}
: 0
* degree(v) == n, n >= 2
: given S, the set of neighbors
* of v
: cc(v) = (the sum over all w in S of the number of
* other elements of w that are neighbors of w) / ((|S| * (|S| - 1) / 2).
* Less formally, the fraction of v
's neighbors that are also
* neighbors of each other.
* Note: This algorithm treats its argument as an undirected graph;
* edge direction is ignored.
* @param graph the graph whose clustering coefficients are to be calculated
* @see "The structure and function of complex networks, M.E.J. Newman, aps.arxiv.org/abs/cond-mat/0303516"
*/
public static Map clusteringCoefficients(Graph graph)
{
Map coefficients = new HashMap();
for (V v : graph.getVertices())
{
int n = graph.getNeighborCount(v);
if (n < 2)
coefficients.put(v, new Double(0));
else
{
// how many of v's neighbors are connected to each other?
ArrayList neighbors = new ArrayList(graph.getNeighbors(v));
double edge_count = 0;
for (int i = 0; i < n; i++)
{
V w = neighbors.get(i);
for (int j = i+1; j < n; j++ )
{
V x = neighbors.get(j);
edge_count += graph.isNeighbor(w, x) ? 1 : 0;
}
}
double possible_edges = (n * (n - 1))/2.0;
coefficients.put(v, new Double(edge_count / possible_edges));
}
}
return coefficients;
}
}