Name
sn_rf.RFSimilarityEvaluator
Description
Evaluation script for Similarity Evalution type
Script
var RFSimilarityEvaluator = Class.create();
RFSimilarityEvaluator.prototype = Object.extendsObject(sn_rf.RFEvaluatorSNC, {
category: 'rf_evaluation_script', // DO NOT REMOVE THIS LINE!
getEvaluationOutputSchema: function(param) {
var rfLogger = new RFLogger('RFSimilarityEvaluator - getEvaluationOutputSchema');
var inputs = param.inputs;
var similarity = new RFSimilarityService(inputs.similarity_definition);
if (similarity.isSolutionDefValid()) {
var schema = [];
var metaData = {};
RFUtils.addToSchema(schema,
RFConstants.evaluationOutputNames.PREDICTED_RECORD,
RFConstants.evaluationOutputLabels.PREDICTED_RECORD,
RFConstants.evaluationOutputTypes.REFERENCE,
similarity.getTableName());
metaData['uniqueKey'] = [RFConstants.evaluationOutputNames.PREDICTED_RECORD];
RFUtils.addToSchema(schema,
RFConstants.evaluationOutputNames.CONFIDENCE_SCORE,
RFConstants.evaluationOutputLabels.CONFIDENCE_SCORE,
RFConstants.evaluationOutputTypes.STRING);
metaData['confidence'] = RFConstants.evaluationOutputNames.CONFIDENCE_SCORE;
RFUtils.addToSchema(schema,
RFConstants.feedbackTracking.SOLUTION,
RFConstants.feedbackTracking.SOLUTION,
RFConstants.evaluationOutputTypes.STRING);
RFUtils.addToSchema(schema,
RFConstants.feedbackTracking.POSITION,
RFConstants.feedbackTracking.POSITION,
RFConstants.evaluationOutputTypes.STRING);
RFUtils.addToSchema(schema,
RFConstants.feedbackTracking.QUERY,
RFConstants.feedbackTracking.QUERY,
RFConstants.evaluationOutputTypes.STRING);
RFUtils.addToSchema(schema,
RFConstants.feedbackTracking.PREDICTIONS,
RFConstants.feedbackTracking.PREDICTIONS,
RFConstants.evaluationOutputTypes.STRING);
metaData['hidden'] = [RFConstants.feedbackTracking.SOLUTION, RFConstants.feedbackTracking.POSITION,
RFConstants.feedbackTracking.QUERY, RFConstants.feedbackTracking.PREDICTIONS
];
return {
'status': RFConstants.SUCCESS,
'schema': schema,
'metaData': metaData
};
}
var errorDetails = new RFExceptionManager('INVALID_SIMILARITY_SOLUTION_DEFINITION');
rfLogger.logError('Solution definition ' + inputs.similarity_definition + ' is invalid');
return {
'status': RFConstants.ERROR,
'errorCode': errorDetails.getCode(),
'errorMessage': errorDetails.getMessage()
};
},
getEvaluationOutputs: function(param) {
var rfLogger = new RFLogger('RFSimilarityEvaluator - getEvaluationOutputs');
var inputs = param.inputs;
var evaluationOutputs = [];
var predictions = [];
var similarity = new RFSimilarityService(inputs.similarity_definition);
if (similarity.isSolutionDefValid()) {
var contextRecord = param.contextRecord;
var topN = parseInt(inputs.top_n_results);
var additionalParameters = {};
additionalParameters[RFConstants.mlPredictorOptions.TOP_N] = topN + 1;
predictions = similarity.getPredictions(contextRecord, additionalParameters);
rfLogger.logDebug('Similarity solution ' + inputs.similarity_definition +
' returned ' + predictions.length + ' predictions');
var solutionName = similarity.getSimilaritySolutionName();
var predictedSysIds = [];
for (var predictionIdx = 0; predictionIdx < predictions.length && evaluationOutputs.length < topN; predictionIdx++) {
var predictedValueSysId = predictions[predictionIdx].predictedValueSysId();
predictedSysIds.push(predictedValueSysId);
if (predictedValueSysId != contextRecord.sys_id) {
var evaluationOutput = {};
evaluationOutput[RFConstants.evaluationOutputNames.PREDICTED_RECORD] = predictedValueSysId;
evaluationOutput[RFConstants.evaluationOutputNames.CONFIDENCE_SCORE] = predictions[predictionIdx].confidence();
// Feedback tracking data for ATG have to add here because we drop records based on if comment above
evaluationOutput[RFConstants.feedbackTracking.POSITION] = predictionIdx;
evaluationOutputs.push(evaluationOutput);
}
}
// Add prediction set tracking data for ATG
var tableName = similarity.getTableName();
var fieldsString = similarity.getTestFields();
var fieldNames = gs.nil(fieldsString) ? [] : fieldsString.split(',');
var query = "";
for (var fi = 0; fi < fieldNames.length; fi++) {
var field = fieldNames[fi];
// Use value to avoid dot walk
query += contextRecord.getValue(field) + " ";
}
if (tableName && fieldNames) {
var resultSet = {};
resultSet[RFConstants.feedbackTracking.TABLE] = tableName;
resultSet[RFConstants.feedbackTracking.SYS_IDS] = predictedSysIds;
var predictionsSetString = JSON.stringify(resultSet);
for (var i = 0; i < evaluationOutputs.length; i++) {
evaluationOutputs[i][RFConstants.feedbackTracking.SOLUTION] = solutionName;
evaluationOutputs[i][RFConstants.feedbackTracking.QUERY] = query;
evaluationOutputs[i][RFConstants.feedbackTracking.PREDICTIONS] = predictionsSetString;
}
}
return {
'status': RFConstants.SUCCESS,
'evaluationOutputs': evaluationOutputs
};
}
var errorDetails = new RFExceptionManager('INVALID_SIMILARITY_SOLUTION_DEFINITION');
rfLogger.logError('Solution definition ' + inputs.similarity_definition + ' is invalid');
return {
'status': RFConstants.ERROR,
'errorCode': errorDetails.getCode(),
'errorMessage': errorDetails.getMessage()
};
},
type: 'RFSimilarityEvaluator'
});
Sys ID
e61ef007537230103953ddeeff7b12ed