/*
* Created on Jul 14, 2007
*
* Copyright (c) 2007, 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.scoring;
import org.apache.commons.collections15.Transformer;
import edu.uci.ics.jung.graph.Hypergraph;
/**
* An abstract class for iterative random-walk-based vertex scoring algorithms
* that have a fixed probability, for each vertex, of 'jumping' to that vertex
* at each step in the algorithm (rather than following a link out of that
* vertex).
*
* @param <V>
* the vertex type
* @param <E>
* the edge type
* @param <S>
* the score type
*/
public abstract class AbstractIterativeScorerWithPriors<V, E, S>
extends AbstractIterativeScorer<V, E, S> implements VertexScorer<V, S> {
/**
* The prior probability of each vertex being visited on a given 'jump'
* (non-link-following) step.
*/
protected Transformer<V, ? extends S> vertex_priors;
/**
* The probability of making a 'jump' at each step.
*/
protected double alpha;
/**
* Creates an instance for the specified graph, edge weights, vertex priors,
* and jump probability.
*
* @param g
* the graph whose vertices are to be assigned scores
* @param edge_weights
* the edge weights to use in the score assignment
* @param vertex_priors
* the prior probabilities of each vertex being 'jumped' to
* @param alpha
* the probability of making a 'jump' at each step
*/
public AbstractIterativeScorerWithPriors(Hypergraph<V, E> g,
Transformer<E, ? extends Number> edge_weights,
Transformer<V, ? extends S> vertex_priors, double alpha) {
super(g, edge_weights);
this.vertex_priors = vertex_priors;
this.alpha = alpha;
initialize();
}
/**
* Creates an instance for the specified graph, vertex priors, and jump
* probability, with edge weights specified by the subclass.
*
* @param g
* the graph whose vertices are to be assigned scores
* @param vertex_priors
* the prior probabilities of each vertex being 'jumped' to
* @param alpha
* the probability of making a 'jump' at each step
*/
public AbstractIterativeScorerWithPriors(Hypergraph<V, E> g,
Transformer<V, ? extends S> vertex_priors, double alpha) {
super(g);
this.vertex_priors = vertex_priors;
this.alpha = alpha;
initialize();
}
/**
* Initializes the state of this instance.
*/
@Override
public void initialize() {
super.initialize();
// initialize output values to priors
// (output and current are swapped before each step(), so current will
// have priors when update()s start happening)
for (V v : graph.getVertices()) {
setOutputValue(v, getVertexPrior(v));
}
}
/**
* Returns the prior probability for <code>v</code>.
*
* @param v
* the vertex whose prior probability is being queried
* @return the prior probability for <code>v</code>
*/
protected S getVertexPrior(V v) {
return vertex_priors.transform(v);
}
/**
* Returns a Transformer which maps each vertex to its prior probability.
*
* @return a Transformer which maps each vertex to its prior probability
*/
public Transformer<V, ? extends S> getVertexPriors() {
return vertex_priors;
}
/**
* Returns the probability of making a 'jump' (non-link-following step).
*
* @return the probability of making a 'jump' (non-link-following step)
*/
public double getAlpha() {
return alpha;
}
}