boolean canMeasureCPUTime = thMonitor.isThreadCpuTimeSupported();
if(!thMonitor.isThreadCpuTimeEnabled())
thMonitor.setThreadCpuTimeEnabled(true);
Object [] result = new Object[overall_length];
Evaluation eval = new Evaluation(train);
m_Classifier = AbstractClassifier.makeCopy(m_Template);
double [] predictions;
long thID = Thread.currentThread().getId();
long CPUStartTime=-1, trainCPUTimeElapsed=-1, testCPUTimeElapsed=-1,
trainTimeStart, trainTimeElapsed, testTimeStart, testTimeElapsed;
//training classifier
trainTimeStart = System.currentTimeMillis();
if(canMeasureCPUTime)
CPUStartTime = thMonitor.getThreadUserTime(thID);
m_Classifier.buildClassifier(train);
if(canMeasureCPUTime)
trainCPUTimeElapsed = thMonitor.getThreadUserTime(thID) - CPUStartTime;
trainTimeElapsed = System.currentTimeMillis() - trainTimeStart;
//testing classifier
testTimeStart = System.currentTimeMillis();
if(canMeasureCPUTime)
CPUStartTime = thMonitor.getThreadUserTime(thID);
predictions = eval.evaluateModel(m_Classifier, test);
if(canMeasureCPUTime)
testCPUTimeElapsed = thMonitor.getThreadUserTime(thID) - CPUStartTime;
testTimeElapsed = System.currentTimeMillis() - testTimeStart;
thMonitor = null;
m_result = eval.toSummaryString();
// The results stored are all per instance -- can be multiplied by the
// number of instances to get absolute numbers
int current = 0;
result[current++] = new Double(train.numInstances());
result[current++] = new Double(eval.numInstances());
result[current++] = new Double(eval.correct());
result[current++] = new Double(eval.incorrect());
result[current++] = new Double(eval.unclassified());
result[current++] = new Double(eval.pctCorrect());
result[current++] = new Double(eval.pctIncorrect());
result[current++] = new Double(eval.pctUnclassified());
result[current++] = new Double(eval.kappa());
result[current++] = new Double(eval.meanAbsoluteError());
result[current++] = new Double(eval.rootMeanSquaredError());
result[current++] = new Double(eval.relativeAbsoluteError());
result[current++] = new Double(eval.rootRelativeSquaredError());
result[current++] = new Double(eval.SFPriorEntropy());
result[current++] = new Double(eval.SFSchemeEntropy());
result[current++] = new Double(eval.SFEntropyGain());
result[current++] = new Double(eval.SFMeanPriorEntropy());
result[current++] = new Double(eval.SFMeanSchemeEntropy());
result[current++] = new Double(eval.SFMeanEntropyGain());
// K&B stats
result[current++] = new Double(eval.KBInformation());
result[current++] = new Double(eval.KBMeanInformation());
result[current++] = new Double(eval.KBRelativeInformation());
// IR stats
result[current++] = new Double(eval.truePositiveRate(m_IRclass));
result[current++] = new Double(eval.numTruePositives(m_IRclass));
result[current++] = new Double(eval.falsePositiveRate(m_IRclass));
result[current++] = new Double(eval.numFalsePositives(m_IRclass));
result[current++] = new Double(eval.trueNegativeRate(m_IRclass));
result[current++] = new Double(eval.numTrueNegatives(m_IRclass));
result[current++] = new Double(eval.falseNegativeRate(m_IRclass));
result[current++] = new Double(eval.numFalseNegatives(m_IRclass));
result[current++] = new Double(eval.precision(m_IRclass));
result[current++] = new Double(eval.recall(m_IRclass));
result[current++] = new Double(eval.fMeasure(m_IRclass));
result[current++] = new Double(eval.areaUnderROC(m_IRclass));
// Weighted IR stats
result[current++] = new Double(eval.weightedTruePositiveRate());
result[current++] = new Double(eval.weightedFalsePositiveRate());
result[current++] = new Double(eval.weightedTrueNegativeRate());
result[current++] = new Double(eval.weightedFalseNegativeRate());
result[current++] = new Double(eval.weightedPrecision());
result[current++] = new Double(eval.weightedRecall());
result[current++] = new Double(eval.weightedFMeasure());
result[current++] = new Double(eval.weightedAreaUnderROC());
// Unweighted IR stats
result[current++] = new Double(eval.unweightedMacroFmeasure());
result[current++] = new Double(eval.unweightedMicroFmeasure());
// Timing stats
result[current++] = new Double(trainTimeElapsed / 1000.0);
result[current++] = new Double(testTimeElapsed / 1000.0);
if(canMeasureCPUTime) {
result[current++] = new Double((trainCPUTimeElapsed/1000000.0) / 1000.0);
result[current++] = new Double((testCPUTimeElapsed /1000000.0) / 1000.0);
}
else {
result[current++] = new Double(Utils.missingValue());
result[current++] = new Double(Utils.missingValue());
}
// sizes
ByteArrayOutputStream bastream = new ByteArrayOutputStream();
ObjectOutputStream oostream = new ObjectOutputStream(bastream);
oostream.writeObject(m_Classifier);
result[current++] = new Double(bastream.size());
bastream = new ByteArrayOutputStream();
oostream = new ObjectOutputStream(bastream);
oostream.writeObject(train);
result[current++] = new Double(bastream.size());
bastream = new ByteArrayOutputStream();
oostream = new ObjectOutputStream(bastream);
oostream.writeObject(test);
result[current++] = new Double(bastream.size());
// Prediction interval statistics
result[current++] = new Double(eval.coverageOfTestCasesByPredictedRegions());
result[current++] = new Double(eval.sizeOfPredictedRegions());
// IDs
if (getAttributeID() >= 0){
String idsString = "";
if (test.attribute(m_attID).isNumeric()){