package de.tud.inf.example.table; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Random; import com.rapidminer.example.Attribute; import com.rapidminer.example.table.AbstractExampleTable; import com.rapidminer.example.table.DataRow; import com.rapidminer.example.table.DataRowFactory; import com.rapidminer.example.table.DataRowReader; import com.rapidminer.example.table.DoubleArrayDataRow; import com.rapidminer.example.table.ExampleTable; import com.rapidminer.example.table.ListDataRowReader; public class UpdateableMemoryExampleTable extends AbstractExampleTable implements UpdateableExampleTable { private static final long serialVersionUID = 6185821259728827238L; /** List of {@link DataRow}s. */ private List<DataRow> dataList = new LinkedList<DataRow>(); public UpdateableMemoryExampleTable(List<Attribute> attributes) { super(attributes); } public UpdateableMemoryExampleTable(List<Attribute> attributes, DataRowReader i) { this(attributes, i, false); } public UpdateableMemoryExampleTable(List<Attribute> attributes, DataRowReader i, boolean permutate) { this(attributes); readExamples(i, permutate); } public UpdateableMemoryExampleTable(List<Attribute> attributes, DataRowFactory factory, int size) { this(attributes); dataList = new ArrayList<DataRow>(size); for (int i = 0; i < size; i++) { DataRow dataRow = factory.create(attributes.size()); for (Attribute attribute : attributes) { dataRow.set(attribute, Double.NaN); } dataList.add(dataRow); } } // public UpdateableMemoryExampleTable(UpdateableMemoryExampleTable exampleTable) { // Attribute[] attribs = exampleTable.getAttributes(); // List<Attribute> attribList = new LinkedList<Attribute>(); // for (Attribute attribute : attribs) { // attribList.add(attribute); // } // addAttributes(attribList); // this.dataList = new LinkedList(exampleTable.dataList); // } public void readExamples(DataRowReader i) { readExamples(i, false); } public void readExamples(DataRowReader i, boolean permutate) { readExamples(i, false, null); } public void readExamples(DataRowReader i, boolean permutate, Random random) { dataList.clear(); while (i.hasNext()) { if (permutate) { int index = random.nextInt(dataList.size() + 1); dataList.add(index, i.next()); } else { dataList.add(i.next()); } } } public DataRowReader getDataRowReader() { return new ListDataRowReader(dataList.iterator()); } public DataRow getDataRow(int index) { return dataList.get(index); } public int size() { return dataList.size(); } public void addDataRow(DataRow dataRow) { dataList.add(dataRow); } public boolean removeDataRow(DataRow dataRow) { return dataList.remove(dataRow); } public DataRow removeDataRow(int index) { return dataList.remove(index); } public void clear() { dataList.clear(); } public synchronized int addAttribute(Attribute attribute) { return super.addAttribute(attribute); } public static UpdateableMemoryExampleTable createCompleteCopy(ExampleTable oldTable) { UpdateableMemoryExampleTable table = new UpdateableMemoryExampleTable(Arrays.asList(oldTable.getAttributes())); DataRowReader reader = oldTable.getDataRowReader(); while (reader.hasNext()) { DataRow dataRow = reader.next(); double[] newDataRowData = new double[oldTable.getNumberOfAttributes()]; for (int a = 0; a < oldTable.getNumberOfAttributes(); a++) { Attribute attribute = oldTable.getAttribute(a); if (attribute != null) { newDataRowData[a] = dataRow.get(attribute); } else { newDataRowData[a] = Double.NaN; } } table.addDataRow(new DoubleArrayDataRow(newDataRowData)); } return table; } }