code: def print_results(
      results,
      random_counterpart=None,
      random_concepts=None,
      num_random_exp=100,
      min_p_val=0.05,
  ):
      """Helper function to organize results.
      If you ran TCAV with a random_counterpart, supply it here, otherwise supply random_concepts.
      If you get unexpected output, make sure you are using the correct keywords.
  
      Args:
        results: dictionary of results from TCAV runs.
        random_counterpart: name of the random_counterpart used, if it was used.
        random_concepts: list of random experiments that were run.
        num_random_exp: number of random experiments that were run.
        min_p_val: minimum p value for statistical significance
      """
  
      # helper function, returns if this is a random concept
      def is_random_concept(concept):
          if random_counterpart:
              return random_counterpart == concept
  
          elif random_concepts:
              return concept in random_concepts
  
          else:
              return "random500_" in concept
  
      # print class, it will be the same for all
      print("Class =", results[0]["target_class"])
  
      # prepare data
      # dict with keys of concepts containing dict with bottlenecks
      result_summary = {}
  
      # random
      random_i_ups = {}
  
      for result in results:
          if result["cav_concept"] not in result_summary:
              result_summary[result["cav_concept"]] = {}
  
          if (
              result["bottleneck"]
              not in result_summary[result["cav_concept"]]
          ):
              result_summary[result["cav_concept"]][
                  result["bottleneck"]
              ] = []
  
          result_summary[result["cav_concept"]][
              result["bottleneck"]
          ].append(result)
  
          # store random
          if is_random_concept(result["cav_concept"]):
              if result["bottleneck"] not in random_i_ups:
                  random_i_ups[result["bottleneck"]] = []
  
              random_i_ups[result["bottleneck"]].append(result["i_up"])
  
      # print concepts and classes with indentation
      for concept in result_summary:
          # if not random
          if not is_random_concept(concept):
              print(" ", "Concept =", concept)
  
              for bottleneck in result_summary[concept]:
                  i_ups = [
                      item["i_up"]
                      for item in result_summary[concept][bottleneck]
                  ]
  
                  # Calculate statistical significance
                  _, p_val = ttest_ind(random_i_ups[bottleneck], i_ups)
  
                  print(
                      3 * " ",
                      "Bottleneck =",
                      (
                          "%s. TCAV Score = %.2f (+- %.2f), "
                          "random was %.2f (+- %.2f). p-val = %.3f (%s)"
                      )
                      % (
                          bottleneck,
                          np.mean(i_ups),
                          np.std(i_ups),
                          np.mean(random_i_ups[bottleneck]),
                          np.std(random_i_ups[bottleneck]),
                          p_val,
                          "undefined"
                          if np.isnan(p_val)
                          else "not significant"
                          if p_val > min_p_val
                          else "significant",
                      ),
                  )
  
file_path: tcav/tcav/utils.py
imports: from scipy.stats import ttest_ind
  import numpy
  import tensorflow
  from tcav.tcav_results.results_pb2 import Result, Results
label_desc: Use image node_id 6 for calling a global function with example usage: print_results(results, random_counterpart, random_concepts, num_random_exp, min_p_val) and returns: unknown, unknown, unknown