@Override
	protected StatsCollector compute() {
		StatsCollector collector = new StatsCollector(min, max, numBuckets);
		int children = (numChunks < 0) ? calcNumChunks(numIterations) : numChunks;
		if (numIterations <= minChunkSize || children == 1) {
			for (int i = 0; i < numIterations; i++) {
				collector.addObs(NetPresentValue.npv(sampleFlows(),
						rate.sample()));
			}
		} else {
			List<NpvTask> subTasks = new ArrayList<>(children);
			for (int i = 0; i < children; i++) {
				NpvTask subTask = new NpvTask(min, max, numBuckets,
						numIterations / children, rate, flows);
				subTask.setMinChunkSize(minChunkSize);
				subTask.setNumChunks(numChunks);
				subTasks.add(subTask);
			}
			invokeAll(subTasks);
			for (NpvTask subTask : subTasks) {
				collector.combine(subTask.join());
			}
		}
		return collector;
	}