package weka.filters;
import java.io.*;
import java.util.*;
import weka.core.*;
public class Split extends Filter{
public static void filterFile(Filter filter, String [] options)
throws Exception {
Instances instances = null;
Instances ins = null;
BufferedReader reader = null;
Dict opt=new Dict();
try {
opt.put("class", Utils.getInt('c',options));
opt.put("data", Utils.getOption('d',options));
opt.put("line", Utils.getInt('l',options));
} catch (Exception ex) {
String genericOptions = "\nGeneral options:\n\n"
+ "-d <file>\n"
+ "\tThe name of the file containing input instances.\n"
+ "\tIf not supplied then instances will be read from stdin.\n"
+ "-s <is sparse>\n";
throw new Exception(ex.getMessage()+genericOptions);
}
if(opt.getString("data").length()!=0){
reader=new BufferedReader(new FileReader(opt.getString("data")));
}else{
reader=new BufferedReader(new InputStreamReader(System.in));
}
instances = new Instances(reader);
int p=instances.numInstances()/opt.getInt("line");
if(opt.getInt("class")<0)opt.put("class",instances.numAttributes()-1);
instances.setClassIndex(opt.getInt("class"));
Attribute classAttribute=instances.classAttribute();
int numClasses=classAttribute.numValues();
int [] count=new int[numClasses];
int [][][] keys=new int[numClasses][][];
for(int i=0;i<numClasses;i++){
count[i]=instances.numInstancesWithClass(i)/p;
keys[i]=Utils.chunk(instances.indicesWithClass(i),count[i]);
}
Attribute indexAttribute=new Attribute("index");
instances.insertAttributeAt(indexAttribute,0);
for(int i=0,ii=instances.numInstances();i<ii;i++)instances.instance(i).setValue(indexAttribute,i);
String path=opt.getString("data");
path=path.substring(0,path.lastIndexOf("."));
for(int i=0;i<p;i++){
ins=new Instances(instances,0);
for(int j=0;j<numClasses;j++){
for(int k=0,kk=keys[j][i].length;k<kk;k++){
ins.add(instances.instance(keys[j][i][k]));
}
}
PrintWriter writer=new PrintWriter(new FileOutputStream(path+"-"+i+".arff"));
writer.print(ins.toString());
}
}
public static void main(String [] argv) {
try {
Split.filterFile(new Split(), argv);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}