log.warn("attribute {} already selected in a parent node", best.getAttr());
}
Node childNode;
if (data.getDataset().isNumerical(best.getAttr())) {
Data loSubset = data.subset(Condition.lesser(best.getAttr(), best.getSplit()));
Node loChild = build(rng, loSubset);
Data hiSubset = data.subset(Condition.greaterOrEquals(best.getAttr(), best.getSplit()));
Node hiChild = build(rng, hiSubset);
childNode = new NumericalNode(best.getAttr(), best.getSplit(), loChild, hiChild);
} else { // CATEGORICAL attribute
selected[best.getAttr()] = true;
double[] values = data.values(best.getAttr());
Node[] children = new Node[values.length];
for (int index = 0; index < values.length; index++) {
Data subset = data.subset(Condition.equals(best.getAttr(), values[index]));
children[index] = build(rng, subset);
}
childNode = new CategoricalNode(best.getAttr(), values, children);