import choco.kernel.solver.search.integer.AbstractIntVarSelector;
import choco.kernel.solver.variables.integer.IntDomainVar;
import choco.kernel.solver.variables.AbstractVar;
import choco.kernel.memory.IStateInt;

public class MaxDegreeHeuristic extends AbstractIntVarSelector {

    private IntDomainVar[] vars;           // 0/1 decision variables
    private int n;                         // number of decision variables
    private IStateInt[] deg;               // number of vertices adjacent to v[i] in candidate set, reversible
    private ReversibleVector candidateSet; // the uninstantiated variables

    public MaxDegreeHeuristic(IntDomainVar[] vars,IStateInt[] deg,ReversibleVector candidateSet){
	this.vars = vars; n = vars.length; this.deg = deg; this.candidateSet = candidateSet;
    }

    public IntDomainVar selectIntVar(){
	int maxDegree             = Integer.MIN_VALUE;
	IntDomainVar maxDegreeVar = null;
	int degree                = 0;
	int i                     = 0;
	for (int k=0;k<candidateSet.size();k++){
	    i = candidateSet.get(k);
	    degree = deg[i].get();
	    if (degree > maxDegree){maxDegreeVar = vars[i]; maxDegree = degree;}
	    }	
	//System.out.println("selected: "+ minDegreeVar);
	return maxDegreeVar;
    }
    //
    // select the uninstantiated variable with maximum degree
    //
}