package entropy.plan.choco.pack;
import java.util.Arrays;
import org.testng.Assert;
import org.testng.annotations.Test;
import choco.cp.solver.CPSolver;
import choco.cp.solver.constraints.integer.ElementV;
import choco.cp.solver.search.BranchingFactory;
import choco.kernel.common.logging.ChocoLogging;
import choco.kernel.common.logging.Verbosity;
import choco.kernel.common.util.tools.ArrayUtils;
import choco.kernel.solver.Configuration;
import choco.kernel.solver.Solver;
import choco.kernel.solver.constraints.SConstraint;
import choco.kernel.solver.variables.integer.IntDomainVar;
import entropy.plan.choco.constraint.pack.FastBinPacking;
/**
* created sofdem - 18/10/11
*
* @author Sophie Demassey
*/
public class TestFastBinPacking {
Solver s;
IntDomainVar[] loads;
IntDomainVar[] sizes;
IntDomainVar[] bins;
public void modelPack(int nBins, int capa, int nItems, int height) {
int[] heights = new int[nItems];
Arrays.fill(heights, height);
modelPack(nBins, capa, heights);
}
public void modelPack(int nBins, int capa, int[] height) {
int[] capas = new int[nBins];
Arrays.fill(capas, capa);
modelPack(capas, height);
}
public void modelPack(int[] capa, int[] height) {
int nBins = capa.length;
int nItems = height.length;
s = new CPSolver();
loads = new IntDomainVar[nBins];
sizes = new IntDomainVar[nItems];
bins = new IntDomainVar[nItems];
for (int i = 0; i < nBins; i++) {
loads[i] = s.createBoundIntVar("l" + i, 0, capa[i]);
}
for (int i = 0; i < nItems; i++) {
sizes[i] = s.createIntegerConstant("s" + i, height[i]);
bins[i] = s.createEnumIntVar("b" + i, 0, nBins);
}
SConstraint cPack = new FastBinPacking(s.getEnvironment(), loads, sizes, bins);
s.post(cPack);
}
public void testPack(int nbSol) {
s.getConfiguration().putFalse(Configuration.STOP_AT_FIRST_SOLUTION);
s.generateSearchStrategy();
s.launch();
System.out.println(s.getNbSolutions());
Assert.assertEquals((boolean) s.isFeasible(), nbSol != 0, "SAT");
if (nbSol > 0) {
Assert.assertEquals(s.getNbSolutions(), nbSol, "#SOL");
}
s.clear();
}
@Test(groups = {"unit"}, sequential = true)
public void testLoadSup() {
modelPack(5, 5, 5, 2);
s.addGoal(BranchingFactory.minDomMinVal(s, bins));
testPack(2220);
}
@Test(groups = {"unit"}, sequential = true)
public void testGuillaume() {
modelPack(2, 100, 3, 30);
IntDomainVar margeLoad = s.createBoundIntVar("margeLoad", 0, 50);
s.post(nth(bins[0], loads, margeLoad));
ChocoLogging.setVerbosity(Verbosity.SILENT);
testPack(2);
}
/**
* var = array[index]
*/
public SConstraint nth(IntDomainVar index, IntDomainVar[] array, IntDomainVar var) {
return new ElementV(ArrayUtils.append(array, new IntDomainVar[]{index, var}), 0, s.getEnvironment());
}
}