code: def run_metrics(self, data):
      if "all" in self.cfg.exp_domains:
          metric_results = []
          metric_result = self._get_metric_results(data)
          metric_results.append(metric_result)
  
          if self.cfg.eval_per_domain:
              # all domain experiments, sub domain evaluation
              domains = [d + "_single" for d in ontology.all_domains]
              domains = domains + [
                  "restaurant_train",
                  "restaurant_hotel",
                  "restaurant_attraction",
                  "hotel_train",
                  "hotel_attraction",
                  "attraction_train",
                  "restaurant_hotel_taxi",
                  "restaurant_attraction_taxi",
                  "hotel_attraction_taxi",
              ]
              for domain in domains:
                  file_list = self.domain_files.get(domain, [])
                  if not file_list:
                      print("No sub domain [%s]" % domain)
                  metric_result = self._get_metric_results(
                      data, domain, file_list
                  )
                  if metric_result:
                      metric_results.append(metric_result)
      else:
          # sub domain experiments
          metric_results = []
          for domain, file_list in self.domain_files.items():
              if domain not in self.cfg.exp_domains:
                  continue
              metric_result = self._get_metric_results(
                  data, domain, file_list
              )
              if metric_result:
                  metric_results.append(metric_result)
  
      return metric_results
  
imports: import math, logging, copy, json
  from collections import Counter, OrderedDict
  from nltk.util import ngrams
  from .None import ontology
  from .clean_dataset import clean_slot_values
label_desc: Use image node_id 4 for calling the MultiWozEvaluator obj's underlying member method code with example usage: obj.run_metrics(data) and returns: metric_results