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