All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.btrplace.scheduler.choco.view.ChocoViews Maven / Gradle / Ivy

/*
 * Copyright (c) 2016 University Nice Sophia Antipolis
 *
 * This file is part of btrplace.
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see .
 */

package org.btrplace.scheduler.choco.view;

import org.btrplace.model.Model;
import org.btrplace.scheduler.SchedulerException;

import java.util.*;

/**
 * Utility class to manipulate collection of {@link ChocoView}.
 */
public class ChocoViews {

    /**
     * Utility class. No instantiations.
     */
    private ChocoViews() {

    }
    /**
     * Flatten the views while considering their dependencies.
     * Operations over the views that respect the iteration order, satisfies the dependencies.
     *
     * @param mo    the model
     * @param views the associated solver views
     * @return the list of views, dependency-free
     * @throws SchedulerException if there is a cyclic dependency
     */
    public static List resolveDependencies(Model mo, List views, Collection base) throws SchedulerException {
        Set done = new HashSet<>(base);
        List remaining = new ArrayList<>(views);
        List solved = new ArrayList<>();
        while (!remaining.isEmpty()) {
            ListIterator ite = remaining.listIterator();
            boolean blocked = true;
            while (ite.hasNext()) {
                ChocoView s = ite.next();
                if (done.containsAll(s.getDependencies())) {
                    ite.remove();
                    done.add(s.getIdentifier());
                    solved.add(s);
                    blocked = false;
                }
            }
            if (blocked) {
                throw new SchedulerException(mo, "Missing dependencies or cyclic dependencies prevent from using: " + remaining);
            }
        }
        return solved;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy