@Override public void initAndValidate() { meanRate = meanRateInput.get(); speciesTreeRatesX = speciesTreeRatesInput.get(); geneTree = geneTreeInput.get(); geneNodeCount = geneTree.getNodeCount(); branchRates = new double[geneNodeCount]; storedBranchRates = new double[geneNodeCount]; needsUpdate = true; }
private void update() { final double geneTreeRate = meanRate.getValue(); final double[] speciesTreeRates = speciesTreeRatesX.getRatesArray(); final double[] speciesOccupancy = geneTree.getSpeciesOccupancy(); final int speciesNodeCount = speciesTreeRates.length; for (int i = 0; i < geneNodeCount - 1; i++) { double weightedSum = 0.0; double branchLength = 0.0; for (int j = 0; j < speciesNodeCount; j++) { // System.out.println(String.format("%d, %d: %f, %f", i, j, speciesTreeRates[j], // speciesOccupancy[i * speciesNodeCount + j])); weightedSum += speciesTreeRates[j] * speciesOccupancy[i * speciesNodeCount + j]; branchLength += speciesOccupancy[i * speciesNodeCount + j]; } branchRates[i] = geneTreeRate * weightedSum / branchLength; } // set the rate for the root branch of this gene to equal the input mean rate branchRates[geneNodeCount - 1] = geneTreeRate; needsUpdate = false; }