pnMetrics function

Future pnMetrics(
  1. Map<String, List> metricMap,
  2. dynamic threatUUID
)

metrics calculation (positive, negative) based on algorithm

Implementation

Future pnMetrics(Map<String, List<dynamic>> metricMap, var threatUUID) async {
  var impactV = 0.0;
  var numerator = 0.0;
  var denominator = 0.0;
  var normalization = 0.0;


  var metric;
  var temp = [];
  //logger.i('indiC pnMetrics ${node.keys}');

  ///check exist metric of unique geiger threat uuid on metrics
  if(metricMap.containsKey(threatUUID)) {
    try {
      if (metricMap[threatUUID].toString() == temp.toString()) {
        return 0.0;
      }
      metric = metricMap[threatUUID]?.iterator;
    } catch (e) {
      //print('func224$e');
      logger.e('indiA pnMetrics 1 => ${e.toString()}');
      return 0.0;
    }

    try {
      ///loop metrics
      while (metric.moveNext()) {
        var impact = await metric.current['metric'];

        try {
          //logger.i('indiC pnMetrics getValue ${await metric.current['normal']}');
          var normalNode = await metric.current['normalization'];
          normalization = double.parse(normalNode);
        } catch (e) {
          logger.i('indiA pnMetrics getValue ${e.toString()}');
          continue;
        }

        ///Convert to double metric {'high': 1.0, 'medium': 0.5, 'low': 0.1}
        impactV = CoreValues.impactValues[impact.toLowerCase()]!;

  ///numerator= impact*normalization
  numerator +=  impactV * normalization;
  ///denominator=impact
  denominator += impactV;
  }

  var result = numerator / denominator;

  return result;

  } catch (e) {
  logger.e('indiA pnMetrics 2 => ${e.toString()}');
  return 0.0;
  }

  }else{
  return 0.0;
  }
}