package dr.evomodel.newtreelikelihood;
import dr.evomodel.sitemodel.SiteModel;
import dr.evomodel.substmodel.SubstitutionModel;
import dr.app.beagle.evomodel.treelikelihood.AbstractTreeLikelihood;
import java.util.logging.Logger;
/*
* NativeLikelihoodCore.java
*
* @author Andrew Rambaut
*
*/
public class NativeLikelihoodCore implements LikelihoodCore {
public static final String LIBRARY_NAME = "NativeLikelihoodCore";
public NativeLikelihoodCore() { }
public NativeLikelihoodCore(int stateCount) {
StringBuffer sb = new StringBuffer();
sb.append("Constructing native likelihood core\n");
Logger.getLogger("dr.evomodel.treelikelihood").info(sb.toString());
}
public boolean canHandleTipPartials() {
return true;
}
public boolean canHandleTipStates() {
return true;
}
public boolean canHandleDynamicRescaling() {
return true;
}
public native void initialize(int nodeCount, int stateTipCount, int patternCount, int matrixCount);
public void finalize() throws Throwable {
super.finalize();
freeNativeMemory();
}
private native void freeNativeMemory();
public native void setTipPartials(int tipIndex, double[] partials);
public native void setTipStates(int tipIndex, int[] states);
public void updateSubstitutionModel(SubstitutionModel substitutionModel) {
updateRootFrequencies(substitutionModel.getFrequencyModel().getFrequencies());
updateEigenDecomposition(
substitutionModel.getEigenVectors(),
substitutionModel.getInverseEigenVectors(),
substitutionModel.getEigenValues());
}
protected native void updateRootFrequencies(double[] frequencies);
protected native void updateEigenDecomposition(double[][] eigenVectors,
double[][] inverseEigenValues,
double[] eigenValues);
public void updateSiteModel(SiteModel siteModel) {
if (rates == null) {
rates = new double[siteModel.getCategoryCount()];
}
for (int i = 0; i < rates.length; i++) {
rates[i] = siteModel.getRateForCategory(i);
}
updateCategoryRates(rates);
updateCategoryProportions(siteModel.getCategoryProportions());
}
/**
* A utility array to transfer category rates
*/
private double[] rates = null;
public void updatePartials(int[] operations, int[] dependencies, int operationCount, boolean rescale) {
updatePartials(operations, dependencies, operationCount);
}
protected native void updateCategoryRates(double[] rates);
protected native void updateCategoryProportions(double[] proportions);
public native void updateMatrices(int[] branchUpdateIndices, double[] branchLengths, int branchUpdateCount);
public native void updatePartials(int[] operations, int[] dependencies, int operationCount);
public native void calculateLogLikelihoods(int rootNodeIndex, double[] outLogLikelihoods);
public native void storeState();
public native void restoreState();
/* Library loading routines */
public static class LikelihoodCoreLoader implements LikelihoodCoreFactory.LikelihoodCoreLoader {
public String getLibraryName() { return LIBRARY_NAME; }
public LikelihoodCore createLikelihoodCore(int[] configuration, AbstractTreeLikelihood treeLikelihood) {
int stateCount = configuration[0];
try {
System.loadLibrary(getLibraryName() + "-" + stateCount);
} catch (UnsatisfiedLinkError e) {
return null;
}
return new NativeLikelihoodCore(stateCount);
}
}
}