package ids.framework; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import ids.clustering.algorithm.HMRFKmeansParams; import ids.clustering.algorithm.HMRFWKmeans; import ids.clustering.model.Domain; import ids.utils.ConstraintsUtils; public class ConstraintWBased { private int maximum_number_iterations = 30; private int minimum_number_iterations = 5; private boolean verbose; private boolean debug; private boolean useTC; private boolean inferCannotLink; private ConstraintsUtils constraintUtils; // statistics public List<Double> d1_objF; public List<Double> d2_objF; // domains private Domain d1; private Domain d2; public Domain getDomain1() { return d1; } public Domain getDomain2() { return d2; } public ConstraintWBased(Domain d1, Domain d2, ExperimentParams par) { this.d1 = d1; this.d2 = d2; parseParams(par); constraintUtils = new ConstraintsUtils(false); // statistics d1_objF = new ArrayList<Double>(); d2_objF = new ArrayList<Double>(); } public void Start() { // exit boolean d1_exit = false; boolean d2_exit = false; // initialization double[][] constraints = null; int[] otherDomainIDX = null; // domain initialization HMRFKmeansParams par1 = new HMRFKmeansParams(); par1.useTC = useTC; par1.verbose = debug; par1.constraints = constraints; par1.max_number_of_iterations = d1.number_of_iterations; par1.distanceFunction = d1.distance; HMRFKmeansParams par2 = new HMRFKmeansParams(); par2.useTC = useTC; par2.verbose = debug; par2.constraints = constraints; par2.max_number_of_iterations = d2.number_of_iterations; par2.distanceFunction = d2.distance; // run int t = 0; while (t < maximum_number_iterations) { t++; // domain 1 if (debug) System.out.println("Domain 1"); par1.constraints = constraints; par1.otherIDX = otherDomainIDX; HMRFWKmeans d1_kmeans = new HMRFWKmeans(d1.data, d1.k, par1); d1_kmeans.cluster(); d1.old_idx = d1.idx; d1.idx = d1_kmeans.getIDX(); d1.centroids = d1_kmeans.getCentroids(); d1.objF = d1_kmeans.getObjF(); d1_objF.add(new Double(d1.objF)); // get constraints for domain 1 and save the other domain idx constraints = constraintUtils.getConstraintList(d1); otherDomainIDX = d1.idx; // domain 2 if (debug) System.out.println("Domain 2"); par2.constraints = constraints; par2.otherIDX = otherDomainIDX; HMRFWKmeans d2_kmeans = new HMRFWKmeans(d2.data, d2.k, par2); d2_kmeans.cluster(); d2.old_idx = d2.idx; d2.idx = d2_kmeans.getIDX(); d2.centroids = d2_kmeans.getCentroids(); d2.objF = d2_kmeans.getObjF(); d2_objF.add(new Double(d2.objF)); // get constraints for domain 1 constraints = constraintUtils.getConstraintList(d2); otherDomainIDX = d2.idx; // exit condition if (t > minimum_number_iterations) { d1_exit = false; d2_exit = false; if (Arrays.equals(d1.idx, d1.old_idx)) d1_exit = true; if (Arrays.equals(d2.idx, d2.old_idx)) d2_exit = true; if (d1_exit&d2_exit) { if (debug) System.out.println("Constrainted-Weight Based: No change on iteration: " + t); break; } } } // output if (verbose) { System.out.println("Constrainted-Weight Based: Done on iteration: " + t); System.out.println("Value of Obj. Function Domain 1: " + getDomain1().objF); System.out.println("Value of Obj. Function Domain 2: " + getDomain2().objF); } } public double[] getD1_objF() { double[] res = new double[d1_objF.size()]; for (int i = 0; i < d1_objF.size(); i++) { res[i] = d1_objF.get(i); } return res; } public double[] getD2_objF() { double[] res = new double[d2_objF.size()]; for (int i = 0; i < d2_objF.size(); i++) { res[i] = d2_objF.get(i); } return res; } private void parseParams(ExperimentParams par) { maximum_number_iterations = par.maximum_number_iterations; minimum_number_iterations = par.minimum_number_iterations; verbose = par.verbose; debug = par.debug; useTC = par.useTC; } }