/**
* 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);
}
}