package gipad.plan.choco.constraints; import java.util.Arrays; import solver.Solver; import solver.constraints.Constraint; import solver.variables.IntVar; import solver.variables.Task; /** Cumulative constraint on multiple dimensions * should be applied to the demanding slices * @author Sabrine * */ public class CumulativeMultiDim extends Constraint{ private static final long serialVersionUID = 2212908998958152173L; //************ Static variables private final int CUMULATIVE = PropTTPCDynamicSweepLoads.CUMULATIVE; private final int COLORED = PropTTPCDynamicSweepLoads.COLORED; //*********all variables private IntVar<?>[] allVars; private static IntVar<?>[][] vLoads;// Pb si en static ? /** * @param vTasks The tasks to schedule * @param vHeights The consumption of the different tasks for each resource * @param vCapacities The capacities in the different resources * @param solver * @param interestingTimePoints */ @SuppressWarnings("unchecked") public CumulativeMultiDim( Task[] vTasks, IntVar<?>[][] vHeights, IntVar<?>[] vCapacities, Solver solver, int[] interestingTimePoints) { super(varsAggregator(vCapacities.length, vTasks, vHeights, vCapacities,interestingTimePoints.length), solver); Constraint<?, PropTTPCDynamicSweepLoads> c = new Constraint(allVars, solver); int[] resourceType= new int[vCapacities.length]; Arrays.fill(resourceType, CUMULATIVE); int[] interestingResources = new int[]{0}; int[] capacities=new int[vCapacities.length]; for(int i=0;i<vCapacities.length;i++){ capacities[i]=vCapacities[i].getValue(); } c.addPropagators(new PropTTPCDynamicSweepLoads(allVars,vTasks.length,vCapacities.length,capacities, new int[vTasks.length][0],resourceType,interestingTimePoints,interestingResources)); } private static IntVar[] varsAggregator(int nbResources, Task[] vTasks, IntVar[][] vHeights, IntVar[] vCapacities, int nbInterestingTimePoints) { int hIdx = 3*vTasks.length; IntVar<?>[] allVars = new IntVar[hIdx+vTasks.length*nbResources+nbResources+nbInterestingTimePoints*nbResources]; CumulativeMultiDim.vLoads = new IntVar[nbInterestingTimePoints][vCapacities.length]; for (int t=0;t<vTasks.length;t++) { allVars[t] = vTasks[t].getStart(); allVars[t+vTasks.length] = vTasks[t].getDuration(); allVars[t+2*vTasks.length] = vTasks[t].getEnd(); for (int r=0;r<nbResources;r++) { allVars[hIdx+t*nbResources+r] = vHeights[t][r]; } } int cIdx = hIdx+vTasks.length*nbResources; for (int r=0;r<nbResources;r++) { allVars[cIdx+r] = vCapacities[r]; } int lIdx = cIdx+nbResources; for (int i=0;i<nbInterestingTimePoints;i++) { for (int j=0;j<nbResources;j++) { allVars[lIdx+i*nbResources+j] = vLoads[i][j]; } } return allVars; } }