/** * 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 Jul 14, 2008 * */ package edu.uci.ics.jung.algorithms.scoring.util; import org.apache.commons.collections15.Transformer; import edu.uci.ics.jung.graph.Hypergraph; import edu.uci.ics.jung.graph.util.EdgeType; /** * An edge weight function that assigns weights as uniform transition * probabilities. For undirected edges, returns 1/degree(v) (where 'v' is the * vertex in the VEPair. For directed edges, returns 1/outdegree(source(e)) * (where 'e' is the edge in the VEPair). Throws an * <code>IllegalArgumentException</code> if the input edge is neither * EdgeType.UNDIRECTED nor EdgeType.DIRECTED. * */ public class UniformDegreeWeight<V, E> implements Transformer<VEPair<V, E>, Double> { private Hypergraph<V, E> graph; /** * Creates an instance for the specified graph. */ public UniformDegreeWeight(Hypergraph<V, E> graph) { this.graph = graph; } /** * @see org.apache.commons.collections15.Transformer#transform(java.lang.Object) */ @Override public Double transform(VEPair<V, E> ve_pair) { E e = ve_pair.getE(); V v = ve_pair.getV(); EdgeType edge_type = graph.getEdgeType(e); if (edge_type == EdgeType.UNDIRECTED) { return 1.0 / graph.degree(v); } if (edge_type == EdgeType.DIRECTED) { return 1.0 / graph.outDegree(graph.getSource(e)); } throw new IllegalArgumentException( "can't handle edge type: " + edge_type); } }