use of org.chocosolver.solver.variables.IntVar in project scheduler by btrplace.
the class CSplit method injectContinuous.
private boolean injectContinuous(ReconfigurationProblem rp, List<List<VM>> vmGroups) {
if (!cstr.isSatisfied(rp.getSourceModel())) {
rp.getLogger().error("The constraint '{}' must be already satisfied to provide a continuous restriction", cstr);
return false;
}
// Each VM on a group, can not go to a node until all the VMs from the other groups have leaved
// So, for each group of VM, we create a list containing the c^end and the c^host variable of all
// the VMs in the other groups then we establish precedences constraints.
TIntArrayList[] otherPositions = new TIntArrayList[vmGroups.size()];
@SuppressWarnings("unchecked") List<IntVar>[] otherEnds = new List[vmGroups.size()];
for (int i = 0; i < vmGroups.size(); i++) {
otherPositions[i] = new TIntArrayList();
otherEnds[i] = new ArrayList<>();
}
fullfillOthers(rp, otherPositions, otherEnds, vmGroups);
// Now, we just have to put way too many precedences constraint, one per VM.
for (int i = 0; i < vmGroups.size(); i++) {
List<VM> grp = vmGroups.get(i);
for (VM vm : grp) {
if (rp.getFutureRunningVMs().contains(vm)) {
VMTransition a = rp.getVMAction(vm);
IntVar myPos = a.getDSlice().getHoster();
IntVar myStart = a.getDSlice().getStart();
rp.getModel().post(new Precedences(myPos, myStart, otherPositions[i].toArray(), otherEnds[i].toArray(new IntVar[otherEnds[i].size()])));
}
}
}
return true;
}
use of org.chocosolver.solver.variables.IntVar in project scheduler by btrplace.
the class CSplit method fullfillOthers.
private static void fullfillOthers(ReconfigurationProblem rp, TIntArrayList[] otherPositions, List<IntVar>[] otherEnds, List<List<VM>> vmGroups) {
Mapping map = rp.getSourceModel().getMapping();
// Fulfill the others stuff.
for (int i = 0; i < vmGroups.size(); i++) {
List<VM> grp = vmGroups.get(i);
for (VM vm : grp) {
if (map.isRunning(vm)) {
int myPos = rp.getNode(map.getVMLocation(vm));
IntVar myEnd = rp.getVMAction(vm).getCSlice().getEnd();
for (int j = 0; j < vmGroups.size(); j++) {
if (i != j) {
otherPositions[j].add(myPos);
otherEnds[j].add(myEnd);
}
}
}
}
}
}
use of org.chocosolver.solver.variables.IntVar 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