package tr.gov.ulakbim.jDenetX.core;
import weka.core.Instance;
import weka.core.Instances;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
/**
* Created by IntelliJ IDEA.
* User: caglar
* Date: May 20, 2010
* Time: 4:42:58 PM
* To change this template use File | Settings | File Templates.
*/
public class InstancesHists {
public Hashtable<Integer, Instances> InstsClasses;
public Hashtable<Integer, Instances> InstsBuffer;
public int ClassesInstsMap[][];
public Instances insts;
public int NoOfClasses;
public int NoOfClusters;
private int ClusterInstancesRatio;
public ArrayList<Integer> BestClassesForClusters;
public InstancesHists(int noOfClasses, int noOfClusters) {
NoOfClasses = noOfClasses;
NoOfClusters = noOfClusters;
ClusterInstancesRatio = 2;
ClassesInstsMap = new int[noOfClusters][noOfClasses];
BestClassesForClusters = new ArrayList<Integer>();
InstsClasses = new Hashtable<Integer, Instances>();
}
public int getNoOfClasses() {
return NoOfClasses;
}
public void addInstance(Instance inst, Integer cluster) {
Instances insts = InstsClasses.get(cluster);
insts.add(inst);
InstsClasses.put(cluster, insts);
}
public int getClusterInstancesRatio() {
return ClusterInstancesRatio;
}
public void setClusterInstancesRatio(int clusterInstancesRatio) {
ClusterInstancesRatio = clusterInstancesRatio;
}
public void setNoOfClasses(int noOfClasses) {
NoOfClasses = noOfClasses;
}
public void getMajorityClasses() {
Enumeration keys = InstsClasses.keys();
Integer key = 0;
Instances values = null;
Instance inst = null;
while (keys.hasMoreElements()) {
key = (Integer) keys.nextElement();
values = InstsClasses.get(key);
for (int i = 0; i < values.numInstances(); i++) {
inst = values.instance(i);
ClassesInstsMap[key][(int) inst.classValue()]++;
}
}
findBestClassesForCluster();
}
public void findBestClassesForCluster() {
for (int i = 0; i < NoOfClusters; i++) {
int maxFreq = 0;
int currentClass = 0;
for (int j = 0; j < NoOfClasses; j++) {
if (maxFreq < ClassesInstsMap[i][j]) {
maxFreq = ClassesInstsMap[i][j];
currentClass = j;
}
}
if (BestClassesForClusters.contains((Integer) currentClass) &&
(ClassesInstsMap[i][(Integer) BestClassesForClusters.get(i)] / InstsClasses.get(i).numInstances()) > ClusterInstancesRatio) {
BestClassesForClusters.set(i, -1);
} else {
BestClassesForClusters.set(i, currentClass);
}
}
}
public Instances getInstancesForCluster(Integer clusterNo) {
return InstsClasses.get(clusterNo);
}
}