Skip to content
Merged

sync #16

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@
<beast.main>beast.base.minimal.BeastMain</beast.main>
<beast.args/>
<beast.pkg.name>CCD</beast.pkg.name>
<beast.pkg.version>1.2.0</beast.pkg.version>
</properties>

<dependencies>
Expand Down Expand Up @@ -194,7 +193,7 @@
<descriptors>
<descriptor>src/assembly/beast-package.xml</descriptor>
</descriptors>
<finalName>${beast.pkg.name}.v${beast.pkg.version}</finalName>
<finalName>${beast.pkg.name}.v${project.version}</finalName>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
<executions>
Expand Down
60 changes: 54 additions & 6 deletions src/main/java/ccd/algorithms/NNICladeExpansion.java
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,17 @@ private NovelClade(BitSet taxa) {
private long candidatesAlreadyPresent = 0;
private boolean computed = false;

/**
* Parent-probability gate: a parent clade whose marginal probability is at
* or above this threshold is not expanded, on the premise that a near-certain
* parent has no alternative resolution worth adding. The default
* {@link Double#POSITIVE_INFINITY} disables the gate (full expansion). Setting
* 1.0 skips only fully-supported parents; lower values prune more. Benchmark
* (Remco): 1.0 is strictly lossless yet ~halves the novel-clade count, and
* 0.99 prunes further for a ~0.02% loss in recovered probability mass.
*/
private double parentProbabilityThreshold = Double.POSITIVE_INFINITY;

/** Taxa-only bits of every clade in the CCD, for fast presence tests. */
private Set<BitSet> existingTaxa;

Expand All @@ -132,12 +143,42 @@ public NNICladeExpansion(AbstractCCD ccd, PairingMode mode) {
this.mode = mode;
}

/**
* Sets the parent-probability gate: parent clades whose marginal probability
* is {@code >= threshold} are not expanded. Use
* {@link Double#POSITIVE_INFINITY} (the default) for full expansion. Must be
* called before {@link #compute()}.
*
* @param threshold parent-probability cutoff (skip a parent if its
* probability is at or above this value)
* @return this, for chaining
*/
public NNICladeExpansion setParentProbabilityThreshold(double threshold) {
if (computed) {
throw new IllegalStateException(
"setParentProbabilityThreshold must be called before compute()");
}
this.parentProbabilityThreshold = threshold;
return this;
}

/** @return the parent-probability gate (parents with prob &gt;= this are skipped). */
public double getParentProbabilityThreshold() {
return parentProbabilityThreshold;
}

/** Runs the expansion if not already done; idempotent. */
public NNICladeExpansion compute() {
if (computed) {
return this;
}

// the parent-probability gate reads Clade#getProbability(), which is
// computed lazily and otherwise defaults to -1; populate it when gating
if (parentProbabilityThreshold < Double.POSITIVE_INFINITY) {
ccd.computeCladeProbabilitiesIfDirty();
}

existingTaxa = new HashSet<>(ccd.getNumberOfClades() * 2);
for (Clade clade : ccd.getClades()) {
existingTaxa.add(clade.getCladeInBitsTaxaOnly());
Expand All @@ -160,6 +201,10 @@ private void expandGraphWide() {
if (parent.size() < 3) {
continue;
}
// skip near-certain parents: a stable parent yields no novel resolution
if (parent.getProbability() >= parentProbabilityThreshold) {
continue;
}
for (CladePartition split : parent.getPartitions()) {
Clade childA = split.getChildClades()[0];
Clade childB = split.getChildClades()[1];
Expand Down Expand Up @@ -226,12 +271,15 @@ private void recombineTree(Node vertex, Map<Node, Clade> map) {
Node left = children.get(0);
Node right = children.get(1);
Clade parent = map.get(vertex);
// edge above an internal child = NNI site; the other child is the sibling
if (!left.isLeaf()) {
recombineAt(parent, left, right, map);
}
if (!right.isLeaf()) {
recombineAt(parent, right, left, map);
// skip near-certain parents: a stable parent yields no novel resolution
if (parent.getProbability() < parentProbabilityThreshold) {
// edge above an internal child = NNI site; the other child is the sibling
if (!left.isLeaf()) {
recombineAt(parent, left, right, map);
}
if (!right.isLeaf()) {
recombineAt(parent, right, left, map);
}
}
}
for (Node child : children) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package test.ccd.algorithms;
package ccd;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package test.ccd.algorithms;
package ccd;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package test.ccd.algorithms;
package ccd;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package test.ccd.algorithms;
package ccd;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Node;
import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import beastfx.app.inputeditor.BeautiPanelConfig;
import ccd.model.*;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import beastfx.app.treeannotator.TreeAnnotator;
import ccd.model.*;
import org.junit.jupiter.api.Test;

import java.io.IOException;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import beastfx.app.treeannotator.TreeAnnotator;
import ccd.algorithms.TreeDistances;
import ccd.model.*;
import org.junit.jupiter.api.Test;

import java.io.IOException;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import ccd.model.*;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import ccd.model.CCD0CP;
import ccd.model.Clade;
import ccd.model.CladePartition;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import ccd.model.CCD0CP;
import ccd.model.Clade;
import ccd.model.CladePartition;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import ccd.model.*;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import ccd.model.CCD0CP;
import ccd.model.Clade;
import ccd.model.CladePartition;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import ccd.model.CCD0CP;
import ccd.model.CCD1CP;
import ccd.model.Clade;
import ccd.model.CladePartition;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import ccd.model.GRegCCD;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import ccd.model.GRegCCD;
import ccd.model.GRegZApprox;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import ccd.model.KRegCCD;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import ccd.model.HeightSettingStrategy;
import ccd.model.KRegCCD;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Node;
import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import ccd.model.AbstractCCD;
import ccd.model.HeightSettingStrategy;
import ccd.model.KRegCCD;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import ccd.model.Clade;
import ccd.model.CladePartition;
import ccd.model.KRegCCD;
import ccd.model.RegCCD;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import ccd.model.CCD0;
import ccd.model.Clade;
import ccd.model.CladePartition;
import ccd.model.MRegCCD;
import ccd.model.bitsets.BitSet;
import org.junit.jupiter.api.Test;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import ccd.algorithms.NNICladeExpansion.PairingMode;
import ccd.model.Clade;
import ccd.model.CladePartition;
import ccd.model.NNIRegCCD;
import ccd.model.RegCCD;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import ccd.model.*;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package test.ccd.model;
package ccd.model;

import beast.base.evolution.tree.Tree;
import beast.base.evolution.tree.TreeParser;
import ccd.model.UniformEscapeCCD;
import org.junit.jupiter.api.Test;

import java.math.BigInteger;
Expand Down