code: def analyze_one_classification_result(storage_client, file_path,
                                        adv_batch, dataset_batches,
                                        dataset_meta):
    
    class_result = read_classification_results(storage_client, file_path)
    if class_result is None:
      return 0, 0, 0, 0
    adv_images = adv_batch['images']
    dataset_batch_images = (
        dataset_batches.data[adv_batch['dataset_batch_id']]['images'])
    count_correctly_classified = 0
    count_errors = 0
    count_hit_target_class = 0
    num_images = 0
    for adv_img_id, label in iteritems(class_result):
      if adv_img_id not in adv_images:
        continue
      num_images += 1
      clean_image_id = adv_images[adv_img_id]['clean_image_id']
      dataset_image_id = (
          dataset_batch_images[clean_image_id]['dataset_image_id'])
      if label == dataset_meta.get_true_label(dataset_image_id):
        count_correctly_classified += 1
      else:
        count_errors += 1
      if label == dataset_meta.get_target_class(dataset_image_id):
        count_hit_target_class += 1
    return (count_correctly_classified, count_errors,
            count_hit_target_class, num_images)
docs: Reads and analyzes one classification result.
  
    This method reads file with classification result and counts
    how many images were classified correctly and incorrectly,
    how many times target class was hit and total number of images.
  
    Args:
      storage_client: instance of CompetitionStorageClient
      file_path: result file path
      adv_batch: AversarialBatches.data[adv_batch_id]
        adv_batch_id is stored in each ClassificationBatch entity
      dataset_batches: instance of DatasetBatches
      dataset_meta: instance of DatasetMetadata
  
    Returns:
      Tuple of (count_correctly_classified, count_errors, count_hit_target_class,
      num_images)