use of org.knime.core.node.CanceledExecutionException in project knime-core by knime.
the class ThreadedTableBuilderNodeModel method execute.
/**
* {@inheritDoc}
*/
@Override
protected final BufferedDataTable[] execute(final BufferedDataTable[] data, final ExecutionContext exec) throws Exception {
final DataTableSpec[] outSpecs = prepareExecute(data);
// do some consistency checks to bail out as early as possible
if (outSpecs == null) {
throw new NullPointerException("Implementation Error: The " + "array of generated output table specs can't be null.");
}
if (outSpecs.length != getNrOutPorts()) {
throw new IllegalStateException("Implementation Error: Number of" + " provided DataTableSpecs doesn't match number of output" + " ports");
}
for (DataTableSpec outSpec : outSpecs) {
if (outSpec == null) {
throw new IllegalStateException("Implementation Error: The" + " generated output DataTableSpec is null.");
}
}
final List<Future<BufferedDataContainer[]>> futures = new ArrayList<Future<BufferedDataContainer[]>>();
final BufferedDataTable[] additionalTables = new BufferedDataTable[Math.max(0, data.length - 1)];
System.arraycopy(data, 1, additionalTables, 0, additionalTables.length);
final Callable<?> submitter = new Submitter(data, futures, outSpecs, exec);
try {
m_workers.runInvisible(submitter);
} catch (IllegalThreadStateException ex) {
// this node has not been started by a thread from a thread pool.
// This is odd, but may happen
submitter.call();
}
final BufferedDataTable[][] tempTables = new BufferedDataTable[outSpecs.length][futures.size()];
int k = 0;
for (Future<BufferedDataContainer[]> results : futures) {
try {
exec.checkCanceled();
} catch (CanceledExecutionException ex) {
for (Future<BufferedDataContainer[]> cancel : futures) {
cancel.cancel(true);
}
throw ex;
}
final BufferedDataContainer[] temp = results.get();
if ((temp == null) || (temp.length != getNrOutPorts())) {
throw new IllegalStateException("Invalid result. Execution " + "failed, reason: data is null or number " + "of outputs wrong.");
}
for (int i = 0; i < temp.length; i++) {
tempTables[i][k] = temp[i].getTable();
}
k++;
}
final BufferedDataTable[] resultTables = new BufferedDataTable[outSpecs.length];
for (int i = 0; i < resultTables.length; i++) {
resultTables[i] = exec.createConcatenateTable(exec, tempTables[i]);
}
return resultTables;
}
use of org.knime.core.node.CanceledExecutionException in project knime-core by knime.
the class DecTreePredictorNodeModel method execute.
/**
* {@inheritDoc}
*/
@Override
public PortObject[] execute(final PortObject[] inPorts, final ExecutionContext exec) throws CanceledExecutionException, Exception {
exec.setMessage("Decision Tree Predictor: Loading predictor...");
PMMLPortObject port = (PMMLPortObject) inPorts[INMODELPORT];
List<Node> models = port.getPMMLValue().getModels(PMMLModelType.TreeModel);
if (models.isEmpty()) {
String msg = "Decision Tree evaluation failed: " + "No tree model found.";
LOGGER.error(msg);
throw new RuntimeException(msg);
}
PMMLDecisionTreeTranslator trans = new PMMLDecisionTreeTranslator();
port.initializeModelTranslator(trans);
DecisionTree decTree = trans.getDecisionTree();
decTree.resetColorInformation();
BufferedDataTable inData = (BufferedDataTable) inPorts[INDATAPORT];
// get column with color information
String colorColumn = null;
for (DataColumnSpec s : inData.getDataTableSpec()) {
if (s.getColorHandler() != null) {
colorColumn = s.getName();
break;
}
}
decTree.setColorColumn(colorColumn);
exec.setMessage("Decision Tree Predictor: start execution.");
PortObjectSpec[] inSpecs = new PortObjectSpec[] { inPorts[0].getSpec(), inPorts[1].getSpec() };
DataTableSpec outSpec = createOutTableSpec(inSpecs);
BufferedDataContainer outData = exec.createDataContainer(outSpec);
long coveredPattern = 0;
long nrPattern = 0;
long rowCount = 0;
final long numberRows = inData.size();
exec.setMessage("Classifying...");
List<String> predictionValues = getPredictionStrings((PMMLPortObjectSpec) inPorts[INMODELPORT].getSpec());
for (DataRow thisRow : inData) {
DataCell cl = null;
LinkedHashMap<String, Double> classDistrib = null;
try {
Pair<DataCell, LinkedHashMap<DataCell, Double>> pair = decTree.getWinnerAndClasscounts(thisRow, inData.getDataTableSpec());
cl = pair.getFirst();
LinkedHashMap<DataCell, Double> classCounts = pair.getSecond();
classDistrib = getDistribution(classCounts);
if (coveredPattern < m_maxNumCoveredPattern.getIntValue()) {
// remember this one for HiLite support
decTree.addCoveredPattern(thisRow, inData.getDataTableSpec());
coveredPattern++;
} else {
// too many patterns for HiLite - at least remember color
decTree.addCoveredColor(thisRow, inData.getDataTableSpec());
}
nrPattern++;
} catch (Exception e) {
LOGGER.error("Decision Tree evaluation failed: " + e.getMessage());
throw e;
}
if (cl == null) {
LOGGER.error("Decision Tree evaluation failed: result empty");
throw new Exception("Decision Tree evaluation failed.");
}
DataCell[] newCells = new DataCell[outSpec.getNumColumns()];
int numInCells = thisRow.getNumCells();
for (int i = 0; i < numInCells; i++) {
newCells[i] = thisRow.getCell(i);
}
if (m_showDistribution.getBooleanValue()) {
assert predictionValues.size() >= newCells.length - 1 - numInCells : "Could not determine the prediction values: " + newCells.length + "; " + numInCells + "; " + predictionValues;
for (int i = numInCells; i < newCells.length - 1; i++) {
String predClass = predictionValues.get(i - numInCells);
if (classDistrib != null && classDistrib.get(predClass) != null) {
newCells[i] = new DoubleCell(classDistrib.get(predClass));
} else {
newCells[i] = new DoubleCell(0.0);
}
}
}
newCells[newCells.length - 1] = cl;
outData.addRowToTable(new DefaultRow(thisRow.getKey(), newCells));
rowCount++;
if (rowCount % 100 == 0) {
exec.setProgress(rowCount / (double) numberRows, "Classifying... Row " + rowCount + " of " + numberRows);
}
exec.checkCanceled();
}
if (coveredPattern < nrPattern) {
// let the user know that we did not store all available pattern
// for HiLiting.
this.setWarningMessage("Tree only stored first " + m_maxNumCoveredPattern.getIntValue() + " (of " + nrPattern + ") rows for HiLiting!");
}
outData.close();
m_decTree = decTree;
exec.setMessage("Decision Tree Predictor: end execution.");
return new BufferedDataTable[] { outData.getTable() };
}
use of org.knime.core.node.CanceledExecutionException in project knime-core by knime.
the class BinByDictionaryNodeModel method configure.
/**
* {@inheritDoc}
*/
@Override
protected DataTableSpec[] configure(final DataTableSpec[] inSpecs) throws InvalidSettingsException {
ColumnRearranger rearranger;
try {
rearranger = createColumnRearranger(inSpecs, null, null);
} catch (CanceledExecutionException e) {
throw new RuntimeException("Illegal table iteration in configure");
}
DataTableSpec outSpec = rearranger.createSpec();
return new DataTableSpec[] { outSpec };
}
use of org.knime.core.node.CanceledExecutionException in project knime-core by knime.
the class CreateBitVectorNodeModel method createSingleColumnRearranger.
private ColumnRearranger createSingleColumnRearranger(final DataTableSpec spec, final int colIdx, final ColumnType columnType, final BitVectorType vectorType) throws InvalidSettingsException {
// are taken from input spec (21 Sep 2006)
try {
final BitVectorCellFactory factory = getSingleColFactory(null, colIdx, spec, null, columnType, vectorType);
ColumnRearranger c = new ColumnRearranger(spec);
if (m_remove.getBooleanValue()) {
c.replace(factory, colIdx);
} else {
c.append(factory);
}
return c;
} catch (CanceledExecutionException e) {
// this shouldn't happen since we do not provide the data to perform the preprocessing
throw new RuntimeException(e);
}
}
use of org.knime.core.node.CanceledExecutionException in project knime-core by knime.
the class CellReplacerNodeModel method createColumnRearranger.
private ColumnRearranger createColumnRearranger(final DataTableSpec spec, final DataTableSpec dictSpec, final BufferedDataTable dictTable, final ExecutionMonitor dictionaryInitExec) throws InvalidSettingsException {
String targetCol = m_targetColModel.getStringValue();
if (targetCol == null || targetCol.length() == 0) {
throw new InvalidSettingsException("No target column selected");
}
final int targetColIndex = spec.findColumnIndex(targetCol);
if (targetColIndex < 0) {
throw new InvalidSettingsException("No such column \"" + targetCol + "\"");
}
final DataColumnSpec targetColSpec = spec.getColumnSpec(targetColIndex);
final int dictInputColIndex = dictSpec.findColumnIndex(m_dictInputColModel.getStringValue());
final boolean dictInputIsCollection;
if (m_dictInputColModel.useRowID()) {
dictInputIsCollection = false;
} else if (dictInputColIndex < 0) {
throw new InvalidSettingsException("No such column \"" + m_dictInputColModel.getStringValue() + "\"");
} else {
DataColumnSpec inS = dictSpec.getColumnSpec(dictInputColIndex);
dictInputIsCollection = inS.getType().isCollectionType();
}
final int dictOutputColIndex = dictSpec.findColumnIndex(m_dictOutputColModel.getStringValue());
final DataType dictOutputColType;
if (m_dictOutputColModel.useRowID()) {
dictOutputColType = StringCell.TYPE;
} else {
if (dictOutputColIndex < 0) {
throw new InvalidSettingsException("No such column \"" + m_dictOutputColModel.getStringValue() + "\"");
}
dictOutputColType = dictSpec.getColumnSpec(dictOutputColIndex).getType();
}
final NoMatchPolicy noMatchPolicy = getNoMatchPolicy();
DataType outputType;
switch(noMatchPolicy) {
case Input:
outputType = DataType.getCommonSuperType(dictOutputColType, targetColSpec.getType());
break;
default:
outputType = dictOutputColType;
}
String newColName;
if (m_appendColumnModel.getBooleanValue()) {
String newName = m_appendColumnNameModel.getStringValue();
if (newName == null || newName.length() == 0) {
throw new InvalidSettingsException("No new column name given");
}
newColName = DataTableSpec.getUniqueColumnName(spec, newName);
} else {
newColName = targetColSpec.getName();
}
DataColumnSpecCreator replaceSpecCreator = new DataColumnSpecCreator(newColName, outputType);
CellFactory c = new SingleCellFactory(replaceSpecCreator.createSpec()) {
private Map<DataCell, DataCell> m_dictionaryMap;
@Override
public DataCell getCell(final DataRow row) {
try {
ensureInitDictionaryMap();
} catch (CanceledExecutionException e) {
// cancellation done by the framework
return DataType.getMissingCell();
}
DataCell cell = row.getCell(targetColIndex);
DataCell output = m_dictionaryMap.get(cell);
if (output == null) {
switch(noMatchPolicy) {
case Input:
return cell;
default:
return DataType.getMissingCell();
}
}
return output;
}
private void ensureInitDictionaryMap() throws CanceledExecutionException {
if (m_dictionaryMap == null) {
m_dictionaryMap = new HashMap<DataCell, DataCell>();
int i = 0;
double rowCount = dictTable.size();
for (DataRow r : dictTable) {
dictionaryInitExec.setProgress((i++) / rowCount, "Reading dictionary into memory, row " + i);
dictionaryInitExec.checkCanceled();
DataCell output = dictOutputColIndex < 0 ? new StringCell(r.getKey().getString()) : r.getCell(dictOutputColIndex);
DataCell input = dictInputColIndex < 0 ? new StringCell(r.getKey().getString()) : r.getCell(dictInputColIndex);
if (input.isMissing()) {
addSearchPair(input, output);
} else if (dictInputIsCollection) {
CollectionDataValue v = (CollectionDataValue) input;
for (DataCell element : v) {
addSearchPair(element, output);
}
} else {
addSearchPair(input, output);
}
}
}
}
private void addSearchPair(final DataCell input, final DataCell output) {
if (m_dictionaryMap.put(input, output) != null) {
setWarningMessage("Duplicate search key \"" + input + "\"");
}
}
};
ColumnRearranger result = new ColumnRearranger(spec);
if (m_appendColumnModel.getBooleanValue()) {
result.append(c);
} else {
result.replace(c, targetColIndex);
}
return result;
}
Aggregations