@Override
    protected void compute() {
        taxiContacts = new ConcurrentHashMap<>();
        LinkedList<RecursiveAction> forks = new LinkedList<>();
        int nbIter = 0;
        for (Map.Entry<CoordinateId, Coordinate> entry : taxiCoordinates.entrySet()) {
            if (VERBOSE && ((taxiCoordinates.entrySet().size() - nbIter) % (taxiCoordinates.entrySet().size() / 10) == 0))
                System.out.print((taxiCoordinates.entrySet().size() - nbIter) * 10 / taxiCoordinates.entrySet().size() + "...");
            SubContactTraceGeneratorTask subTask = new SubContactTraceGeneratorTask(entry,
                    taxiCoordinates.subMap(entry.getKey(),
                            false,
                            new CoordinateId(999999, entry.getKey().getTaxiTimestamp() + TIME_RANGE * 1000),
                            true),
                    taxiContacts
            );
            forks.add(subTask);
            subTask.fork();
            nbIter++;
        }
        if (VERBOSE) System.out.println("threads launched.");
        nbIter = 0;
        for (RecursiveAction task : forks) {
            if (VERBOSE && ((forks.size() - nbIter) % (forks.size() / 10) == 0))
                System.out.print((forks.size() - nbIter) * 10 / forks.size() + "...");
            task.join();
            nbIter++;
        }
        if (VERBOSE) System.out.println("done.");
    }