import choco.kernel.solver.variables.integer.IntDomainVar; import choco.kernel.solver.variables.AbstractVar; import choco.kernel.memory.IStateInt; import java.util.*; import java.io.*; // // for monitoring the search process // public class MonitorObject { private IntDomainVar[] vars; // 0/1 decision variables private int n; // number of decision variables private int[] saturation; // saturation of vertex i private int[] colour; // colour of a vertex private int[] solution; // best solution so far private IStateInt depth; // current depth of search private IStateInt[] deg; // current degree private Object[] saturationAtDepth; // average saturation at depth private Object[] colourAtDepth; // chromatic number at depth private Object[] degAtDepth; // average degree at depth private Object[] pAtDepth; // size of candidate set P private Object[] kAtDepth; // size of clique private int[] visits; // visits at depth private Object[] densityAtDepth; // essentially, edge probability private ArrayList kMaxLog; // trace of max clique size private ArrayList pLog; // trace of candidate set size private ArrayList kLog; // trace of current clique size private ArrayList depthLog; // trace of current depth private int kMax; // size of largest clique public MonitorObject(IntDomainVar[] vars,int[] saturation,int[] colour, IStateInt[] deg,int[] solution,IStateInt depth){ this.vars = vars; n = vars.length; kMax = 0; this.saturation = saturation; this.colour = colour; this.deg = deg; this.solution = solution; this.depth = depth; saturationAtDepth = new Object[n]; colourAtDepth = new Object[n]; degAtDepth = new Object[n]; pAtDepth = new Object[n]; kAtDepth = new Object[n]; densityAtDepth = new Object[n]; kMaxLog = new ArrayList(); pLog = new ArrayList(); kLog = new ArrayList(); depthLog = new ArrayList(); visits = new int[n]; for (int i=0;i(); colourAtDepth[i] = new ArrayList(); degAtDepth[i] = new ArrayList(); pAtDepth[i] = new ArrayList(); kAtDepth[i] = new ArrayList(); densityAtDepth[i] = new ArrayList(); visits[i] = 0; } } public void monitor(){ depth.add(1); int i,K,P,sumSat,maxCol,sumDeg; i = depth.get(); kMax = K = P = sumSat = maxCol = sumDeg = 0; visits[i]++; for (int j=0;j x1 = (ArrayList)saturationAtDepth[i]; x1.add((float)sumSat/(float)P); ArrayList i1 = (ArrayList)colourAtDepth[i]; i1.add(maxCol); ArrayList x2 = (ArrayList)degAtDepth[i]; x2.add((float)sumDeg/(float)P); ArrayList i2 = (ArrayList)pAtDepth[i]; i2.add(P); ArrayList i3 = (ArrayList)kAtDepth[i]; i3.add(K); ArrayList x3 = (ArrayList)densityAtDepth[i]; if (P > 1) x3.add((float)sumDeg/(float)(P*(P-1))); kMaxLog.add(kMax); kLog.add(K); pLog.add(P); depthLog.add(i); } private float iAverage(ArrayListx){ int sum = 0; for(int i : x) sum = sum + i; if (x.size() == 0) return 0; return (float)sum/(float)x.size(); } private float fAverage(ArrayListx){ float sum = (float)0.0; for(float y : x) sum = sum + y; if (x.size() == 0) return 0; return sum/(float)x.size(); } public String toString(){ String s = ""; for (int i=0;i)pAtDepth[i]) +" "; s = s + iAverage((ArrayList)kAtDepth[i]) +" "; s = s + fAverage((ArrayList)degAtDepth[i]) +" "; s = s + fAverage((ArrayList)saturationAtDepth[i]) +" "; s = s + iAverage((ArrayList)colourAtDepth[i]) +" "; s = s + fAverage((ArrayList)densityAtDepth[i]) +"\n"; } return s; } public void printLog(){ try{ BufferedWriter out = new BufferedWriter(new FileWriter("logFile")); for (int i=0;i