class EvaluationUtil implements Serializable {

    public static TreeMap<Object, Double> extractLabelProbMap(Row row, TypeInformation labelType) {
        HashMap<String, Double> labelProbMap;
        final String detailStr = row.getField(1).toString();
        try {
            labelProbMap = JsonConverter.fromJson(detailStr,
                new TypeReference<HashMap<String, Double>>() {}.getType());
        } catch (Exception e) {
            throw new RuntimeException(
                String.format("Fail to deserialize detail column %s!", detailStr));
        }
        Collection<Double> probabilities = labelProbMap.values();
        probabilities.forEach(v ->
            Preconditions.checkArgument(v <= 1.0 && v >= 0,
                String.format("Probibality in %s not in range [0, 1]!", detailStr)));
        Preconditions.checkArgument(
            Math.abs(probabilities.stream().mapToDouble(Double::doubleValue).sum() - 1.0) < PROB_SUM_EPS,
            String.format("Probability sum in %s not equal to 1.0!", detailStr));
        TreeMap<Object, Double> castLabelProbMap = new TreeMap<>();
        for(Map.Entry<String, Double> entry : labelProbMap.entrySet()){
            castLabelProbMap.put(castTo(entry.getKey(), labelType), entry.getValue());
        }
        return castLabelProbMap;
    }

}