package erminer;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import org.knime.core.data.DataCell;
import org.knime.core.data.DataColumnSpec;
import org.knime.core.data.DataColumnSpecCreator;
import org.knime.core.data.DataRow;
import org.knime.core.data.DataTableSpec;
import org.knime.core.data.RowIterator;
import org.knime.core.data.RowKey;
import org.knime.core.data.def.DefaultRow;
import org.knime.core.data.def.DoubleCell;
import org.knime.core.data.def.StringCell;
import org.knime.core.node.BufferedDataContainer;
import org.knime.core.node.BufferedDataTable;
import org.knime.core.node.CanceledExecutionException;
import org.knime.core.node.ExecutionContext;
import org.knime.core.node.ExecutionMonitor;
import org.knime.core.node.InvalidSettingsException;
import org.knime.core.node.NodeModel;
import org.knime.core.node.NodeSettingsRO;
import org.knime.core.node.NodeSettingsWO;
import org.knime.core.node.defaultnodesettings.SettingsModelDoubleBounded;
import org.knime.core.node.defaultnodesettings.SettingsModelIntegerBounded;
import org.knime.core.node.defaultnodesettings.SettingsModelString;
import erminer.algo.AlgoERMinerApplied;
import erminer.algo.SequenceDatabase;
/**
* <code>NodeModel</code> for the "ERMiner" node.
* Mining sequential rules using the ERMiner from the spmf-library (http://www.philippe-fournier-viger.com/spmf)
*
* @author Manuel Wildner
*/
public class ERMinerNodeModel extends NodeModel {
/**
* The container for building the output table.
*/
static BufferedDataContainer container;
/**
* The settings models for the dialog components to handle user settings.
*/
private SettingsModelDoubleBounded m_minSupSelection = createMinSupModel();
private SettingsModelDoubleBounded m_minConfSelection = createMinConfModel();
private SettingsModelString m_SeqColumnSelection = createSeqColumnModel();
private double minSup = 0.5;
private double minConf = 0.6;
/**
* Constructor for the node model.
*/
protected ERMinerNodeModel() {
super(1, 1);
}
/**
* {@inheritDoc}
*/
@Override
protected BufferedDataTable[] execute(final BufferedDataTable[] inData,
final ExecutionContext exec) throws Exception {
// test if input is null
if (inData == null || inData[0] == null) {
return inData;
}
// stores meta data about the table
DataTableSpec inDataSpec = inData[0].getDataTableSpec();
int rowNum = inData[0].getRowCount();
/*
* store the positions of needed columns.
*/
int seqColPos = inDataSpec.findColumnIndex(m_SeqColumnSelection
.getStringValue());
/*
* update k, minconf and delta which is specified by the user
*/
minSup = m_minSupSelection.getDoubleValue();
minConf = m_minConfSelection.getDoubleValue();
RowIterator rowIter = inData[0].iterator();
DataColumnSpec[] allColSpecs = new DataColumnSpec[3];
allColSpecs[0] = new DataColumnSpecCreator("Rule", StringCell.TYPE)
.createSpec();
allColSpecs[1] = new DataColumnSpecCreator("Support(absolute)", DoubleCell.TYPE)
.createSpec();
allColSpecs[2] = new DataColumnSpecCreator("Confidence", DoubleCell.TYPE)
.createSpec();
DataTableSpec outputSpec = new DataTableSpec(allColSpecs);
SequenceDatabase database = new SequenceDatabase();
while (rowIter.hasNext()) {
String[] inputTokens = ((StringCell) (rowIter.next()
.getCell(seqColPos))).getStringValue().split(" ");
database.addSequence(inputTokens);
// for (String s : inputTokens) {
// System.out.print(s + " ");
// }
// System.out.println("");
}
// StringBuilder builder = new StringBuilder();
// while (rowIter.hasNext()) {
// builder.append(((StringCell) (rowIter.next().getCell(seqColPos))).getStringValue());
// // for (String s : inputTokens) {
// // System.out.print(s + " ");
// // }
// // System.out.println("");
// }
container = exec.createDataContainer(outputSpec);
AlgoERMinerApplied algoERMiner = new AlgoERMinerApplied();
algoERMiner.runAlgorithm(minSup, minConf, database);
// algoTNS.writeResultTofile(".//output.txt");
algoERMiner.printStats();
// int rowCount = 0;
// while (rulesIter.hasNext()) {
// Rule rule = (Rule) rulesIter.next();
// RowKey key = new RowKey("Row " + rowCount);
// // the cells of the current row, the types of the cells must
// // match the column spec (see above)
// DataCell[] cells = new DataCell[3];
// cells[0] = new StringCell(rule.toString());
// cells[1] = new DoubleCell(rule.getAbsoluteSupport());
// cells[2] = new DoubleCell(rule.getConfidence());
// DataRow row = new DefaultRow(key, cells);
// container.addRowToTable(row);
//
// // check if the execution monitor was canceled
// exec.checkCanceled();
// exec.setProgress(rowCount / (double) rowNum, "Adding row "
// + rowCount);
// rowCount++;
// }
container.close();
BufferedDataTable out = container.getTable();
return new BufferedDataTable[] { out };
}
public static void addRowToOutput(int rowID, String rule, double absSupport, double confidence) {
RowKey key = new RowKey("Row " + rowID);
DataCell[] cells = new DataCell[3];
cells[0] = new StringCell(rule);
cells[1] = new DoubleCell(absSupport);
cells[2] = new DoubleCell(confidence);
DataRow row = new DefaultRow(key, cells);
container.addRowToTable(row);
}
/**
* {@inheritDoc}
*/
@Override
protected void reset() {
// TODO: generated method stub
}
/**
* {@inheritDoc}
*/
@Override
protected DataTableSpec[] configure(final DataTableSpec[] inSpecs)
throws InvalidSettingsException {
// TODO: generated method stub
return new DataTableSpec[]{null};
}
/**
* {@inheritDoc}
*/
@Override
protected void saveSettingsTo(final NodeSettingsWO settings) {
m_minSupSelection.saveSettingsTo(settings);
m_minConfSelection.saveSettingsTo(settings);
m_SeqColumnSelection.saveSettingsTo(settings);
}
/**
* {@inheritDoc}
*/
@Override
protected void loadValidatedSettingsFrom(final NodeSettingsRO settings)
throws InvalidSettingsException {
m_minSupSelection.loadSettingsFrom(settings);
m_minConfSelection.loadSettingsFrom(settings);
m_SeqColumnSelection.loadSettingsFrom(settings);
}
/**
* {@inheritDoc}
*/
@Override
protected void validateSettings(final NodeSettingsRO settings)
throws InvalidSettingsException {
m_minSupSelection.validateSettings(settings);
m_minConfSelection.validateSettings(settings);
m_SeqColumnSelection.validateSettings(settings);
}
/**
* {@inheritDoc}
*/
@Override
protected void loadInternals(final File internDir,
final ExecutionMonitor exec) throws IOException,
CanceledExecutionException {
// TODO: generated method stub
}
/**
* {@inheritDoc}
*/
@Override
protected void saveInternals(final File internDir,
final ExecutionMonitor exec) throws IOException,
CanceledExecutionException {
// TODO: generated method stub
}
/**
* Creation of the different Settings Models to communicate with the node
* dialog
*/
protected static SettingsModelString createSeqColumnModel() {
return new SettingsModelString("seq_column_selection", "POLYLINE");
}
protected static SettingsModelDoubleBounded createMinSupModel() {
return new SettingsModelDoubleBounded("min_sup_selection", 0.5, 0, 1);
}
protected static SettingsModelDoubleBounded createMinConfModel() {
return new SettingsModelDoubleBounded("min_conf_selection", 0.6, 0, 1);
}
}