/* * Copyright (c) 2003, 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. */ package edu.uci.ics.jung.algorithms.metrics; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.commons.collections15.CollectionUtils; import edu.uci.ics.jung.graph.DirectedGraph; import edu.uci.ics.jung.graph.Graph; /** * TriadicCensus is a standard social network tool that counts, for each of the * different possible configurations of three vertices, the number of times * that that configuration occurs in the given graph. * This may then be compared to the set of expected counts for this particular * graph or to an expected sample. This is often used in p* modeling. *
* To use this class, *
* long[] triad_counts = TriadicCensus(dg); ** where
dg
is a DirectedGraph
.
* ith element of the array (for i in [1,16]) is the number of
* occurrences of the corresponding triad type.
* (The 0th element is not meaningful; this array is effectively 1-based.)
* To get the name of the ith triad (e.g. "003"),
* look at the global constant array c.TRIAD_NAMES[i]
* * Triads are named as * (number of pairs that are mutually tied) * (number of pairs that are one-way tied) * (number of non-tied pairs) * in the triple. Since there are be only three pairs, there is a finite * set of these possible triads. *
* In fact, there are exactly 16, conventionally sorted by the number of * realized edges in the triad: *
Number | Configuration | Notes |
---|---|---|
1 | 003 | The empty triad |
2 | 012 | |
3 | 102 | |
4 | 021D | "Down": the directed edges point away |
5 | 021U | "Up": the directed edges meet |
6 | 021C | "Circle": one in, one out |
7 | 111D | "Down": 021D but one edge is mutual |
8 | 111U | "Up": 021U but one edge is mutual |
9 | 030T | "Transitive": two point to the same vertex |
10 | 030C | "Circle": A->B->C->A |
11 | 201 | |
12 | 120D | "Down": 021D but the third edge is mutual |
13 | 120U | "Up": 021U but the third edge is mutual |
14 | 120C | "Circle": 021C but the third edge is mutual |
15 | 210 | |
16 | 300 | The complete |
* This implementation takes O( m ), m is the number of edges in the graph.
*
* It is based on
*
* A subquadratic triad census algorithm for large sparse networks
* with small maximum degree
* Vladimir Batagelj and Andrej Mrvar, University of Ljubljana
* Published in Social Networks.
* @author Danyel Fisher
* @author Tom Nelson - converted to jung2
*
*/
public class TriadicCensus {
// NOTE THAT THIS RETURNS STANDARD 1-16 COUNT!
// and their types
public static final String[] TRIAD_NAMES = { "N/A", "003", "012", "102", "021D",
"021U", "021C", "111D", "111U", "030T", "030C", "201", "120D",
"120U", "120C", "210", "300" };
public static final int MAX_TRIADS = TRIAD_NAMES.length;
/**
* Returns an array whose ith element (for i in [1,16]) is the number of
* occurrences of the corresponding triad type in g
.
* (The 0th element is not meaningful; this array is effectively 1-based.)
*
* @param g
*/
public static