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

Offical Documentation

Official Docs: