use of org.btrplace.model.constraint.Among in project scheduler by btrplace.
the class CSplitAmong method inject.
@Override
public boolean inject(Parameters ps, ReconfigurationProblem rp) throws SchedulerException {
if (cstr.isContinuous() && !cstr.isSatisfied(rp.getSourceModel())) {
rp.getLogger().error("The constraint '{}' must be already satisfied to provide a continuous restriction", cstr);
return false;
}
Collection<Collection<VM>> vGroups = cstr.getGroupsOfVMs();
Collection<Collection<Node>> pGroups = cstr.getGroupsOfNodes();
Model csp = rp.getModel();
IntVar[] grpVars = new IntVar[vGroups.size()];
// VM is assigned on a node <-> group variable associated to the VM
// is assigned to the group of nodes it belong too.
int i = 0;
for (Collection<VM> vms : vGroups) {
Among a = new Among(vms, pGroups);
// If the constraint is continuous, there is no way a group of VMs already bound to a group of
// nodes can move to another group. It also means the group of VMs will never overlap
a.setContinuous(cstr.isContinuous());
CAmong ca = new CAmong(a);
if (!ca.inject(ps, rp)) {
return false;
}
grpVars[i++] = ca.getGroupVariable();
}
// forces all the vGroups to use different group of nodes
csp.post(csp.allDifferent(grpVars, "DEFAULT"));
return true;
}
Aggregations