package trust.weka4jason;
import java.util.ArrayList;
import java.util.List;
import weka.core.Attribute;
import weka.core.DenseInstance;
import weka.core.Instance;
import weka.core.Instances;
/**
* This class manages the dataset for the weka
* classifier and the bridge with the Jason beliefs base
* @author pc
*
*/
public class WekaDataset implements Cloneable{
Instances dataset;
/**
* Create the structure of the dataset.
* The attributes order is:
* <ol>
* <li> Task </li>
* <li> Ability </li>
* <li> Disposition </li>
* <li> Cross </li>
* <li> Score </li>
* </ol>
*/
@SuppressWarnings("unchecked")
public WekaDataset(){
/* Structure */
Attribute task = new Attribute("Task", (List) null);
Attribute ability = new Attribute("Ability", (List) null);
Attribute disposition = new Attribute("Disposition", (List) null);
Attribute cross = new Attribute("Cross", (List) null);
Attribute context = new Attribute("ExtFactors");
Attribute score = new Attribute("score");
ArrayList<Attribute> attributes = new ArrayList<Attribute>();
attributes.add(task);
attributes.add(ability);
attributes.add(disposition);
attributes.add(cross);
attributes.add(context);
attributes.add(score);
// last arg is the max entry set
dataset = new Instances("BeliefBase", attributes, 755);
}
/**
* Incrementally add a new instance to the dataset.
* @param index index where to add the new entry.
* @param list list of attribute values of this entry.
*/
public void addInstance(int index, Object ... list){
int size = dataset.size();
if(index>size){
//System.out.println("** Inserting entry "+ list[0]+" "+list[1]+" "+list[2]+" "+list[3]+" "+list[4]+" "+list[5]);
if(isNominalDataset())
stringFilter();
dataset.add(newInstance(list));
}
}
private boolean isNominalDataset() {
for(int i=0; i<dataset.numAttributes(); i++)
if(dataset.attribute(i).isNominal())
return true;
return false;
}
/**
* Set current dataset
* @param data
*/
public void setDataset(Instances data){
dataset = data;
}
/**
* Return current dataset
* @return
*/
public Instances getDataset(){
return dataset;
}
/**
* Translate string into nominal attributes.
*/
public void nominalFilter(){
dataset = WekaUtils.fromStringToNominal(dataset, 1,2,3,4);
}
/**
* Translate string into nominal attributes.
*/
public void stringFilter(){
dataset = WekaUtils.fromNominalToString(dataset, 1,2,3,4);
}
/**
* Generate a new Instance entry shaped on the current string dataset structure
* @param list list of attribute values of this entry
* @return
*/
public Instance newInstance(Object ...list){
Instance newInstance = new DenseInstance(dataset.numAttributes());
Attribute att;
for(int i=0; i<list.length; i++){
att = dataset.attribute(i);
String listval = list[i].toString();
//System.out.println(" ATTR. " + att + " VAL. " + listval);
if(att.isNumeric()){
try{
double dval = Double.parseDouble(listval);
newInstance.setValue(att, dval );
}catch(Exception ex){ }
}
else{
try{
newInstance.setValue(att, list[i].toString() );
}catch(Exception e){
e.printStackTrace();
}
}
}
//System.out.println(newInstance);
return newInstance;
}
/**
* Generate a new Instance entry shaped on the current nominal dataset structure
* It also checks whether the instance is compliant with the nominal structure
* @param list list of attribute values of this entry
* @return
*/
public Instance createNominalInstance(Object ...list){
Instance newInstance = new DenseInstance(dataset.numAttributes());
Attribute att;
for(int i=0; i<list.length; i++){
att = dataset.attribute(i);
String listval = list[i].toString();
//System.out.println(listval);
//System.out.println(" ATTR. " + att + " VAL. " + listval);
if(att.isNumeric()){
try{
double dval = Double.parseDouble(listval);
newInstance.setValue(att, dval );
}catch(Exception ex){
ex.printStackTrace();
}
}
else{
//att is nominal
if(att.isNominal() && att.indexOfValue(listval)<0)
return null; //instance not compliant
try{
newInstance.setValue(att, list[i].toString() );
}catch(Exception e){
e.printStackTrace();
}
}
}
newInstance.setDataset(dataset);
//System.out.println("new instance "+newInstance);
//System.out.println("dataset class index "+dataset.classIndex() + " "+dataset.classAttribute());
//System.out.println("instance class index "+newInstance.classIndex() + " "+newInstance.classAttribute());
return newInstance;
}
public Object clone(){
WekaDataset copy = new WekaDataset();
copy.dataset = new Instances(this.dataset);
return copy;
}
}