void MMPAvailabilityInformation::updateAvailability(const TaskDescription & req) {
    list<MDPTCluster *> clusters;
    getAvailability(clusters, req);
    for (list<MDPTCluster *>::iterator it = clusters.begin(); it != clusters.end(); it++)
        (*it)->maxT = stars::MaxParameter<Time, int64_t>(req.getDeadline());
    if (!clusters.empty() && queueRange.getMax() < req.getDeadline())
        queueRange.setMaximum(req.getDeadline());
}
unsigned int MMPAvailabilityInformation::getAvailability(list<MDPTCluster *> & clusters, const TaskDescription & req) {
    unsigned int result = 0;
    Time now = Time::getCurrentTime();
    for (auto & c : summary) {
        Time start = now;
        if (c.maxT.getValue() > start) start = c.maxT.getValue();
        if (start < req.getDeadline() && c.fulfills(req)) {
            double time = (req.getDeadline() - start).seconds();
            unsigned long int length = req.getLength() ? req.getLength() : 1000;   // A minimum length
            unsigned long int t = (time * c.minP.getValue()) / length;
            if (t != 0) {
                clusters.push_back(&c);
                result += t;
            }
        }
    }
    return result;
}