001 /**
002 *
003 */
004 package edu.wwu.tobikley.acgc.mc;
005
006 import cern.jet.random.engine.RandomEngine;
007
008 /**
009 * Abstract implementation of a markov chain for simulation purposes,
010 * that provides all necessary functionality but the transition mechanim.
011 *
012 * As a markov chain consists of the following three elements:
013 *
014 * <ul>
015 * <li>the set of possible states called the state space,
016 * <li>the initial distribution, and
017 * <li>the transition probabilities.
018 * </ul>
019 * A concrete implementation, hence has yet to specify the type of the
020 * states and provide the implementation of the transition mechanism.
021 * Because of the implementations sole purpose is simulation, the initial
022 * state will be set using the classes constructor.
023 *
024 * @version 1.0
025 * @author Tobias Kley
026 */
027 public abstract class HomogeneousMarkovChain {
028
029 /** Current state. */
030 protected Object currentState = null;
031
032 /** Current time.*/
033 protected int t = 0;
034
035 /** Pseudo random number generator used when updating. */
036 protected RandomEngine randomEngine = null;
037
038 /**
039 * Creates a new instance of the markov chain.
040 *
041 * @param randomEngine Pseudo random number generator.
042 * @param initialState State to initialise the markov chain at time t = 0.
043 */
044 public HomogeneousMarkovChain(RandomEngine randomEngine, Object initialState) {
045 this.currentState = initialState;
046 this.randomEngine = randomEngine;
047 }
048
049 /**
050 * Spezifies the transition mechanism of the markov chain.
051 * The implementation has is to simulate the state at time t+1 given
052 * the current time is t. Updating the state of the markovchain will use
053 * always use random numbers invoking <code>randomEngine.raw()</code>.
054 *
055 * @param fromState State at time t.
056 * @return State at time t+1.
057 */
058 public abstract Object update(Object fromState);
059
060 /**
061 * Performs one update on the markov chain.
062 *
063 * @return State of the markov chain at time t+1,
064 * given the current time is t.
065 */
066 public Object next() {
067 currentState = update(currentState);
068 t++;
069 return currentState;
070 }
071
072 /**
073 * Performs n updates on the markov chain.
074 *
075 * @return State of the markov chain at time t+n,
076 * given the current time is t.
077 */
078 public Object next(int n) {
079 for(int i = 0; i < n; i++) {
080 currentState = update(currentState);
081 t++;
082 }
083 return currentState;
084 }
085 }