package pl.piotrsukiennik.whowhen.classification.util;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Piotr Sukiennik
*/
public class ArffBuilder {
private Map<String, List<double[]>> dataSets = new HashMap<String, List<double[]>>();
private String relationName;
private int dataDimension;
public ArffBuilder( String relationName, int dataDimension ) {
this.relationName = relationName;
this.dataDimension = dataDimension;
}
public static ArffBuilder build( String relationName, int dataDimension, Map<String, List<double[]>> data ) {
ArffBuilder arffBuilder = new ArffBuilder( relationName, dataDimension );
for ( Map.Entry<String, List<double[]>> me : data.entrySet() ) {
arffBuilder.addClassDataSet( me );
}
return arffBuilder;
}
public synchronized void addClassDataSet( Map.Entry<String, List<double[]>> data ) {
this.addClassDataSet( data.getKey(), data.getValue() );
}
public synchronized void addClassDataSet( String className, List<double[]> data ) {
List<double[]> inDataSet = dataSets.get( className );
if ( inDataSet == null ) {
dataSets.put( className, data );
}
else {
inDataSet.addAll( data );
}
}
public synchronized List<double[]> popClass( String className ) {
return dataSets.remove( className );
}
public synchronized void reset() {
dataSets = new HashMap<String, List<double[]>>();
}
public synchronized void save( File targetFile ) {
try {
targetFile.createNewFile();
BufferedWriter bw = new BufferedWriter( new FileWriter( targetFile ) );
bw.write( "@RELATION " );
bw.write( relationName );
bw.write( System.lineSeparator() );
for ( int i = 0; i < this.dataDimension; i++ ) {
bw.write( "@ATTRIBUTE " + i + " NUMERIC" );
bw.write( System.lineSeparator() );
}
bw.write( "@ATTRIBUTE class {" );
String comma = "";
for ( String key : dataSets.keySet() ) {
bw.write( comma );
bw.write( key );
comma = ",";
}
bw.write( "}" );
bw.write( System.lineSeparator() );
bw.write( "@DATA" );
for ( Map.Entry<String, List<double[]>> dataSetEntry : dataSets.entrySet() ) {
bw.write( System.lineSeparator() );
for ( double[] dArr : dataSetEntry.getValue() ) {
for ( double d : dArr ) {
bw.write( d + "," );
}
bw.write( dataSetEntry.getKey() );
bw.write( System.lineSeparator() );
}
}
bw.flush();
bw.close();
}
catch ( IOException e ) {
e.printStackTrace();
throw new RuntimeException( e );
}
}
}