in Java/core/src/main/java/com/amazon/randomcutforest/RandomCutForest.java [327:375]
protected RandomCutForest(Builder<?> builder, boolean notUsed) {
checkArgument(builder.numberOfTrees > 0, "numberOfTrees must be greater than 0");
checkArgument(builder.sampleSize > 0, "sampleSize must be greater than 0");
builder.outputAfter.ifPresent(n -> {
checkArgument(n > 0, "outputAfter must be greater than 0");
checkArgument(n <= builder.sampleSize, "outputAfter must be smaller or equal to sampleSize");
});
checkArgument(builder.dimensions > 0, "dimensions must be greater than 0");
builder.timeDecay.ifPresent(timeDecay -> {
checkArgument(timeDecay >= 0, "timeDecay must be greater than or equal to 0");
});
builder.threadPoolSize.ifPresent(n -> checkArgument((n > 0) || ((n == 0) && !builder.parallelExecutionEnabled),
"threadPoolSize must be greater/equal than 0. To disable thread pool, set parallel execution to 'false'."));
checkArgument(builder.internalShinglingEnabled || builder.shingleSize == 1
|| builder.dimensions % builder.shingleSize == 0, "wrong shingle size");
// checkArgument(!builder.internalShinglingEnabled || builder.shingleSize > 1,
// " need shingle size > 1 for internal shingling");
if (builder.internalRotationEnabled) {
checkArgument(builder.internalShinglingEnabled, " enable internal shingling");
}
builder.initialPointStoreSize.ifPresent(n -> {
checkArgument(n > 0, "initial point store must be greater than 0");
checkArgument(n > builder.sampleSize * builder.numberOfTrees || builder.dynamicResizingEnabled,
" enable dynamic resizing ");
});
checkArgument(builder.boundingBoxCacheFraction >= 0 && builder.boundingBoxCacheFraction <= 1,
"incorrect cache fraction range");
numberOfTrees = builder.numberOfTrees;
sampleSize = builder.sampleSize;
outputAfter = builder.outputAfter.orElse((int) (sampleSize * DEFAULT_OUTPUT_AFTER_FRACTION));
internalShinglingEnabled = builder.internalShinglingEnabled;
shingleSize = builder.shingleSize;
dimensions = builder.dimensions;
timeDecay = builder.timeDecay.orElse(1.0 / (DEFAULT_SAMPLE_SIZE_COEFFICIENT_IN_TIME_DECAY * sampleSize));
storeSequenceIndexesEnabled = builder.storeSequenceIndexesEnabled;
centerOfMassEnabled = builder.centerOfMassEnabled;
parallelExecutionEnabled = builder.parallelExecutionEnabled;
boundingBoxCacheFraction = builder.boundingBoxCacheFraction;
builder.directLocationMapEnabled = builder.directLocationMapEnabled || shingleSize == 1;
inputDimensions = (internalShinglingEnabled) ? dimensions / shingleSize : dimensions;
pointStoreCapacity = max(sampleSize * numberOfTrees + 1, 2 * sampleSize);
initialPointStoreSize = builder.initialPointStoreSize.orElse(2 * sampleSize);
if (parallelExecutionEnabled) {
threadPoolSize = builder.threadPoolSize.orElse(Runtime.getRuntime().availableProcessors() - 1);
} else {
threadPoolSize = 0;
}
}