docstr: [summary]
  
  Args:
      gold_instance_list (List[Dict]): List of Sentece, each sentence contains two List (offset, string) of Relation Tuple
          [
              {
                  'offset': [('Part-whole', 'Geo-political', (0,), 'Geo-political', (2,)), ... ],
                  'string': [('Part-whole', 'Geo-political', 'MULTAN', 'Geo-political', 'Pakistan'), ...]
              }
          ]
      pred_instance_list ([type]): List of Sentece, each sentence contains two List (offset, string) of Relation Tuple
          [
              {
                  'offset': [('Part-whole', 'Geo-political', (0,), 'Geo-political', (2,))],
                  'string': [('Part-whole', 'Geo-political', 'MULTAN', 'Geo-political', 'Pakistan')]
              }, ...
          ]
      verbose (bool, optional): Defaults to False.
      match_mode (string, optional): [description]. Defaults to `normal` .
  
  Returns:
      Dict: Result of Evaluation
          (offset, string) X (boundary, strict) X (gold, pred, tp, P, R, F1)
code: def eval_instance_list(
      gold_instance_list,
      pred_instance_list,
      verbose=False,
      match_mode="normal",
  ):
      """[summary]
  
      Args:
          gold_instance_list (List[Dict]): List of Sentece, each sentence contains two List (offset, string) of Relation Tuple
              [
                  {
                      'offset': [('Part-whole', 'Geo-political', (0,), 'Geo-political', (2,)), ... ],
                      'string': [('Part-whole', 'Geo-political', 'MULTAN', 'Geo-political', 'Pakistan'), ...]
                  }
              ]
          pred_instance_list ([type]): List of Sentece, each sentence contains two List (offset, string) of Relation Tuple
              [
                  {
                      'offset': [('Part-whole', 'Geo-political', (0,), 'Geo-political', (2,))],
                      'string': [('Part-whole', 'Geo-political', 'MULTAN', 'Geo-political', 'Pakistan')]
                  }, ...
              ]
          verbose (bool, optional): Defaults to False.
          match_mode (string, optional): [description]. Defaults to `normal` .
  
      Returns:
          Dict: Result of Evaluation
              (offset, string) X (boundary, strict) X (gold, pred, tp, P, R, F1)
      """
      # Span Boundary and Type
      metrics = {
          "offset": Metric(verbose=verbose, match_mode=match_mode),
          "string": Metric(verbose=verbose, match_mode=match_mode),
      }
      # Span Boundary Only
      boundary_metrics = {
          "offset": Metric(verbose=verbose, match_mode=match_mode),
          "string": Metric(verbose=verbose, match_mode=match_mode),
      }
      for pred, gold in zip(pred_instance_list, gold_instance_list):
          pre_string_tp, pre_offset_tp = (
              metrics["string"].tp,
              metrics["offset"].tp,
          )
  
          for eval_key in metrics:
              # Span Boundary and Type
              metrics[eval_key].count_instance(
                  gold_list=gold.get(eval_key, []),
                  pred_list=pred.get(eval_key, []),
              )
  
          post_string_tp, post_offset_tp = (
              metrics["string"].tp,
              metrics["offset"].tp,
          )
          if verbose and (
              post_offset_tp - pre_offset_tp
              != post_string_tp - pre_string_tp
          ):
              warning_tp_increment(
                  gold=gold, pred=pred, prefix="Relation Strict"
              )
  
          pre_string_tp, pre_offset_tp = (
              boundary_metrics["string"].tp,
              boundary_metrics["offset"].tp,
          )
  
          for eval_key in boundary_metrics:
              # Span Boundary Only
              boundary_metrics[eval_key].count_instance(
                  gold_list=[
                      (x[0], x[2], x[4]) for x in gold.get(eval_key, [])
                  ],
                  pred_list=[
                      (x[0], x[2], x[4]) for x in pred.get(eval_key, [])
                  ],
              )
          post_string_tp, post_offset_tp = (
              boundary_metrics["string"].tp,
              boundary_metrics["offset"].tp,
          )
          if (
              verbose
              and post_offset_tp - pre_offset_tp
              != post_string_tp - pre_string_tp
          ):
              warning_tp_increment(
                  gold=gold, pred=pred, prefix="Relation Boundary"
              )
  
      results = dict()
      for eval_key in metrics:
          results.update(
              metrics[eval_key].compute_f1(
                  prefix=eval_key + "-rel-strict-"
              )
          )
      for eval_key in boundary_metrics:
          results.update(
              boundary_metrics[eval_key].compute_f1(
                  prefix=eval_key + "-rel-boundary-"
              )
          )
      return results
  
imports: from collections import defaultdict
  from copy import deepcopy
  from typing import Dict, List
  import sys
label_desc: Use image node_id 3 for calling the RelationScorer obj's underlying member method code with example usage: obj.eval_instance_list(gold_instance_list, pred_instance_list, verbose, match_mode) and returns: results