code: def evaluate_post_training(
      self, edp: EvaluationDataPage
  ) -> CpeDetails:
      cpe_details = CpeDetails()
  
      cpe_details.reward_estimates = self.score_cpe("Reward", edp)
  
      if (
          self.metrics_to_score is not None
          and edp.logged_metrics is not None
          and self.action_names is not None
      ):
          for i, metric in enumerate(self.metrics_to_score):
              logger.info(
                  "--------- Running CPE on metric: {} ---------".format(
                      metric
                  )
              )
  
              metric_reward_edp = edp.set_metric_as_reward(
                  i, len(self.action_names)
              )
  
              cpe_details.metric_estimates[metric] = self.score_cpe(
                  metric, metric_reward_edp
              )
  
      if self.action_names is not None:
          if edp.optimal_q_values is not None:
              value_means = edp.optimal_q_values.mean(dim=0)
              cpe_details.q_value_means = {
                  action: float(value_means[i])
                  for i, action in enumerate(self.action_names)
              }
              # pyre-ignore [16]: `Optional` has no attribute `std`
              value_stds = edp.optimal_q_values.std(dim=0)
              cpe_details.q_value_stds = {
                  action: float(value_stds[i])
                  for i, action in enumerate(self.action_names)
              }
          if edp.eval_action_idxs is not None:
              cpe_details.action_distribution = {
                  # pyre-ignore [16]: `bool` has no attribute `sum`
                  action: float((edp.eval_action_idxs == i).sum())
                  # pyre-ignore [16]: `Optional` has no attribute `shape`
                  / edp.eval_action_idxs.shape[0]
                  for i, action in enumerate(self.action_names)
              }
      # pyre-fixme[16]: `Evaluator` has no attribute `notify_observers`.
      self.notify_observers(cpe_details=cpe_details)
      return cpe_details
  
file_path: ReAgent/reagent/evaluation/evaluator.py
imports: import logging
  from collections import Counter
  from typing import Dict, List, Optional
  import torch
  import torch.nn.functional
  from reagent.core.tracker import observable
  from reagent.evaluation.cpe import CpeDetails, CpeEstimateSet
  from reagent.evaluation.doubly_robust_estimator import DoublyRobustEstimator
  from reagent.evaluation.evaluation_data_page import EvaluationDataPage
  from reagent.evaluation.sequential_doubly_robust_estimator import SequentialDoublyRobustEstimator
  from reagent.evaluation.weighted_sequential_doubly_robust_estimator import WeightedSequentialDoublyRobustEstimator
label_desc: Use image node_id 2 for calling the Evaluator obj's underlying member method code with example usage: obj.evaluate_post_training(edp) and returns: cpe_details