@Override
protected Sample getSubLearnerSample() {
Arrays.fill(residuals, 0, curTrainSet.size, 0);
Arrays.fill(denomWeights, 0, curTrainSet.size, 0);
RankingSample trainSample = (RankingSample) curTrainSet;
int chunkSize = 1 + (trainSample.numQueries / workers.getSize());
int offset = 0;
for (int i = 0; i < workers.getSize() && offset < trainSample.numQueries; i++) {
int endOffset = offset + Math.min(trainSample.numQueries - offset, chunkSize);
workers.getTask(i).init(offset, endOffset);
BlockingThreadPoolExecutor.getInstance().execute(workers.getTask(i));
offset += chunkSize;
}
BlockingThreadPoolExecutor.getInstance().await();
trainSample = trainSample.getClone();
trainSample.targets = residuals;
setSubLearnerSampleWeights(trainSample);
RankingSample zeroFilteredSample = trainSample.getClone();
RankingSample subLearnerSample = zeroFilteredSample.getRandomSubSample(samplingRate, rnd);
for (int i = 0; i < subLearnerSample.size; i++) {
subLearnerSampleIndicesInTrainSet[i] = zeroFilteredSample.indicesInParentSample[subLearnerSample.indicesInParentSample[i]];
}
return subLearnerSample;
}