@Override protected Double modifyARG() throws InvalidParameterValueException, IllegalModificationException, ModificationImpossibleException { List<ARGNode> internalNodes = arg.getInternalNodes(); int nodeNum = RandomSource.getNextIntFromTo(0, internalNodes.size() - 1); ARGNode node = internalNodes.get(nodeNum); if (internalNodes.size() == 1) // Must be two tips, no recomb nodes throw new ModificationImpossibleException("No internal nodes to modify"); // Pick a node that is not the root while (node.getParent(0) == null) { node = internalNodes.get(RandomSource.getNextIntFromTo(0, internalNodes.size() - 1)); } double hr; if (node instanceof CoalNode) { hr = swapCoalNode((CoalNode) node); } else { hr = swapRecombNode((RecombNode) node); } return hr; }