/*
* GeneralF81Model.java
*
* Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard
*
* This file is part of BEAST.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* BEAST is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* BEAST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BEAST; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package dr.oldevomodel.substmodel;
import dr.evolution.datatype.GeneralDataType;
/**
* @author Alexei Drummond
*/
public class GeneralF81Model extends AbstractSubstitutionModel {
/**
* @param freqModel
*/
public GeneralF81Model(FrequencyModel freqModel) {
super("generalF81", freqModel.getDataType(), freqModel);
setupMatrix();
}
protected void frequenciesChanged() {
// frequencyModel changed
}
@Override
protected void ratesChanged() {
//To change body of implemented methods use File | Settings | File Templates.
}
/**
* get the complete transition probability matrix for the given distance
*
* @param distance the expected number of substitutions
* @param matrix an array to store the matrix
*/
public void getTransitionProbabilities(double distance, double[] matrix) {
int stateSize = freqModel.getFrequencyCount();
double[] pi = freqModel.getFrequencies();
double beta = 1;
for (double p : pi) {
beta -= p * p;
}
beta = 1.0 / beta;
int c = 0;
for (int i = 0; i < stateSize; i++) {
for (int j = 0; j < stateSize; j++) {
if (i == j) {
matrix[c] = pi[i] + (1 - pi[i]) * Math.exp(-beta * distance);
} else {
matrix[c] = pi[j] * (1 - Math.exp(-beta * distance));
}
c += 1;
}
}
}
protected void setupRelativeRates() {
}
// *****************************************************************
// Interface Model
// *****************************************************************
public void storeState() {
super.storeState();
}
/**
* Restore the stored state
*/
public void restoreState() {
super.restoreState();
}
// **************************************************************
// XHTMLable IMPLEMENTATION
// **************************************************************
public String toXHTML() {
StringBuffer buffer = new StringBuffer();
buffer.append("<em>General F81 Model</em>");
return buffer.toString();
}
public static void main(String[] args) {
GeneralDataType general = new GeneralDataType(new String[]{"0", "1", "2"});
FrequencyModel freqModel = new FrequencyModel(general, new double[]{0.2, 0.3, 0.5});
GeneralF81Model f81 = new GeneralF81Model(freqModel);
int S = general.getStateCount();
double[] P = new double[S * S];
f81.getTransitionProbabilities(0.01, P);
int c = 0;
for (int i = 0; i < S; i++) {
System.out.print(P[c]);
double rowSum = P[c];
c += 1;
for (int j = 1; j < S; j++) {
System.out.print(", " + P[c]);
rowSum += P[c];
c += 1;
}
System.out.println(" : " + rowSum);
}
}
}