use of beast.core.BEASTInterface in project beast2 by CompEvol.
the class BeautiDoc method toXML.
public String toXML() {
Set<BEASTInterface> beastObjects = new HashSet<>();
// for (BEASTObject beastObject : pluginmap.values()) {
// String name = beastObject.getClass().getName();
// if (!name.startsWith("beast.app.beauti")) {
// beastObjects.add(beastObject);
// }
// }
String xml = new XMLProducer().toXML(mcmc.get(), beastObjects);
xml = xml.replaceFirst("<beast ", "<beast beautitemplate='" + templateName + "' beautistatus='" + getBeautiStatus() + "' ");
return xml + "\n";
}
use of beast.core.BEASTInterface in project beast2 by CompEvol.
the class BeautiDoc method disconnect.
public void disconnect(BEASTInterface srcBEASTObject, String targetID, String inputName) {
try {
BEASTInterface target = pluginmap.get(targetID);
if (target == null) {
return;
}
final Input<?> input = target.getInput(inputName);
Object o = input.get();
if (o instanceof List) {
List<?> list = (List<?>) o;
// System.err.println(" " + ((List)o).size());
for (int i = 0; i < list.size(); i++) {
if (list.get(i) == srcBEASTObject) {
warning(" DEL " + targetID + "/" + inputName + " contains " + (srcBEASTObject == null ? "null" : srcBEASTObject.getID()) + "\n");
list.remove(i);
}
}
if (srcBEASTObject != null && srcBEASTObject.getOutputs() != null) {
srcBEASTObject.getOutputs().remove(target);
}
} else {
if (input.get() != null && input.get() instanceof BEASTInterface && input.get() == srcBEASTObject) {
// ((BEASTInterface) input.get()).getID().equals(targetID)) {
input.setValue(null, target);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
use of beast.core.BEASTInterface in project beast2 by CompEvol.
the class BeautiDoc method getUnlinkCandidate.
public BEASTInterface getUnlinkCandidate(Input<?> input, BEASTInterface parent) {
PartitionContext oldContext = getContextFor((BEASTInterface) input.get());
PartitionContext newContext = getContextFor(parent);
BEASTInterface beastObject = deepCopyPlugin((BEASTInterface) input.get(), parent, (MCMC) mcmc.get(), oldContext, newContext, this, null);
return beastObject;
}
use of beast.core.BEASTInterface in project beast2 by CompEvol.
the class BeautiDoc method deepCopyPlugin.
/**
* Create a deep copy of a beastObject, but in a different partition context
* First, find all beastObjects that are predecessors of the beastObject to be copied
* that are ancestors of StateNodes
*
* @param beastObject
* @param parent
* @return
*/
public static BEASTInterface deepCopyPlugin(BEASTInterface beastObject, BEASTInterface parent, MCMC mcmc, PartitionContext oldContext, PartitionContext newContext, BeautiDoc doc, List<BEASTInterface> tabooList) {
/**
* taboo = list of beastObjects that should not be copied *
*/
Set<BEASTInterface> taboo = new HashSet<>();
taboo.add(parent);
// add state
taboo.add(mcmc.startStateInput.get());
// add likelihood and prior
if (mcmc.posteriorInput.get() instanceof CompoundDistribution) {
for (Distribution distr : ((CompoundDistribution) mcmc.posteriorInput.get()).pDistributions.get()) {
if (distr instanceof CompoundDistribution) {
taboo.add(distr);
}
}
}
// add posterior
taboo.add(mcmc.posteriorInput.get());
// parent of operators
taboo.add(mcmc);
// add loggers
taboo.addAll(mcmc.loggersInput.get());
// add exception for *BEAST logger (perhaps need to be generalised?)
if (doc.pluginmap.containsKey("SpeciesTreeLoggerX")) {
taboo.add(doc.pluginmap.get("SpeciesTreeLoggerX"));
}
// add trees
for (StateNode node : mcmc.startStateInput.get().stateNodeInput.get()) {
if (node instanceof Tree) {
taboo.add(node);
}
}
// add MRCAPriors
for (String id : doc.pluginmap.keySet()) {
BEASTInterface o = doc.pluginmap.get(id);
if (o instanceof MRCAPrior) {
taboo.add(o);
}
}
if (tabooList != null) {
taboo.addAll(tabooList);
}
// find predecessors of beastObject to be copied
List<BEASTInterface> predecessors = new ArrayList<>();
collectPredecessors(beastObject, predecessors);
// find ancestors of StateNodes that are predecessors + the beastObject
// itself
Set<BEASTInterface> ancestors = new HashSet<>();
collectAncestors(beastObject, ancestors, taboo);
Log.info.print(Arrays.toString(ancestors.toArray()));
for (BEASTInterface beastObject2 : predecessors) {
if (beastObject2 instanceof StateNode) {
Set<BEASTInterface> ancestors2 = new HashSet<>();
collectAncestors(beastObject2, ancestors2, taboo);
ancestors.addAll(ancestors2);
} else if (beastObject2 instanceof Alignment || beastObject2 instanceof FilteredAlignment) {
for (Object output : beastObject2.getOutputs()) {
if (!taboo.contains(output)) {
Set<BEASTInterface> ancestors2 = new HashSet<>();
collectAncestors((BEASTInterface) output, ancestors2, taboo);
ancestors.addAll(ancestors2);
}
}
}
}
// collect priors
predecessors.addAll(ancestors);
for (BEASTInterface o : predecessors) {
if (o instanceof Prior) {
List<BEASTInterface> priorPredecessors = new ArrayList<>();
collectPredecessors(o, priorPredecessors);
ancestors.addAll(priorPredecessors);
}
}
Log.info.print(Arrays.toString(predecessors.toArray()));
for (BEASTInterface p : ancestors) {
Log.info.print("(");
try {
for (BEASTInterface p2 : p.listActiveBEASTObjects()) {
if (ancestors.contains(p2)) {
Log.info.print(p2.getID() + " ");
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
Log.info.print(") ");
Log.info.println(p.getID());
}
// now the ancestors contain all beastObjects to be copied
// make a copy of all individual BEASTObjects, before connecting them up
Map<String, BEASTInterface> copySet = new HashMap<>();
for (BEASTInterface beastObject2 : ancestors) {
String id = beastObject2.getID();
if (id == null) {
id = beastObject.getClass().getName().replaceAll(".*\\.", "");
int i = 0;
while (doc.pluginmap.containsKey(id + "." + i)) {
i++;
}
id = id + "." + i;
beastObject2.setID(id);
}
String copyID = renameId(id, oldContext, newContext);
if (!id.equals(copyID)) {
if (doc.pluginmap.containsKey(copyID)) {
BEASTInterface org = doc.pluginmap.get(copyID);
copySet.put(id, org);
} else {
BEASTInterface copy;
try {
copy = beastObject2.getClass().newInstance();
copy.setID(copyID);
copySet.put(id, copy);
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
throw new RuntimeException("Programmer error: every object in the model should have a default constructor that is publicly accessible");
}
}
}
Log.warning.println("Copy: " + id + " -> " + copyID);
}
// set all inputs of copied beastObjects + outputs to taboo
for (BEASTInterface beastObject2 : ancestors) {
String id = beastObject2.getID();
BEASTInterface copy = copySet.get(id);
if (copy != null) {
Log.warning.println("Processing: " + id + " -> " + copy.getID());
// set inputs
for (Input<?> input : beastObject2.listInputs()) {
if (input.get() != null) {
if (input.get() instanceof List) {
// ((List)copy.getInput(input.getName())).clear();
for (Object o : (List<?>) input.get()) {
if (o instanceof BEASTInterface) {
BEASTInterface value = getCopyValue((BEASTInterface) o, copySet, oldContext, newContext, doc);
// make sure it is not already in the list
Object o2 = copy.getInput(input.getName()).get();
boolean alreadyInList = false;
if (o2 instanceof List) {
List<?> currentList = (List<?>) o2;
for (Object v : currentList) {
if (v == value) {
alreadyInList = true;
break;
}
}
}
if (!alreadyInList) {
// add to the list
copy.setInputValue(input.getName(), value);
}
} else {
// it is a primitive value
if (copy instanceof Parameter.Base && input.getName().equals("value")) {
// // prevent appending to parameter values
Parameter.Base<?> p = ((Parameter.Base<?>) copy);
((List<?>) p.valuesInput.get()).clear();
}
copy.setInputValue(input.getName(), input.get());
}
}
} else if (input.get() instanceof BEASTInterface) {
// handle BEASTObject
BEASTInterface value = getCopyValue((BEASTInterface) input.get(), copySet, oldContext, newContext, doc);
copy.setInputValue(input.getName(), value);
} else if (input.get() instanceof String) {
// may need to replace partition info
String s = (String) input.get();
s = s.replaceAll("\\.c:[a-zA-Z0-9_]*", ".c:" + newContext.clockModel);
s = s.replaceAll("\\.s:[a-zA-Z0-9_]*", ".s:" + newContext.siteModel);
s = s.replaceAll("\\.t:[a-zA-Z0-9_]*", ".t:" + newContext.tree);
copy.setInputValue(input.getName(), s);
} else {
// it is a primitive value
copy.setInputValue(input.getName(), input.get());
}
}
}
// set outputs
for (Object output : beastObject2.getOutputs()) {
if (taboo.contains(output) && output != parent) {
BEASTInterface output2 = getCopyValue((BEASTInterface) output, copySet, oldContext, newContext, doc);
for (Input<?> input : ((BEASTInterface) output).listInputs()) {
// do not add state node initialisers automatically
if (input.get() instanceof List && // do not update state node initialisers
!(taboo.contains(output2) && input.getName().equals("init"))) {
List<?> list = (List<?>) input.get();
if (list.contains(beastObject2)) {
List<?> list2 = (List<?>) output2.getInput(input.getName()).get();
if (!list2.contains(copy)) {
output2.setInputValue(input.getName(), copy);
}
}
}
}
}
}
copySet.put(id, copy);
// Log.warning.println(base.operatorsAsString());
}
}
// deep copy must be obtained from copyset, before sorting
// since the sorting changes (deletes items) from the copySet map
BEASTInterface deepCopy = copySet.get(beastObject.getID());
// first need to sort copySet by topology, before we can initAndValidate
// them
List<BEASTInterface> sorted = new ArrayList<>();
Collection<BEASTInterface> values = copySet.values();
while (values.size() > 0) {
for (BEASTInterface copy : values) {
boolean found = false;
for (BEASTInterface beastObject2 : copy.listActiveBEASTObjects()) {
if (values.contains(beastObject2)) {
found = true;
break;
}
}
if (!found) {
sorted.add(copy);
}
}
values.remove(sorted.get(sorted.size() - 1));
}
// initialise copied beastObjects
Set<BEASTInterface> done = new HashSet<>();
for (BEASTInterface copy : sorted) {
try {
if (!done.contains(copy)) {
copy.initAndValidate();
done.add(copy);
}
} catch (Exception e) {
// ignore
Log.warning.print(e.getMessage());
}
if (doc != null) {
doc.addPlugin(copy);
}
}
doc.scrubAll(true, false);
return deepCopy;
}
use of beast.core.BEASTInterface in project beast2 by CompEvol.
the class BeautiDoc method renamePartition.
public void renamePartition(int partitionID, String oldName, String newName) {
Log.warning.println("renamePartition: " + partitionID + " " + oldName + " " + newName);
// sanity check: make sure newName is not already in use by another partition
String newsuffix = null;
switch(partitionID) {
case ALIGNMENT_PARTITION:
newsuffix = "." + newName;
break;
case SITEMODEL_PARTITION:
newsuffix = ".s:" + newName;
break;
case CLOCKMODEL_PARTITION:
newsuffix = ".c:" + newName;
break;
case TREEMODEL_PARTITION:
newsuffix = ".t:" + newName;
break;
default:
throw new IllegalArgumentException();
}
for (BEASTInterface beastObject : pluginmap.values()) {
if (beastObject.getID().endsWith(newsuffix)) {
throw new IllegalArgumentException("Name " + newName + " is already in use");
}
}
// do the renaming
String oldsuffix = null;
switch(partitionID) {
case ALIGNMENT_PARTITION:
oldsuffix = "." + oldName;
break;
case SITEMODEL_PARTITION:
oldsuffix = ".s:" + oldName;
break;
case CLOCKMODEL_PARTITION:
oldsuffix = ".c:" + oldName;
break;
case TREEMODEL_PARTITION:
oldsuffix = ".t:" + oldName;
break;
default:
throw new IllegalArgumentException();
}
for (BEASTInterface beastObject : pluginmap.values()) {
if (beastObject.getID().endsWith(oldsuffix)) {
String id = beastObject.getID();
id = id.substring(0, id.indexOf(oldsuffix)) + newsuffix;
beastObject.setID(id);
}
}
if (partitionID == ALIGNMENT_PARTITION) {
// make exception for renaming alignment: its ID does not contain a dot
for (BEASTInterface beastObject : pluginmap.values()) {
if (beastObject.getID().equals(oldName)) {
beastObject.setID(newName);
}
}
}
// update beastObject map
String[] keyset = pluginmap.keySet().toArray(new String[0]);
for (String key : keyset) {
if (key.endsWith(oldsuffix)) {
BEASTInterface beastObject = pluginmap.remove(key);
key = key.substring(0, key.indexOf(oldsuffix)) + newsuffix;
pluginmap.put(key, beastObject);
}
}
// update tip text map
keyset = tipTextMap.keySet().toArray(new String[0]);
for (String key : keyset) {
if (key.endsWith(oldsuffix)) {
String tip = tipTextMap.remove(key);
key = key.substring(0, key.indexOf(oldsuffix)) + newsuffix;
tip = tip.replaceAll(oldsuffix, newsuffix);
tipTextMap.put(key, tip);
}
}
// update partition name table
determinePartitions();
}
Aggregations